From 4bf3896b0478e178e9e53971f3b8278e898ad1af Mon Sep 17 00:00:00 2001
From: llaffont <llaffont@git-test.afi-sa.fr>
Date: Thu, 12 Apr 2012 09:18:08 +0000
Subject: [PATCH] MAJ Amber

---
 .gitattributes                            |    1 +
 amber/src/js/Benchfib.deploy.js           |   40 +-
 amber/src/js/Benchfib.js                  |   50 +-
 amber/src/js/Canvas.deploy.js             | 1848 ++++----
 amber/src/js/Canvas.js                    | 3204 ++++++-------
 amber/src/js/Compiler.deploy.js           | 1720 +++----
 amber/src/js/Compiler.js                  | 2760 +++++------
 amber/src/js/Examples.deploy.js           |   12 +-
 amber/src/js/Examples.js                  |   20 +-
 amber/src/js/IDE.deploy.js                | 3008 ++++++------
 amber/src/js/IDE.js                       | 4730 +++++++++----------
 amber/src/js/Kernel-Classes.deploy.js     |  497 +-
 amber/src/js/Kernel-Classes.js            |  791 ++--
 amber/src/js/Kernel-Collections.deploy.js | 3077 ++++++------
 amber/src/js/Kernel-Collections.js        | 5135 +++++++++++----------
 amber/src/js/Kernel-Exceptions.deploy.js  |  122 +-
 amber/src/js/Kernel-Exceptions.js         |  134 +-
 amber/src/js/Kernel-Methods.deploy.js     |  442 +-
 amber/src/js/Kernel-Methods.js            |  704 +--
 amber/src/js/Kernel-Objects.deploy.js     | 2949 ++++++------
 amber/src/js/Kernel-Objects.js            | 4986 ++++++++++----------
 amber/src/js/Kernel-Tests.deploy.js       | 1458 +++---
 amber/src/js/Kernel-Tests.js              | 2088 +++++----
 amber/src/js/Kernel-Transcript.deploy.js  |  114 +-
 amber/src/js/Kernel-Transcript.js         |  178 +-
 amber/src/js/SUnit.deploy.js              |  224 +-
 amber/src/js/SUnit.js                     |  404 +-
 amber/src/js/amber.js                     |   17 +-
 amber/src/js/init.js                      |    2 +-
 amber/src/st/Benchfib.st                  |   44 +-
 amber/src/st/Canvas.st                    |  942 ++--
 amber/src/st/Compiler-Tests.st            |  471 ++
 amber/src/st/Compiler.st                  | 1593 +++----
 amber/src/st/Examples.st                  |   10 +-
 amber/src/st/IDE.st                       | 2582 +++++------
 amber/src/st/Kernel-Announcements.st      |    4 +-
 amber/src/st/Kernel-Classes.st            |  219 +-
 amber/src/st/Kernel-Collections.st        | 2133 ++++-----
 amber/src/st/Kernel-Exceptions.st         |   46 +-
 amber/src/st/Kernel-Methods.st            |  302 +-
 amber/src/st/Kernel-Objects.st            | 1952 ++++----
 amber/src/st/Kernel-Tests.st              | 1114 ++---
 amber/src/st/Kernel-Transcript.st         |   76 +-
 amber/src/st/SUnit.st                     |  106 +-
 44 files changed, 26655 insertions(+), 25654 deletions(-)
 create mode 100644 amber/src/st/Compiler-Tests.st

diff --git a/.gitattributes b/.gitattributes
index 71c51f7976c..8c09755e2f8 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -225,6 +225,7 @@ amber/src/server/Makefile -text
 amber/src/server/server.js -text
 amber/src/st/Benchfib.st -text
 amber/src/st/Canvas.st -text
+amber/src/st/Compiler-Tests.st -text
 amber/src/st/Compiler.st -text
 amber/src/st/Documentation.st -text
 amber/src/st/Examples.st -text
diff --git a/amber/src/js/Benchfib.deploy.js b/amber/src/js/Benchfib.deploy.js
index da0e958a390..e5582a865a9 100644
--- a/amber/src/js/Benchfib.deploy.js
+++ b/amber/src/js/Benchfib.deploy.js
@@ -44,26 +44,6 @@ return self;}
 }),
 smalltalk.Number);
 
-smalltalk.addMethod(
-unescape('_tinyBenchmarks'),
-smalltalk.method({
-selector: unescape('tinyBenchmarks'),
-fn: function (){
-var self=this;
-var t1=nil;
-var t2=nil;
-var r=nil;
-var n1=nil;
-var n2=nil;
-(n1=(1));
-(function(){while((function(){(t1=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return smalltalk.send(n1, "_benchmark", []);})]));return ((($receiver = t1).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]));})()) {(function(){return (n1=((($receiver = n1).klass === smalltalk.Number) ? $receiver *(2) : smalltalk.send($receiver, "__star", [(2)])));})()}})();
-(n2=(16));
-(function(){while((function(){(t2=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return (r=smalltalk.send(n2, "_benchFib", []));})]));return ((($receiver = t2).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]));})()) {(function(){return (n2=((($receiver = n2).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(((($receiver = ((($receiver = ((($receiver = n1).klass === smalltalk.Number) ? $receiver *(500000) : smalltalk.send($receiver, "__star", [(500000)]))).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)]))).klass === smalltalk.Number) ? $receiver /t1 : smalltalk.send($receiver, "__slash", [t1])), "_printString", []), "__comma", [unescape("%20bytecodes/sec%3B%20")]), "__comma", [smalltalk.send(((($receiver = ((($receiver = r).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)]))).klass === smalltalk.Number) ? $receiver /t2 : smalltalk.send($receiver, "__slash", [t2])), "_printString", [])]), "__comma", [unescape("%20sends/sec")]);
-return self;}
-}),
-smalltalk.Number);
-
 smalltalk.addMethod(
 unescape('_jsbenchFib'),
 smalltalk.method({
@@ -130,3 +110,23 @@ return self;}
 }),
 smalltalk.Number);
 
+smalltalk.addMethod(
+unescape('_tinyBenchmarks'),
+smalltalk.method({
+selector: unescape('tinyBenchmarks'),
+fn: function (){
+var self=this;
+var t1=nil;
+var t2=nil;
+var r=nil;
+var n1=nil;
+var n2=nil;
+(n1=(1));
+(function(){while((function(){(t1=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return smalltalk.send(n1, "_benchmark", []);})]));return ((($receiver = t1).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]));})()) {(function(){return (n1=((($receiver = n1).klass === smalltalk.Number) ? $receiver *(2) : smalltalk.send($receiver, "__star", [(2)])));})()}})();
+(n2=(16));
+(function(){while((function(){(t2=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return (r=smalltalk.send(n2, "_benchFib", []));})]));return ((($receiver = t2).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]));})()) {(function(){return (n2=((($receiver = n2).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(((($receiver = ((($receiver = ((($receiver = n1).klass === smalltalk.Number) ? $receiver *(500000) : smalltalk.send($receiver, "__star", [(500000)]))).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)]))).klass === smalltalk.Number) ? $receiver /t1 : smalltalk.send($receiver, "__slash", [t1])), "_printString", []), "__comma", [unescape("%20bytecodes/sec%3B%20")]), "__comma", [smalltalk.send(((($receiver = ((($receiver = r).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)]))).klass === smalltalk.Number) ? $receiver /t2 : smalltalk.send($receiver, "__slash", [t2])), "_printString", [])]), "__comma", [unescape("%20sends/sec")]);
+return self;}
+}),
+smalltalk.Number);
+
diff --git a/amber/src/js/Benchfib.js b/amber/src/js/Benchfib.js
index 550d7334745..4789ccbdefe 100755
--- a/amber/src/js/Benchfib.js
+++ b/amber/src/js/Benchfib.js
@@ -59,31 +59,6 @@ referencedClasses: ["Array"]
 }),
 smalltalk.Number);
 
-smalltalk.addMethod(
-unescape('_tinyBenchmarks'),
-smalltalk.method({
-selector: unescape('tinyBenchmarks'),
-category: '*Benchfib',
-fn: function (){
-var self=this;
-var t1=nil;
-var t2=nil;
-var r=nil;
-var n1=nil;
-var n2=nil;
-(n1=(1));
-(function(){while((function(){(t1=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return smalltalk.send(n1, "_benchmark", []);})]));return ((($receiver = t1).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]));})()) {(function(){return (n1=((($receiver = n1).klass === smalltalk.Number) ? $receiver *(2) : smalltalk.send($receiver, "__star", [(2)])));})()}})();
-(n2=(16));
-(function(){while((function(){(t2=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return (r=smalltalk.send(n2, "_benchFib", []));})]));return ((($receiver = t2).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]));})()) {(function(){return (n2=((($receiver = n2).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(((($receiver = ((($receiver = ((($receiver = n1).klass === smalltalk.Number) ? $receiver *(500000) : smalltalk.send($receiver, "__star", [(500000)]))).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)]))).klass === smalltalk.Number) ? $receiver /t1 : smalltalk.send($receiver, "__slash", [t1])), "_printString", []), "__comma", [unescape("%20bytecodes/sec%3B%20")]), "__comma", [smalltalk.send(((($receiver = ((($receiver = r).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)]))).klass === smalltalk.Number) ? $receiver /t2 : smalltalk.send($receiver, "__slash", [t2])), "_printString", [])]), "__comma", [unescape("%20sends/sec")]);
-return self;},
-args: [],
-source: unescape('tinyBenchmarks%20%0A%09%22Report%20the%20results%20of%20running%20the%20two%20tiny%20Squeak%20benchmarks.%0A%09ar%209/10/1999%3A%20Adjusted%20to%20run%20at%20least%201%20sec%20to%20get%20more%20stable%20results%22%0A%09%220%20tinyBenchmarks%22%0A%09%22On%20a%20292%20MHz%20G3%20Mac%3A%2022727272%20bytecodes/sec%3B%20984169%20sends/sec%22%0A%09%22On%20a%20400%20MHz%20PII/Win98%3A%20%2018028169%20bytecodes/sec%3B%201081272%20sends/sec%22%0A%09%7C%20t1%20t2%20r%20n1%20n2%20%7C%0A%09n1%20%3A%3D%201.%0A%09%5Bt1%20%3A%3D%20Date%20millisecondsToRun%3A%20%5Bn1%20benchmark%5D.%0A%09t1%20%3C%201000%5D%20whileTrue%3A%5Bn1%20%3A%3D%20n1%20*%202%5D.%20%22Note%3A%20%23benchmark%27s%20runtime%20is%20about%20O%28n%29%22%0A%0A%09n2%20%3A%3D%2016.%0A%09%5Bt2%20%3A%3D%20Date%20millisecondsToRun%3A%20%5Br%20%3A%3D%20n2%20benchFib%5D.%0A%09t2%20%3C%201000%5D%20whileTrue%3A%5Bn2%20%3A%3D%20n2%20+%201%5D.%20%0A%09%22Note%3A%20%23benchFib%27s%20runtime%20is%20about%20O%28k%5En%29%2C%0A%09%09where%20k%20is%20the%20golden%20number%20%3D%20%281%20+%205%20sqrt%29%20/%202%20%3D%201.618....%22%0A%0A%09%5E%20%28%28n1%20*%20500000%20*%201000%29%20/%20t1%29%20printString%2C%20%27%20bytecodes/sec%3B%20%27%2C%0A%09%20%20%28%28r%20*%201000%29%20/%20t2%29%20printString%2C%20%27%20sends/sec%27'),
-messageSends: ["whileTrue:", "millisecondsToRun:", "benchmark", unescape("%3C"), unescape("*"), "benchFib", unescape("+"), unescape("%2C"), "printString", unescape("/")],
-referencedClasses: ["Date"]
-}),
-smalltalk.Number);
-
 smalltalk.addMethod(
 unescape('_jsbenchFib'),
 smalltalk.method({
@@ -165,3 +140,28 @@ referencedClasses: ["Date"]
 }),
 smalltalk.Number);
 
+smalltalk.addMethod(
+unescape('_tinyBenchmarks'),
+smalltalk.method({
+selector: unescape('tinyBenchmarks'),
+category: '*Benchfib',
+fn: function (){
+var self=this;
+var t1=nil;
+var t2=nil;
+var r=nil;
+var n1=nil;
+var n2=nil;
+(n1=(1));
+(function(){while((function(){(t1=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return smalltalk.send(n1, "_benchmark", []);})]));return ((($receiver = t1).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]));})()) {(function(){return (n1=((($receiver = n1).klass === smalltalk.Number) ? $receiver *(2) : smalltalk.send($receiver, "__star", [(2)])));})()}})();
+(n2=(16));
+(function(){while((function(){(t2=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return (r=smalltalk.send(n2, "_benchFib", []));})]));return ((($receiver = t2).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]));})()) {(function(){return (n2=((($receiver = n2).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(((($receiver = ((($receiver = ((($receiver = n1).klass === smalltalk.Number) ? $receiver *(500000) : smalltalk.send($receiver, "__star", [(500000)]))).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)]))).klass === smalltalk.Number) ? $receiver /t1 : smalltalk.send($receiver, "__slash", [t1])), "_printString", []), "__comma", [unescape("%20bytecodes/sec%3B%20")]), "__comma", [smalltalk.send(((($receiver = ((($receiver = r).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)]))).klass === smalltalk.Number) ? $receiver /t2 : smalltalk.send($receiver, "__slash", [t2])), "_printString", [])]), "__comma", [unescape("%20sends/sec")]);
+return self;},
+args: [],
+source: unescape('tinyBenchmarks%20%0A%09%22Report%20the%20results%20of%20running%20the%20two%20tiny%20Squeak%20benchmarks.%0A%09ar%209/10/1999%3A%20Adjusted%20to%20run%20at%20least%201%20sec%20to%20get%20more%20stable%20results%22%0A%09%220%20tinyBenchmarks%22%0A%09%22On%20a%20292%20MHz%20G3%20Mac%3A%2022727272%20bytecodes/sec%3B%20984169%20sends/sec%22%0A%09%22On%20a%20400%20MHz%20PII/Win98%3A%20%2018028169%20bytecodes/sec%3B%201081272%20sends/sec%22%0A%09%7C%20t1%20t2%20r%20n1%20n2%20%7C%0A%09n1%20%3A%3D%201.%0A%09%5Bt1%20%3A%3D%20Date%20millisecondsToRun%3A%20%5Bn1%20benchmark%5D.%0A%09t1%20%3C%201000%5D%20whileTrue%3A%5Bn1%20%3A%3D%20n1%20*%202%5D.%20%22Note%3A%20%23benchmark%27s%20runtime%20is%20about%20O%28n%29%22%0A%0A%09n2%20%3A%3D%2016.%0A%09%5Bt2%20%3A%3D%20Date%20millisecondsToRun%3A%20%5Br%20%3A%3D%20n2%20benchFib%5D.%0A%09t2%20%3C%201000%5D%20whileTrue%3A%5Bn2%20%3A%3D%20n2%20+%201%5D.%20%0A%09%22Note%3A%20%23benchFib%27s%20runtime%20is%20about%20O%28k%5En%29%2C%0A%09%09where%20k%20is%20the%20golden%20number%20%3D%20%281%20+%205%20sqrt%29%20/%202%20%3D%201.618....%22%0A%0A%09%5E%20%28%28n1%20*%20500000%20*%201000%29%20/%20t1%29%20printString%2C%20%27%20bytecodes/sec%3B%20%27%2C%0A%09%20%20%28%28r%20*%201000%29%20/%20t2%29%20printString%2C%20%27%20sends/sec%27'),
+messageSends: ["whileTrue:", "millisecondsToRun:", "benchmark", unescape("%3C"), unescape("*"), "benchFib", unescape("+"), unescape("%2C"), "printString", unescape("/")],
+referencedClasses: ["Date"]
+}),
+smalltalk.Number);
+
diff --git a/amber/src/js/Canvas.deploy.js b/amber/src/js/Canvas.deploy.js
index e7064a222cf..cf2d2c346a3 100644
--- a/amber/src/js/Canvas.deploy.js
+++ b/amber/src/js/Canvas.deploy.js
@@ -1,2114 +1,2078 @@
 smalltalk.addPackage('Canvas', {});
-smalltalk.addClass('Widget', smalltalk.Object, [], 'Canvas');
-smalltalk.addMethod(
-unescape('_appendToBrush_'),
-smalltalk.method({
-selector: unescape('appendToBrush%3A'),
-fn: function (aTagBrush){
-var self=this;
-smalltalk.send(self, "_appendToJQuery_", [smalltalk.send(aTagBrush, "_asJQuery", [])]);
-return self;}
-}),
-smalltalk.Widget);
-
-smalltalk.addMethod(
-unescape('_appendToJQuery_'),
-smalltalk.method({
-selector: unescape('appendToJQuery%3A'),
-fn: function (aJQuery){
-var self=this;
-smalltalk.send(self, "_renderOn_", [smalltalk.send((smalltalk.HTMLCanvas || HTMLCanvas), "_onJQuery_", [aJQuery])]);
-return self;}
-}),
-smalltalk.Widget);
-
-smalltalk.addMethod(
-unescape('_renderOn_'),
-smalltalk.method({
-selector: unescape('renderOn%3A'),
-fn: function (html){
-var self=this;
-self;
-return self;}
-}),
-smalltalk.Widget);
-
-
-
-smalltalk.addClass('TagBrush', smalltalk.Object, ['canvas', 'element'], 'Canvas');
+smalltalk.addClass('HTMLCanvas', smalltalk.Object, ['root'], 'Canvas');
 smalltalk.addMethod(
-unescape('_element'),
+unescape('_a'),
 smalltalk.method({
-selector: unescape('element'),
+selector: unescape('a'),
 fn: function (){
 var self=this;
-return self['@element'];
-return self;}
-}),
-smalltalk.TagBrush);
-
-smalltalk.addMethod(
-unescape('_contents_'),
-smalltalk.method({
-selector: unescape('contents%3A'),
-fn: function (anObject){
-var self=this;
-(function($rec){smalltalk.send($rec, "_empty", []);return smalltalk.send($rec, "_append_", [anObject]);})(self);
+return smalltalk.send(self, "_tag_", ["a"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_addBrush_'),
+unescape('_abbr'),
 smalltalk.method({
-selector: unescape('addBrush%3A'),
-fn: function (aTagBrush){
+selector: unescape('abbr'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_appendChild_", [smalltalk.send(aTagBrush, "_element", [])]);
-return aTagBrush;
+return smalltalk.send(self, "_tag_", ["abbr"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_with_'),
+unescape('_address'),
 smalltalk.method({
-selector: unescape('with%3A'),
-fn: function (anObject){
+selector: unescape('address'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_append_", [anObject]);
+return smalltalk.send(self, "_tag_", ["address"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_append_'),
+unescape('_area'),
 smalltalk.method({
-selector: unescape('append%3A'),
-fn: function (anObject){
+selector: unescape('area'),
+fn: function (){
 var self=this;
-smalltalk.send(anObject, "_appendToBrush_", [self]);
+return smalltalk.send(self, "_tag_", ["area"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_appendToBrush_'),
+unescape('_article'),
 smalltalk.method({
-selector: unescape('appendToBrush%3A'),
-fn: function (aTagBrush){
+selector: unescape('article'),
+fn: function (){
 var self=this;
-smalltalk.send(aTagBrush, "_addBrush_", [self]);
+return smalltalk.send(self, "_tag_", ["article"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_appendBlock_'),
+unescape('_aside'),
 smalltalk.method({
-selector: unescape('appendBlock%3A'),
-fn: function (aBlock){
+selector: unescape('aside'),
+fn: function (){
 var self=this;
-var root=nil;
-(root=smalltalk.send(self['@canvas'], "_root", []));
-smalltalk.send(self['@canvas'], "_root_", [self]);
-smalltalk.send(aBlock, "_value_", [self['@canvas']]);
-smalltalk.send(self['@canvas'], "_root_", [root]);
+return smalltalk.send(self, "_tag_", ["aside"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_appendChild_'),
+unescape('_audio'),
 smalltalk.method({
-selector: unescape('appendChild%3A'),
-fn: function (anElement){
+selector: unescape('audio'),
+fn: function (){
 var self=this;
-var element=self['@element'];
- 	if (null == element.canHaveChildren || element.canHaveChildren) {
-		element.appendChild(anElement);
- 	} else {
- 		element.text = String(element.text) +  anElement.innerHTML;
- 	} ;
+return smalltalk.send(self, "_tag_", ["audio"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_appendString_'),
+unescape('_base'),
 smalltalk.method({
-selector: unescape('appendString%3A'),
-fn: function (aString){
+selector: unescape('base'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_appendChild_", [smalltalk.send(self, "_createTextNodeFor_", [aString])]);
+return smalltalk.send(self, "_tag_", ["base"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_empty'),
+unescape('_blockquote'),
 smalltalk.method({
-selector: unescape('empty'),
+selector: unescape('blockquote'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_empty", []);
+return smalltalk.send(self, "_tag_", ["blockquote"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_body'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-fn: function (aString, aValue){
+selector: unescape('body'),
+fn: function (){
 var self=this;
-self['@element'].setAttribute(aString, aValue);
+return smalltalk.send(self, "_tag_", ["body"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_removeAt_'),
+unescape('_br'),
 smalltalk.method({
-selector: unescape('removeAt%3A'),
-fn: function (aString){
+selector: unescape('br'),
+fn: function (){
 var self=this;
-self['@element'].removeAttribute(aString);
+return smalltalk.send(self, "_tag_", ["br"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_class_'),
+unescape('_button'),
 smalltalk.method({
-selector: unescape('class%3A'),
-fn: function (aString){
+selector: unescape('button'),
+fn: function (){
 var self=this;
-self['@element'].className = aString;
+return smalltalk.send(self, "_tag_", ["button"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_id_'),
+unescape('_canvas'),
 smalltalk.method({
-selector: unescape('id%3A'),
-fn: function (aString){
+selector: unescape('canvas'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["id", aString]);
+return smalltalk.send(self, "_tag_", ["canvas"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_src_'),
+unescape('_caption'),
 smalltalk.method({
-selector: unescape('src%3A'),
-fn: function (aString){
+selector: unescape('caption'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["src", aString]);
+return smalltalk.send(self, "_tag_", ["caption"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_href_'),
+unescape('_cite'),
 smalltalk.method({
-selector: unescape('href%3A'),
-fn: function (aString){
+selector: unescape('cite'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["href", aString]);
+return smalltalk.send(self, "_tag_", ["cite"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_title_'),
+unescape('_code'),
 smalltalk.method({
-selector: unescape('title%3A'),
-fn: function (aString){
+selector: unescape('code'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["title", aString]);
+return smalltalk.send(self, "_tag_", ["code"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_style_'),
+unescape('_col'),
 smalltalk.method({
-selector: unescape('style%3A'),
-fn: function (aString){
+selector: unescape('col'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["style", aString]);
+return smalltalk.send(self, "_tag_", ["col"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_type_'),
+unescape('_colgroup'),
 smalltalk.method({
-selector: unescape('type%3A'),
-fn: function (aString){
+selector: unescape('colgroup'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["type", aString]);
+return smalltalk.send(self, "_tag_", ["colgroup"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_media_'),
+unescape('_command'),
 smalltalk.method({
-selector: unescape('media%3A'),
-fn: function (aString){
+selector: unescape('command'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["media", aString]);
+return smalltalk.send(self, "_tag_", ["command"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_rel_'),
+unescape('_datalist'),
 smalltalk.method({
-selector: unescape('rel%3A'),
-fn: function (aString){
+selector: unescape('datalist'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["rel", aString]);
+return smalltalk.send(self, "_tag_", ["datalist"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_width_'),
+unescape('_dd'),
 smalltalk.method({
-selector: unescape('width%3A'),
-fn: function (aString){
+selector: unescape('dd'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["width", aString]);
+return smalltalk.send(self, "_tag_", ["dd"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_height_'),
+unescape('_del'),
 smalltalk.method({
-selector: unescape('height%3A'),
-fn: function (aString){
+selector: unescape('del'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["height", aString]);
+return smalltalk.send(self, "_tag_", ["del"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_value_'),
+unescape('_details'),
 smalltalk.method({
-selector: unescape('value%3A'),
-fn: function (aString){
+selector: unescape('details'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["value", aString]);
+return smalltalk.send(self, "_tag_", ["details"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_asJQuery'),
+unescape('_div'),
 smalltalk.method({
-selector: unescape('asJQuery'),
+selector: unescape('div'),
 fn: function (){
 var self=this;
-return smalltalk.send((typeof window == 'undefined' ? nil : window), "_jQuery_", [smalltalk.send(self, "_element", [])]);
+return smalltalk.send(self, "_tag_", ["div"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onKeyDown_'),
+unescape('_div_'),
 smalltalk.method({
-selector: unescape('onKeyDown%3A'),
+selector: unescape('div%3A'),
 fn: function (aBlock){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keydown", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_div", []), "_with_", [aBlock]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onKeyPress_'),
+unescape('_dl'),
 smalltalk.method({
-selector: unescape('onKeyPress%3A'),
-fn: function (aBlock){
+selector: unescape('dl'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keypress", aBlock]);
+return smalltalk.send(self, "_tag_", ["dl"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onKeyUp_'),
+unescape('_dt'),
 smalltalk.method({
-selector: unescape('onKeyUp%3A'),
-fn: function (aBlock){
+selector: unescape('dt'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keyup", aBlock]);
+return smalltalk.send(self, "_tag_", ["dt"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onFocus_'),
+unescape('_em'),
 smalltalk.method({
-selector: unescape('onFocus%3A'),
-fn: function (aBlock){
+selector: unescape('em'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focus", aBlock]);
+return smalltalk.send(self, "_tag_", ["em"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onBlur_'),
+unescape('_embed'),
 smalltalk.method({
-selector: unescape('onBlur%3A'),
-fn: function (aBlock){
+selector: unescape('embed'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["blur", aBlock]);
+return smalltalk.send(self, "_tag_", ["embed"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onChange_'),
+unescape('_fieldset'),
 smalltalk.method({
-selector: unescape('onChange%3A'),
-fn: function (aBlock){
+selector: unescape('fieldset'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["change", aBlock]);
+return smalltalk.send(self, "_tag_", ["fieldset"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onClick_'),
+unescape('_figcaption'),
 smalltalk.method({
-selector: unescape('onClick%3A'),
-fn: function (aBlock){
+selector: unescape('figcaption'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["click", aBlock]);
+return smalltalk.send(self, "_tag_", ["figcaption"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_initializeFromString_canvas_'),
+unescape('_figure'),
 smalltalk.method({
-selector: unescape('initializeFromString%3Acanvas%3A'),
-fn: function (aString, aCanvas){
+selector: unescape('figure'),
+fn: function (){
 var self=this;
-(self['@element']=smalltalk.send(self, "_createElementFor_", [aString]));
-(self['@canvas']=aCanvas);
+return smalltalk.send(self, "_tag_", ["figure"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_initializeFromJQuery_canvas_'),
+unescape('_footer'),
 smalltalk.method({
-selector: unescape('initializeFromJQuery%3Acanvas%3A'),
-fn: function (aJQuery, aCanvas){
+selector: unescape('footer'),
+fn: function (){
 var self=this;
-(self['@element']=smalltalk.send(aJQuery, "_get_", [(0)]));
-(self['@canvas']=aCanvas);
+return smalltalk.send(self, "_tag_", ["footer"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_createElementFor_'),
+unescape('_form'),
 smalltalk.method({
-selector: unescape('createElementFor%3A'),
-fn: function (aString){
+selector: unescape('form'),
+fn: function (){
 var self=this;
-return document.createElement(String(aString));
+return smalltalk.send(self, "_tag_", ["form"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_createTextNodeFor_'),
+unescape('_h1'),
 smalltalk.method({
-selector: unescape('createTextNodeFor%3A'),
-fn: function (aString){
+selector: unescape('h1'),
+fn: function (){
 var self=this;
-return document.createTextNode(String(aString));
+return smalltalk.send(self, "_tag_", ["h1"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onSubmit_'),
+unescape('_h1_'),
 smalltalk.method({
-selector: unescape('onSubmit%3A'),
-fn: function (aBlock){
+selector: unescape('h1%3A'),
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["submit", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_h1", []), "_with_", [anObject]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onDblClick_'),
+unescape('_h2'),
 smalltalk.method({
-selector: unescape('onDblClick%3A'),
-fn: function (aBlock){
+selector: unescape('h2'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["dblclick", aBlock]);
+return smalltalk.send(self, "_tag_", ["h2"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onHover_'),
+unescape('_h2_'),
 smalltalk.method({
-selector: unescape('onHover%3A'),
-fn: function (aBlock){
+selector: unescape('h2%3A'),
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["hover", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_h2", []), "_with_", [anObject]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onFocusIn_'),
+unescape('_h3'),
 smalltalk.method({
-selector: unescape('onFocusIn%3A'),
-fn: function (aBlock){
+selector: unescape('h3'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focusin", aBlock]);
+return smalltalk.send(self, "_tag_", ["h3"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onFocusOut_'),
+unescape('_h3_'),
 smalltalk.method({
-selector: unescape('onFocusOut%3A'),
-fn: function (aBlock){
+selector: unescape('h3%3A'),
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focusout", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_h3", []), "_with_", [anObject]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseDown_'),
+unescape('_h4'),
 smalltalk.method({
-selector: unescape('onMouseDown%3A'),
-fn: function (aBlock){
+selector: unescape('h4'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mousedown", aBlock]);
+return smalltalk.send(self, "_tag_", ["h4"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseUp_'),
+unescape('_h4_'),
 smalltalk.method({
-selector: unescape('onMouseUp%3A'),
-fn: function (aBlock){
+selector: unescape('h4%3A'),
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseup", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_h4", []), "_with_", [anObject]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseEnter_'),
+unescape('_h5'),
 smalltalk.method({
-selector: unescape('onMouseEnter%3A'),
-fn: function (aBlock){
+selector: unescape('h5'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseenter", aBlock]);
+return smalltalk.send(self, "_tag_", ["h5"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseLeave_'),
+unescape('_h5_'),
 smalltalk.method({
-selector: unescape('onMouseLeave%3A'),
-fn: function (aBlock){
+selector: unescape('h5%3A'),
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseleave", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_h5", []), "_with_", [anObject]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseMove_'),
+unescape('_h6'),
 smalltalk.method({
-selector: unescape('onMouseMove%3A'),
-fn: function (aBlock){
+selector: unescape('h6'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mousemove", aBlock]);
+return smalltalk.send(self, "_tag_", ["h6"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseOut_'),
+unescape('_h6_'),
 smalltalk.method({
-selector: unescape('onMouseOut%3A'),
-fn: function (aBlock){
+selector: unescape('h6%3A'),
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseout", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_h6", []), "_with_", [anObject]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseOver_'),
+unescape('_head'),
 smalltalk.method({
-selector: unescape('onMouseOver%3A'),
-fn: function (aBlock){
+selector: unescape('head'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseover", aBlock]);
+return smalltalk.send(self, "_tag_", ["head"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onSelect_'),
+unescape('_header'),
 smalltalk.method({
-selector: unescape('onSelect%3A'),
-fn: function (aBlock){
+selector: unescape('header'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["select", aBlock]);
+return smalltalk.send(self, "_tag_", ["header"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onUnload_'),
+unescape('_hgroup'),
 smalltalk.method({
-selector: unescape('onUnload%3A'),
-fn: function (aBlock){
+selector: unescape('hgroup'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["unload", aBlock]);
+return smalltalk.send(self, "_tag_", ["hgroup"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_for_'),
+unescape('_hr'),
 smalltalk.method({
-selector: unescape('for%3A'),
-fn: function (aString){
+selector: unescape('hr'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["for", aString]);
+return smalltalk.send(self, "_tag_", ["hr"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_placeholder_'),
+unescape('_html'),
 smalltalk.method({
-selector: unescape('placeholder%3A'),
-fn: function (aString){
+selector: unescape('html'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["placeholder", aString]);
+return smalltalk.send(self, "_tag_", ["html"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_accesskey_'),
+unescape('_iframe'),
 smalltalk.method({
-selector: unescape('accesskey%3A'),
-fn: function (aString){
+selector: unescape('iframe'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["accesskey", aString]);
+return smalltalk.send(self, "_tag_", ["iframe"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_contenteditable_'),
+unescape('_iframe_'),
 smalltalk.method({
-selector: unescape('contenteditable%3A'),
+selector: unescape('iframe%3A'),
 fn: function (aString){
 var self=this;
-smalltalk.send(self, "_at_put_", ["contenteditable", aString]);
+return smalltalk.send(smalltalk.send(self, "_iframe", []), "_src_", [aString]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_contextmenu_'),
+unescape('_img'),
 smalltalk.method({
-selector: unescape('contextmenu%3A'),
-fn: function (aString){
+selector: unescape('img'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["contextmenu", aString]);
+return smalltalk.send(self, "_tag_", ["img"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_draggable_'),
+unescape('_img_'),
 smalltalk.method({
-selector: unescape('draggable%3A'),
+selector: unescape('img%3A'),
 fn: function (aString){
 var self=this;
-smalltalk.send(self, "_at_put_", ["draggable", aString]);
+return smalltalk.send(smalltalk.send(self, "_img", []), "_src_", [aString]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_hidden'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('hidden'),
+selector: unescape('initialize'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["hidden", "hidden"]);
+smalltalk.send(self, "_initialize", [], smalltalk.Object);
+(($receiver = self['@root']) == nil || $receiver == undefined) ? (function(){return (self['@root']=smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromString_canvas_", ["div", self]));})() : $receiver;
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_tabindex_'),
+unescape('_initializeFromJQuery_'),
 smalltalk.method({
-selector: unescape('tabindex%3A'),
-fn: function (aNumber){
+selector: unescape('initializeFromJQuery%3A'),
+fn: function (aJQuery){
 var self=this;
-smalltalk.send(self, "_at_put_", ["tabindex", aNumber]);
+(self['@root']=smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromJQuery_canvas_", [aJQuery, self]));
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_target_'),
+unescape('_input'),
 smalltalk.method({
-selector: unescape('target%3A'),
-fn: function (aString){
+selector: unescape('input'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["target", aString]);
+return smalltalk.send(self, "_tag_", ["input"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_align_'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('align%3A'),
-fn: function (aString){
+selector: unescape('label'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["align", aString]);
+return smalltalk.send(self, "_tag_", ["label"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_alt_'),
+unescape('_legend'),
 smalltalk.method({
-selector: unescape('alt%3A'),
-fn: function (aString){
+selector: unescape('legend'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["alt", aString]);
+return smalltalk.send(self, "_tag_", ["legend"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_name_'),
+unescape('_li'),
 smalltalk.method({
-selector: unescape('name%3A'),
-fn: function (aString){
+selector: unescape('li'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["name", aString]);
+return smalltalk.send(self, "_tag_", ["li"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_valign_'),
+unescape('_li_'),
 smalltalk.method({
-selector: unescape('valign%3A'),
-fn: function (aString){
+selector: unescape('li%3A'),
+fn: function (anObject){
 var self=this;
-smalltalk.send(self, "_at_put_", ["valign", aString]);
+return smalltalk.send(smalltalk.send(self, "_li", []), "_with_", [anObject]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_method_'),
+unescape('_link'),
 smalltalk.method({
-selector: unescape('method%3A'),
-fn: function (aString){
+selector: unescape('link'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["method", aString]);
+return smalltalk.send(self, "_tag_", ["link"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_action_'),
+unescape('_map'),
 smalltalk.method({
-selector: unescape('action%3A'),
-fn: function (aString){
+selector: unescape('map'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["action", aString]);
+return smalltalk.send(self, "_tag_", ["map"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_rows_'),
+unescape('_mark'),
 smalltalk.method({
-selector: unescape('rows%3A'),
-fn: function (aString){
+selector: unescape('mark'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["rows", aString]);
+return smalltalk.send(self, "_tag_", ["mark"]);
 return self;}
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_cols_'),
+unescape('_menu'),
 smalltalk.method({
-selector: unescape('cols%3A'),
-fn: function (aString){
+selector: unescape('menu'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["cols", aString]);
+return smalltalk.send(self, "_tag_", ["menu"]);
 return self;}
 }),
-smalltalk.TagBrush);
-
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_fromString_canvas_'),
+unescape('_meta'),
 smalltalk.method({
-selector: unescape('fromString%3Acanvas%3A'),
-fn: function (aString, aCanvas){
+selector: unescape('meta'),
+fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_initializeFromString_canvas_", [aString, aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return smalltalk.send(self, "_tag_", ["meta"]);
 return self;}
 }),
-smalltalk.TagBrush.klass);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_fromJQuery_canvas_'),
+unescape('_nav'),
 smalltalk.method({
-selector: unescape('fromJQuery%3Acanvas%3A'),
-fn: function (aJQuery, aCanvas){
+selector: unescape('nav'),
+fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_canvas_", [aJQuery, aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return smalltalk.send(self, "_tag_", ["nav"]);
 return self;}
 }),
-smalltalk.TagBrush.klass);
-
+smalltalk.HTMLCanvas);
 
-smalltalk.addClass('HTMLCanvas', smalltalk.Object, ['root'], 'Canvas');
 smalltalk.addMethod(
-unescape('_root_'),
+unescape('_newTag_'),
 smalltalk.method({
-selector: unescape('root%3A'),
-fn: function (aTagBrush){
+selector: unescape('newTag%3A'),
+fn: function (aString){
 var self=this;
-(self['@root']=aTagBrush);
+return smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromString_canvas_", [aString, self]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_root'),
+unescape('_noscript'),
 smalltalk.method({
-selector: unescape('root'),
+selector: unescape('noscript'),
 fn: function (){
 var self=this;
-return self['@root'];
+return smalltalk.send(self, "_tag_", ["noscript"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_with_'),
+unescape('_object'),
 smalltalk.method({
-selector: unescape('with%3A'),
-fn: function (anObject){
+selector: unescape('object'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_root", []), "_with_", [anObject]);
+return smalltalk.send(self, "_tag_", ["object"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_ol'),
 smalltalk.method({
-selector: unescape('initialize'),
+selector: unescape('ol'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Object);
-(($receiver = self['@root']) == nil || $receiver == undefined) ? (function(){return (self['@root']=smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromString_canvas_", ["div", self]));})() : $receiver;
+return smalltalk.send(self, "_tag_", ["ol"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_initializeFromJQuery_'),
+unescape('_ol_'),
 smalltalk.method({
-selector: unescape('initializeFromJQuery%3A'),
-fn: function (aJQuery){
+selector: unescape('ol%3A'),
+fn: function (anObject){
 var self=this;
-(self['@root']=smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromJQuery_canvas_", [aJQuery, self]));
+return smalltalk.send(smalltalk.send(self, "_ol", []), "_with_", [anObject]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_newTag_'),
+unescape('_optgroup'),
 smalltalk.method({
-selector: unescape('newTag%3A'),
-fn: function (aString){
+selector: unescape('optgroup'),
+fn: function (){
 var self=this;
-return smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromString_canvas_", [aString, self]);
+return smalltalk.send(self, "_tag_", ["optgroup"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_tag_'),
+unescape('_option'),
 smalltalk.method({
-selector: unescape('tag%3A'),
-fn: function (aString){
+selector: unescape('option'),
+fn: function (){
 var self=this;
-return smalltalk.send(self['@root'], "_addBrush_", [smalltalk.send(self, "_newTag_", [aString])]);
+return smalltalk.send(self, "_tag_", ["option"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h1'),
+unescape('_output'),
 smalltalk.method({
-selector: unescape('h1'),
+selector: unescape('output'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h1"]);
+return smalltalk.send(self, "_tag_", ["output"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h2'),
+unescape('_p'),
 smalltalk.method({
-selector: unescape('h2'),
+selector: unescape('p'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h2"]);
+return smalltalk.send(self, "_tag_", ["p"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h3'),
+unescape('_p_'),
 smalltalk.method({
-selector: unescape('h3'),
+selector: unescape('p%3A'),
+fn: function (anObject){
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_p", []), "_with_", [anObject]);
+return self;}
+}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+unescape('_param'),
+smalltalk.method({
+selector: unescape('param'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h3"]);
+return smalltalk.send(self, "_tag_", ["param"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h4'),
+unescape('_pre'),
 smalltalk.method({
-selector: unescape('h4'),
+selector: unescape('pre'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h4"]);
+return smalltalk.send(self, "_tag_", ["pre"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h5'),
+unescape('_progress'),
 smalltalk.method({
-selector: unescape('h5'),
+selector: unescape('progress'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h5"]);
+return smalltalk.send(self, "_tag_", ["progress"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h6'),
+unescape('_root'),
 smalltalk.method({
-selector: unescape('h6'),
+selector: unescape('root'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h6"]);
+return self['@root'];
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_p'),
+unescape('_root_'),
 smalltalk.method({
-selector: unescape('p'),
-fn: function (){
+selector: unescape('root%3A'),
+fn: function (aTagBrush){
 var self=this;
-return smalltalk.send(self, "_tag_", ["p"]);
+(self['@root']=aTagBrush);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_div'),
+unescape('_script'),
 smalltalk.method({
-selector: unescape('div'),
+selector: unescape('script'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["div"]);
+return smalltalk.send(self, "_tag_", ["script"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_span'),
+unescape('_section'),
 smalltalk.method({
-selector: unescape('span'),
+selector: unescape('section'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["span"]);
+return smalltalk.send(self, "_tag_", ["section"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_img'),
+unescape('_select'),
 smalltalk.method({
-selector: unescape('img'),
+selector: unescape('select'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["img"]);
+return smalltalk.send(self, "_tag_", ["select"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_ul'),
+unescape('_small'),
 smalltalk.method({
-selector: unescape('ul'),
+selector: unescape('small'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["ul"]);
+return smalltalk.send(self, "_tag_", ["small"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_ol'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('ol'),
+selector: unescape('source'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["ol"]);
+return smalltalk.send(self, "_tag_", ["source"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_li'),
+unescape('_span'),
 smalltalk.method({
-selector: unescape('li'),
+selector: unescape('span'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["li"]);
+return smalltalk.send(self, "_tag_", ["span"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_table'),
+unescape('_span_'),
 smalltalk.method({
-selector: unescape('table'),
-fn: function (){
+selector: unescape('span%3A'),
+fn: function (anObject){
 var self=this;
-return smalltalk.send(self, "_tag_", ["table"]);
+return smalltalk.send(smalltalk.send(self, "_span", []), "_with_", [anObject]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_tr'),
+unescape('_strong'),
 smalltalk.method({
-selector: unescape('tr'),
+selector: unescape('strong'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["tr"]);
+return smalltalk.send(self, "_tag_", ["strong"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_td'),
+unescape('_strong_'),
 smalltalk.method({
-selector: unescape('td'),
-fn: function (){
+selector: unescape('strong%3A'),
+fn: function (anObject){
 var self=this;
-return smalltalk.send(self, "_tag_", ["td"]);
+return smalltalk.send(smalltalk.send(self, "_strong", []), "_with_", [anObject]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_th'),
+unescape('_style'),
 smalltalk.method({
-selector: unescape('th'),
+selector: unescape('style'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["th"]);
+return smalltalk.send(self['@root'], "_addBrush_", [smalltalk.send((smalltalk.StyleTag || StyleTag), "_canvas_", [self])]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_form'),
+unescape('_style_'),
 smalltalk.method({
-selector: unescape('form'),
-fn: function (){
+selector: unescape('style%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["form"]);
+return (function($rec){smalltalk.send($rec, "_with_", [aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_style", []));
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_input'),
+unescape('_sub'),
 smalltalk.method({
-selector: unescape('input'),
+selector: unescape('sub'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["input"]);
+return smalltalk.send(self, "_tag_", ["sub"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_button'),
+unescape('_summary'),
 smalltalk.method({
-selector: unescape('button'),
+selector: unescape('summary'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["button"]);
+return smalltalk.send(self, "_tag_", ["summary"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_select'),
+unescape('_sup'),
 smalltalk.method({
-selector: unescape('select'),
+selector: unescape('sup'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["select"]);
+return smalltalk.send(self, "_tag_", ["sup"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_option'),
+unescape('_table'),
 smalltalk.method({
-selector: unescape('option'),
+selector: unescape('table'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["option"]);
+return smalltalk.send(self, "_tag_", ["table"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_textarea'),
+unescape('_tag_'),
 smalltalk.method({
-selector: unescape('textarea'),
-fn: function (){
+selector: unescape('tag%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["textarea"]);
+return smalltalk.send(self['@root'], "_addBrush_", [smalltalk.send(self, "_newTag_", [aString])]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_a'),
+unescape('_tbody'),
 smalltalk.method({
-selector: unescape('a'),
+selector: unescape('tbody'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["a"]);
+return smalltalk.send(self, "_tag_", ["tbody"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_canvas'),
+unescape('_td'),
 smalltalk.method({
-selector: unescape('canvas'),
+selector: unescape('td'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["canvas"]);
+return smalltalk.send(self, "_tag_", ["td"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_pre'),
+unescape('_textarea'),
 smalltalk.method({
-selector: unescape('pre'),
+selector: unescape('textarea'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["pre"]);
+return smalltalk.send(self, "_tag_", ["textarea"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_code'),
+unescape('_tfoot'),
 smalltalk.method({
-selector: unescape('code'),
+selector: unescape('tfoot'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["code"]);
+return smalltalk.send(self, "_tag_", ["tfoot"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_br'),
+unescape('_th'),
 smalltalk.method({
-selector: unescape('br'),
+selector: unescape('th'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["br"]);
+return smalltalk.send(self, "_tag_", ["th"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_script'),
+unescape('_thead'),
 smalltalk.method({
-selector: unescape('script'),
+selector: unescape('thead'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["script"]);
+return smalltalk.send(self, "_tag_", ["thead"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_link'),
+unescape('_time'),
 smalltalk.method({
-selector: unescape('link'),
+selector: unescape('time'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["link"]);
+return smalltalk.send(self, "_tag_", ["time"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_style'),
+unescape('_title'),
 smalltalk.method({
-selector: unescape('style'),
+selector: unescape('title'),
 fn: function (){
 var self=this;
-return smalltalk.send(self['@root'], "_addBrush_", [smalltalk.send((smalltalk.StyleTag || StyleTag), "_canvas_", [self])]);
+return smalltalk.send(self, "_tag_", ["title"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_p_'),
+unescape('_tr'),
 smalltalk.method({
-selector: unescape('p%3A'),
-fn: function (anObject){
+selector: unescape('tr'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_p", []), "_with_", [anObject]);
+return smalltalk.send(self, "_tag_", ["tr"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h1_'),
+unescape('_ul'),
 smalltalk.method({
-selector: unescape('h1%3A'),
-fn: function (anObject){
+selector: unescape('ul'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h1", []), "_with_", [anObject]);
+return smalltalk.send(self, "_tag_", ["ul"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_iframe'),
+unescape('_ul_'),
 smalltalk.method({
-selector: unescape('iframe'),
-fn: function (){
+selector: unescape('ul%3A'),
+fn: function (anObject){
 var self=this;
-return smalltalk.send(self, "_tag_", ["iframe"]);
+return smalltalk.send(smalltalk.send(self, "_ul", []), "_with_", [anObject]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_iframe_'),
+unescape('_video'),
 smalltalk.method({
-selector: unescape('iframe%3A'),
-fn: function (aString){
+selector: unescape('video'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_iframe", []), "_src_", [aString]);
+return smalltalk.send(self, "_tag_", ["video"]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h2_'),
+unescape('_with_'),
 smalltalk.method({
-selector: unescape('h2%3A'),
+selector: unescape('with%3A'),
 fn: function (anObject){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h2", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send(self, "_root", []), "_with_", [anObject]);
 return self;}
 }),
 smalltalk.HTMLCanvas);
 
+
 smalltalk.addMethod(
-unescape('_h3_'),
+unescape('_browserVersion'),
 smalltalk.method({
-selector: unescape('h3%3A'),
-fn: function (anObject){
+selector: unescape('browserVersion'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h3", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_version", []);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
 
 smalltalk.addMethod(
-unescape('_h4_'),
+unescape('_isMSIE'),
 smalltalk.method({
-selector: unescape('h4%3A'),
-fn: function (anObject){
+selector: unescape('isMSIE'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h4", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("msie")]), "_notNil", []);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
 
 smalltalk.addMethod(
-unescape('_h5_'),
+unescape('_isMozilla'),
 smalltalk.method({
-selector: unescape('h5%3A'),
-fn: function (anObject){
+selector: unescape('isMozilla'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h5", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("mozilla")]), "_notNil", []);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
 
 smalltalk.addMethod(
-unescape('_h6_'),
+unescape('_isOpera'),
 smalltalk.method({
-selector: unescape('h6%3A'),
-fn: function (anObject){
+selector: unescape('isOpera'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h6", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("opera")]), "_notNil", []);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
 
 smalltalk.addMethod(
-unescape('_img_'),
+unescape('_isWebkit'),
 smalltalk.method({
-selector: unescape('img%3A'),
-fn: function (aString){
+selector: unescape('isWebkit'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_img", []), "_src_", [aString]);
+return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("webkit")]), "_notNil", []);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
 
 smalltalk.addMethod(
-unescape('_ol_'),
+unescape('_onJQuery_'),
 smalltalk.method({
-selector: unescape('ol%3A'),
-fn: function (anObject){
+selector: unescape('onJQuery%3A'),
+fn: function (aJQuery){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_ol", []), "_with_", [anObject]);
+return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_", [aJQuery]);smalltalk.send($rec, "_initialize", []);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_basicNew", []));
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
 
+
+smalltalk.addClass('TagBrush', smalltalk.Object, ['canvas', 'element'], 'Canvas');
 smalltalk.addMethod(
-unescape('_li_'),
+unescape('_accesskey_'),
 smalltalk.method({
-selector: unescape('li%3A'),
-fn: function (anObject){
+selector: unescape('accesskey%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_li", []), "_with_", [anObject]);
+smalltalk.send(self, "_at_put_", ["accesskey", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_ul_'),
+unescape('_action_'),
 smalltalk.method({
-selector: unescape('ul%3A'),
-fn: function (anObject){
+selector: unescape('action%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_ul", []), "_with_", [anObject]);
+smalltalk.send(self, "_at_put_", ["action", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_span_'),
+unescape('_addBrush_'),
 smalltalk.method({
-selector: unescape('span%3A'),
-fn: function (anObject){
+selector: unescape('addBrush%3A'),
+fn: function (aTagBrush){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_span", []), "_with_", [anObject]);
+smalltalk.send(self, "_appendChild_", [smalltalk.send(aTagBrush, "_element", [])]);
+return aTagBrush;
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_style_'),
+unescape('_align_'),
 smalltalk.method({
-selector: unescape('style%3A'),
+selector: unescape('align%3A'),
 fn: function (aString){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_with_", [aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_style", []));
+smalltalk.send(self, "_at_put_", ["align", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_audio'),
+unescape('_alt_'),
 smalltalk.method({
-selector: unescape('audio'),
-fn: function (){
+selector: unescape('alt%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["audio"]);
+smalltalk.send(self, "_at_put_", ["alt", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_fieldset'),
+unescape('_append_'),
 smalltalk.method({
-selector: unescape('fieldset'),
-fn: function (){
+selector: unescape('append%3A'),
+fn: function (anObject){
 var self=this;
-return smalltalk.send(self, "_tag_", ["fieldset"]);
+smalltalk.send(anObject, "_appendToBrush_", [self]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_footer'),
+unescape('_appendBlock_'),
 smalltalk.method({
-selector: unescape('footer'),
-fn: function (){
+selector: unescape('appendBlock%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["footer"]);
+var root=nil;
+(root=smalltalk.send(self['@canvas'], "_root", []));
+smalltalk.send(self['@canvas'], "_root_", [self]);
+smalltalk.send(aBlock, "_value_", [self['@canvas']]);
+smalltalk.send(self['@canvas'], "_root_", [root]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_header'),
+unescape('_appendChild_'),
 smalltalk.method({
-selector: unescape('header'),
-fn: function (){
+selector: unescape('appendChild%3A'),
+fn: function (anElement){
 var self=this;
-return smalltalk.send(self, "_tag_", ["header"]);
+var element=self['@element'];
+ 	if (null == element.canHaveChildren || element.canHaveChildren) {
+		element.appendChild(anElement);
+ 	} else {
+ 		element.text = String(element.text) +  anElement.innerHTML;
+ 	} ;
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_hr'),
+unescape('_appendString_'),
 smalltalk.method({
-selector: unescape('hr'),
-fn: function (){
+selector: unescape('appendString%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["hr"]);
+smalltalk.send(self, "_appendChild_", [smalltalk.send(self, "_createTextNodeFor_", [aString])]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_section'),
+unescape('_appendToBrush_'),
 smalltalk.method({
-selector: unescape('section'),
-fn: function (){
+selector: unescape('appendToBrush%3A'),
+fn: function (aTagBrush){
 var self=this;
-return smalltalk.send(self, "_tag_", ["section"]);
+smalltalk.send(aTagBrush, "_addBrush_", [self]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_tbody'),
+unescape('_asJQuery'),
 smalltalk.method({
-selector: unescape('tbody'),
+selector: unescape('asJQuery'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["tbody"]);
+return smalltalk.send((typeof window == 'undefined' ? nil : window), "_jQuery_", [smalltalk.send(self, "_element", [])]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_tfoot'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('tfoot'),
-fn: function (){
+selector: unescape('at%3Aput%3A'),
+fn: function (aString, aValue){
 var self=this;
-return smalltalk.send(self, "_tag_", ["tfoot"]);
+self['@element'].setAttribute(aString, aValue);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_thead'),
+unescape('_class_'),
 smalltalk.method({
-selector: unescape('thead'),
-fn: function (){
+selector: unescape('class%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["thead"]);
+self['@element'].className = aString;
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_video'),
+unescape('_cols_'),
 smalltalk.method({
-selector: unescape('video'),
-fn: function (){
+selector: unescape('cols%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["video"]);
+smalltalk.send(self, "_at_put_", ["cols", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_contenteditable_'),
 smalltalk.method({
-selector: unescape('label'),
-fn: function (){
+selector: unescape('contenteditable%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["label"]);
+smalltalk.send(self, "_at_put_", ["contenteditable", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_title'),
+unescape('_contents_'),
 smalltalk.method({
-selector: unescape('title'),
-fn: function (){
+selector: unescape('contents%3A'),
+fn: function (anObject){
 var self=this;
-return smalltalk.send(self, "_tag_", ["title"]);
+(function($rec){smalltalk.send($rec, "_empty", []);return smalltalk.send($rec, "_append_", [anObject]);})(self);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_time'),
+unescape('_contextmenu_'),
 smalltalk.method({
-selector: unescape('time'),
-fn: function (){
+selector: unescape('contextmenu%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["time"]);
+smalltalk.send(self, "_at_put_", ["contextmenu", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_sup'),
+unescape('_createElementFor_'),
 smalltalk.method({
-selector: unescape('sup'),
-fn: function (){
+selector: unescape('createElementFor%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["sup"]);
+return document.createElement(String(aString));
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_summary'),
+unescape('_createTextNodeFor_'),
 smalltalk.method({
-selector: unescape('summary'),
-fn: function (){
+selector: unescape('createTextNodeFor%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["summary"]);
+return document.createTextNode(String(aString));
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_sub'),
+unescape('_draggable_'),
 smalltalk.method({
-selector: unescape('sub'),
-fn: function (){
+selector: unescape('draggable%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["sub"]);
+smalltalk.send(self, "_at_put_", ["draggable", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_strong'),
+unescape('_element'),
 smalltalk.method({
-selector: unescape('strong'),
+selector: unescape('element'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["strong"]);
+return self['@element'];
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_strong_'),
+unescape('_empty'),
 smalltalk.method({
-selector: unescape('strong%3A'),
-fn: function (anObject){
+selector: unescape('empty'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_strong", []), "_with_", [anObject]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_empty", []);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_for_'),
 smalltalk.method({
-selector: unescape('source'),
-fn: function (){
+selector: unescape('for%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["source"]);
+smalltalk.send(self, "_at_put_", ["for", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_small'),
+unescape('_height_'),
 smalltalk.method({
-selector: unescape('small'),
-fn: function (){
+selector: unescape('height%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["small"]);
+smalltalk.send(self, "_at_put_", ["height", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_progress'),
+unescape('_hidden'),
 smalltalk.method({
-selector: unescape('progress'),
+selector: unescape('hidden'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["progress"]);
+smalltalk.send(self, "_at_put_", ["hidden", "hidden"]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_param'),
+unescape('_href_'),
 smalltalk.method({
-selector: unescape('param'),
-fn: function (){
+selector: unescape('href%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["param"]);
+smalltalk.send(self, "_at_put_", ["href", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_output'),
+unescape('_id_'),
 smalltalk.method({
-selector: unescape('output'),
-fn: function (){
+selector: unescape('id%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["output"]);
+smalltalk.send(self, "_at_put_", ["id", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_optgroup'),
+unescape('_initializeFromJQuery_canvas_'),
 smalltalk.method({
-selector: unescape('optgroup'),
-fn: function (){
+selector: unescape('initializeFromJQuery%3Acanvas%3A'),
+fn: function (aJQuery, aCanvas){
 var self=this;
-return smalltalk.send(self, "_tag_", ["optgroup"]);
+(self['@element']=smalltalk.send(aJQuery, "_get_", [(0)]));
+(self['@canvas']=aCanvas);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_object'),
+unescape('_initializeFromString_canvas_'),
 smalltalk.method({
-selector: unescape('object'),
-fn: function (){
+selector: unescape('initializeFromString%3Acanvas%3A'),
+fn: function (aString, aCanvas){
 var self=this;
-return smalltalk.send(self, "_tag_", ["object"]);
+(self['@element']=smalltalk.send(self, "_createElementFor_", [aString]));
+(self['@canvas']=aCanvas);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_noscript'),
+unescape('_media_'),
 smalltalk.method({
-selector: unescape('noscript'),
-fn: function (){
+selector: unescape('media%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["noscript"]);
+smalltalk.send(self, "_at_put_", ["media", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_nav'),
+unescape('_method_'),
 smalltalk.method({
-selector: unescape('nav'),
-fn: function (){
+selector: unescape('method%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["nav"]);
+smalltalk.send(self, "_at_put_", ["method", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_meta'),
+unescape('_name_'),
 smalltalk.method({
-selector: unescape('meta'),
-fn: function (){
+selector: unescape('name%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["meta"]);
+smalltalk.send(self, "_at_put_", ["name", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_menu'),
+unescape('_onBlur_'),
 smalltalk.method({
-selector: unescape('menu'),
-fn: function (){
+selector: unescape('onBlur%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["menu"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["blur", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_mark'),
+unescape('_onChange_'),
 smalltalk.method({
-selector: unescape('mark'),
-fn: function (){
+selector: unescape('onChange%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["mark"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["change", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_map'),
+unescape('_onClick_'),
 smalltalk.method({
-selector: unescape('map'),
-fn: function (){
+selector: unescape('onClick%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["map"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["click", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_legend'),
+unescape('_onDblClick_'),
 smalltalk.method({
-selector: unescape('legend'),
-fn: function (){
+selector: unescape('onDblClick%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["legend"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["dblclick", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_html'),
+unescape('_onFocus_'),
 smalltalk.method({
-selector: unescape('html'),
-fn: function (){
+selector: unescape('onFocus%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["html"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focus", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_hgroup'),
+unescape('_onFocusIn_'),
 smalltalk.method({
-selector: unescape('hgroup'),
-fn: function (){
+selector: unescape('onFocusIn%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["hgroup"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focusin", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_head'),
+unescape('_onFocusOut_'),
 smalltalk.method({
-selector: unescape('head'),
-fn: function (){
+selector: unescape('onFocusOut%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["head"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focusout", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_figure'),
+unescape('_onHover_'),
 smalltalk.method({
-selector: unescape('figure'),
-fn: function (){
+selector: unescape('onHover%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["figure"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["hover", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_figcaption'),
+unescape('_onKeyDown_'),
 smalltalk.method({
-selector: unescape('figcaption'),
-fn: function (){
+selector: unescape('onKeyDown%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["figcaption"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keydown", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_embed'),
+unescape('_onKeyPress_'),
 smalltalk.method({
-selector: unescape('embed'),
-fn: function (){
+selector: unescape('onKeyPress%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["embed"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keypress", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_em'),
+unescape('_onKeyUp_'),
 smalltalk.method({
-selector: unescape('em'),
-fn: function (){
+selector: unescape('onKeyUp%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["em"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keyup", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_dt'),
+unescape('_onMouseDown_'),
 smalltalk.method({
-selector: unescape('dt'),
-fn: function (){
+selector: unescape('onMouseDown%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["dt"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mousedown", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_dl'),
+unescape('_onMouseEnter_'),
 smalltalk.method({
-selector: unescape('dl'),
-fn: function (){
+selector: unescape('onMouseEnter%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["dl"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseenter", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_details'),
+unescape('_onMouseLeave_'),
 smalltalk.method({
-selector: unescape('details'),
-fn: function (){
+selector: unescape('onMouseLeave%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["details"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseleave", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_del'),
+unescape('_onMouseMove_'),
 smalltalk.method({
-selector: unescape('del'),
-fn: function (){
+selector: unescape('onMouseMove%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["del"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mousemove", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_dd'),
+unescape('_onMouseOut_'),
 smalltalk.method({
-selector: unescape('dd'),
-fn: function (){
+selector: unescape('onMouseOut%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["dd"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseout", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_datalist'),
+unescape('_onMouseOver_'),
 smalltalk.method({
-selector: unescape('datalist'),
-fn: function (){
+selector: unescape('onMouseOver%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["datalist"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseover", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_command'),
+unescape('_onMouseUp_'),
 smalltalk.method({
-selector: unescape('command'),
-fn: function (){
+selector: unescape('onMouseUp%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["command"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseup", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_colgroup'),
+unescape('_onSelect_'),
 smalltalk.method({
-selector: unescape('colgroup'),
-fn: function (){
+selector: unescape('onSelect%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["colgroup"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["select", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_col'),
+unescape('_onSubmit_'),
 smalltalk.method({
-selector: unescape('col'),
-fn: function (){
+selector: unescape('onSubmit%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["col"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["submit", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_cite'),
+unescape('_onUnload_'),
 smalltalk.method({
-selector: unescape('cite'),
-fn: function (){
+selector: unescape('onUnload%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["cite"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["unload", aBlock]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_caption'),
+unescape('_placeholder_'),
 smalltalk.method({
-selector: unescape('caption'),
-fn: function (){
+selector: unescape('placeholder%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["caption"]);
+smalltalk.send(self, "_at_put_", ["placeholder", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_body'),
+unescape('_rel_'),
 smalltalk.method({
-selector: unescape('body'),
-fn: function (){
+selector: unescape('rel%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["body"]);
+smalltalk.send(self, "_at_put_", ["rel", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_blockquote'),
+unescape('_removeAt_'),
 smalltalk.method({
-selector: unescape('blockquote'),
-fn: function (){
+selector: unescape('removeAt%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["blockquote"]);
+self['@element'].removeAttribute(aString);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_base'),
+unescape('_rows_'),
 smalltalk.method({
-selector: unescape('base'),
-fn: function (){
+selector: unescape('rows%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["base"]);
+smalltalk.send(self, "_at_put_", ["rows", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_aside'),
+unescape('_src_'),
 smalltalk.method({
-selector: unescape('aside'),
-fn: function (){
+selector: unescape('src%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["aside"]);
+smalltalk.send(self, "_at_put_", ["src", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_article'),
+unescape('_style_'),
 smalltalk.method({
-selector: unescape('article'),
-fn: function (){
+selector: unescape('style%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["article"]);
+smalltalk.send(self, "_at_put_", ["style", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_area'),
+unescape('_tabindex_'),
 smalltalk.method({
-selector: unescape('area'),
-fn: function (){
+selector: unescape('tabindex%3A'),
+fn: function (aNumber){
 var self=this;
-return smalltalk.send(self, "_tag_", ["area"]);
+smalltalk.send(self, "_at_put_", ["tabindex", aNumber]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_address'),
+unescape('_target_'),
 smalltalk.method({
-selector: unescape('address'),
-fn: function (){
+selector: unescape('target%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["address"]);
+smalltalk.send(self, "_at_put_", ["target", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_abbr'),
+unescape('_title_'),
 smalltalk.method({
-selector: unescape('abbr'),
-fn: function (){
+selector: unescape('title%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["abbr"]);
+smalltalk.send(self, "_at_put_", ["title", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_div_'),
+unescape('_type_'),
 smalltalk.method({
-selector: unescape('div%3A'),
-fn: function (aBlock){
+selector: unescape('type%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_div", []), "_with_", [aBlock]);
+smalltalk.send(self, "_at_put_", ["type", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas);
-
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_onJQuery_'),
+unescape('_valign_'),
 smalltalk.method({
-selector: unescape('onJQuery%3A'),
-fn: function (aJQuery){
+selector: unescape('valign%3A'),
+fn: function (aString){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_", [aJQuery]);smalltalk.send($rec, "_initialize", []);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_basicNew", []));
+smalltalk.send(self, "_at_put_", ["valign", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_isMSIE'),
+unescape('_value_'),
 smalltalk.method({
-selector: unescape('isMSIE'),
-fn: function (){
+selector: unescape('value%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("msie")]), "_notNil", []);
+smalltalk.send(self, "_at_put_", ["value", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_isOpera'),
+unescape('_width_'),
 smalltalk.method({
-selector: unescape('isOpera'),
-fn: function (){
+selector: unescape('width%3A'),
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("opera")]), "_notNil", []);
+smalltalk.send(self, "_at_put_", ["width", aString]);
 return self;}
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_isMozilla'),
+unescape('_with_'),
 smalltalk.method({
-selector: unescape('isMozilla'),
-fn: function (){
+selector: unescape('with%3A'),
+fn: function (anObject){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("mozilla")]), "_notNil", []);
+smalltalk.send(self, "_append_", [anObject]);
 return self;}
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush);
+
 
 smalltalk.addMethod(
-unescape('_isWebkit'),
+unescape('_fromJQuery_canvas_'),
 smalltalk.method({
-selector: unescape('isWebkit'),
-fn: function (){
+selector: unescape('fromJQuery%3Acanvas%3A'),
+fn: function (aJQuery, aCanvas){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("webkit")]), "_notNil", []);
+return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_canvas_", [aJQuery, aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush.klass);
 
 smalltalk.addMethod(
-unescape('_browserVersion'),
+unescape('_fromString_canvas_'),
 smalltalk.method({
-selector: unescape('browserVersion'),
-fn: function (){
+selector: unescape('fromString%3Acanvas%3A'),
+fn: function (aString, aCanvas){
 var self=this;
-return smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_version", []);
+return (function($rec){smalltalk.send($rec, "_initializeFromString_canvas_", [aString, aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush.klass);
 
 
 smalltalk.addClass('StyleTag', smalltalk.TagBrush, ['canvas', 'element'], 'Canvas');
@@ -2136,16 +2100,41 @@ return self;}
 smalltalk.StyleTag.klass);
 
 
+smalltalk.addClass('Widget', smalltalk.Object, [], 'Canvas');
+smalltalk.addMethod(
+unescape('_appendToBrush_'),
+smalltalk.method({
+selector: unescape('appendToBrush%3A'),
+fn: function (aTagBrush){
+var self=this;
+smalltalk.send(self, "_appendToJQuery_", [smalltalk.send(aTagBrush, "_asJQuery", [])]);
+return self;}
+}),
+smalltalk.Widget);
+
 smalltalk.addMethod(
 unescape('_appendToJQuery_'),
 smalltalk.method({
 selector: unescape('appendToJQuery%3A'),
 fn: function (aJQuery){
 var self=this;
-smalltalk.send(aJQuery, "_append_", [smalltalk.send(self, "_asString", [])]);
+smalltalk.send(self, "_renderOn_", [smalltalk.send((smalltalk.HTMLCanvas || HTMLCanvas), "_onJQuery_", [aJQuery])]);
 return self;}
 }),
-smalltalk.Object);
+smalltalk.Widget);
+
+smalltalk.addMethod(
+unescape('_renderOn_'),
+smalltalk.method({
+selector: unescape('renderOn%3A'),
+fn: function (html){
+var self=this;
+self;
+return self;}
+}),
+smalltalk.Widget);
+
+
 
 smalltalk.addMethod(
 unescape('_appendToBrush_'),
@@ -2164,10 +2153,10 @@ smalltalk.method({
 selector: unescape('appendToJQuery%3A'),
 fn: function (aJQuery){
 var self=this;
-smalltalk.send(self, "_value_", [smalltalk.send((smalltalk.HTMLCanvas || HTMLCanvas), "_onJQuery_", [aJQuery])]);
+smalltalk.send(aJQuery, "_append_", [smalltalk.send(self, "_asString", [])]);
 return self;}
 }),
-smalltalk.BlockClosure);
+smalltalk.Object);
 
 smalltalk.addMethod(
 unescape('_appendToBrush_'),
@@ -2181,12 +2170,23 @@ return self;}
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_asJQuery'),
+unescape('_appendToJQuery_'),
 smalltalk.method({
-selector: unescape('asJQuery'),
-fn: function (){
+selector: unescape('appendToJQuery%3A'),
+fn: function (aJQuery){
 var self=this;
-return jQuery(String(self));
+smalltalk.send(self, "_value_", [smalltalk.send((smalltalk.HTMLCanvas || HTMLCanvas), "_onJQuery_", [aJQuery])]);
+return self;}
+}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+unescape('_appendToBrush_'),
+smalltalk.method({
+selector: unescape('appendToBrush%3A'),
+fn: function (aTagBrush){
+var self=this;
+smalltalk.send(aTagBrush, "_appendString_", [self]);
 return self;}
 }),
 smalltalk.String);
@@ -2203,12 +2203,12 @@ return self;}
 smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_appendToBrush_'),
+unescape('_asJQuery'),
 smalltalk.method({
-selector: unescape('appendToBrush%3A'),
-fn: function (aTagBrush){
+selector: unescape('asJQuery'),
+fn: function (){
 var self=this;
-smalltalk.send(aTagBrush, "_appendString_", [self]);
+return jQuery(String(self));
 return self;}
 }),
 smalltalk.String);
diff --git a/amber/src/js/Canvas.js b/amber/src/js/Canvas.js
index 4b969bb7e83..bc2eb8856fe 100755
--- a/amber/src/js/Canvas.js
+++ b/amber/src/js/Canvas.js
@@ -1,3064 +1,3013 @@
 smalltalk.addPackage('Canvas', {});
-smalltalk.addClass('Widget', smalltalk.Object, [], 'Canvas');
-smalltalk.addMethod(
-unescape('_appendToBrush_'),
-smalltalk.method({
-selector: unescape('appendToBrush%3A'),
-category: 'adding',
-fn: function (aTagBrush){
-var self=this;
-smalltalk.send(self, "_appendToJQuery_", [smalltalk.send(aTagBrush, "_asJQuery", [])]);
-return self;},
-args: ["aTagBrush"],
-source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendToJQuery%3A%20aTagBrush%20asJQuery'),
-messageSends: ["appendToJQuery:", "asJQuery"],
-referencedClasses: []
-}),
-smalltalk.Widget);
-
-smalltalk.addMethod(
-unescape('_appendToJQuery_'),
-smalltalk.method({
-selector: unescape('appendToJQuery%3A'),
-category: 'adding',
-fn: function (aJQuery){
-var self=this;
-smalltalk.send(self, "_renderOn_", [smalltalk.send((smalltalk.HTMLCanvas || HTMLCanvas), "_onJQuery_", [aJQuery])]);
-return self;},
-args: ["aJQuery"],
-source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20self%20renderOn%3A%20%28HTMLCanvas%20onJQuery%3A%20aJQuery%29'),
-messageSends: ["renderOn:", "onJQuery:"],
-referencedClasses: ["HTMLCanvas"]
-}),
-smalltalk.Widget);
-
+smalltalk.addClass('HTMLCanvas', smalltalk.Object, ['root'], 'Canvas');
 smalltalk.addMethod(
-unescape('_renderOn_'),
+unescape('_a'),
 smalltalk.method({
-selector: unescape('renderOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('a'),
+category: 'tags',
+fn: function (){
 var self=this;
-self;
+return smalltalk.send(self, "_tag_", ["a"]);
 return self;},
-args: ["html"],
-source: unescape('renderOn%3A%20html%0A%20%20%20%20self'),
-messageSends: [],
+args: [],
+source: unescape('a%0A%20%20%20%20%5Eself%20tag%3A%20%27a%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.Widget);
-
-
+smalltalk.HTMLCanvas);
 
-smalltalk.addClass('TagBrush', smalltalk.Object, ['canvas', 'element'], 'Canvas');
 smalltalk.addMethod(
-unescape('_element'),
+unescape('_abbr'),
 smalltalk.method({
-selector: unescape('element'),
-category: 'accessing',
+selector: unescape('abbr'),
+category: 'tags',
 fn: function (){
 var self=this;
-return self['@element'];
+return smalltalk.send(self, "_tag_", ["abbr"]);
 return self;},
 args: [],
-source: unescape('element%0A%20%20%20%20%5Eelement'),
-messageSends: [],
+source: unescape('abbr%0A%09%5Eself%20tag%3A%20%27abbr%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_contents_'),
+unescape('_address'),
 smalltalk.method({
-selector: unescape('contents%3A'),
-category: 'adding',
-fn: function (anObject){
+selector: unescape('address'),
+category: 'tags',
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_empty", []);return smalltalk.send($rec, "_append_", [anObject]);})(self);
+return smalltalk.send(self, "_tag_", ["address"]);
 return self;},
-args: ["anObject"],
-source: unescape('contents%3A%20anObject%0A%20%20%20%20self%20%0A%09empty%3B%0A%20%20%20%09append%3A%20anObject'),
-messageSends: ["empty", "append:"],
+args: [],
+source: unescape('address%0A%09%5Eself%20tag%3A%20%27address%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_addBrush_'),
+unescape('_area'),
 smalltalk.method({
-selector: unescape('addBrush%3A'),
-category: 'adding',
-fn: function (aTagBrush){
+selector: unescape('area'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_appendChild_", [smalltalk.send(aTagBrush, "_element", [])]);
-return aTagBrush;
+return smalltalk.send(self, "_tag_", ["area"]);
 return self;},
-args: ["aTagBrush"],
-source: unescape('addBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendChild%3A%20aTagBrush%20element.%0A%20%20%20%20%5EaTagBrush'),
-messageSends: ["appendChild:", "element"],
+args: [],
+source: unescape('area%0A%09%5Eself%20tag%3A%20%27area%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_with_'),
+unescape('_article'),
 smalltalk.method({
-selector: unescape('with%3A'),
-category: 'adding',
-fn: function (anObject){
+selector: unescape('article'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_append_", [anObject]);
+return smalltalk.send(self, "_tag_", ["article"]);
 return self;},
-args: ["anObject"],
-source: unescape('with%3A%20anObject%0A%20%20%20%20self%20append%3A%20anObject'),
-messageSends: ["append:"],
+args: [],
+source: unescape('article%0A%20%20%20%20%5Eself%20tag%3A%20%27article%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_append_'),
+unescape('_aside'),
 smalltalk.method({
-selector: unescape('append%3A'),
-category: 'adding',
-fn: function (anObject){
+selector: unescape('aside'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(anObject, "_appendToBrush_", [self]);
+return smalltalk.send(self, "_tag_", ["aside"]);
 return self;},
-args: ["anObject"],
-source: unescape('append%3A%20anObject%0A%20%20%20%20anObject%20appendToBrush%3A%20self'),
-messageSends: ["appendToBrush:"],
+args: [],
+source: unescape('aside%0A%09%5Eself%20tag%3A%20%27aside%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_appendToBrush_'),
+unescape('_audio'),
 smalltalk.method({
-selector: unescape('appendToBrush%3A'),
-category: 'adding',
-fn: function (aTagBrush){
+selector: unescape('audio'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(aTagBrush, "_addBrush_", [self]);
+return smalltalk.send(self, "_tag_", ["audio"]);
 return self;},
-args: ["aTagBrush"],
-source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20addBrush%3A%20self'),
-messageSends: ["addBrush:"],
+args: [],
+source: unescape('audio%0A%20%20%20%20%5Eself%20tag%3A%20%27audio%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_appendBlock_'),
+unescape('_base'),
 smalltalk.method({
-selector: unescape('appendBlock%3A'),
-category: 'adding',
-fn: function (aBlock){
+selector: unescape('base'),
+category: 'tags',
+fn: function (){
 var self=this;
-var root=nil;
-(root=smalltalk.send(self['@canvas'], "_root", []));
-smalltalk.send(self['@canvas'], "_root_", [self]);
-smalltalk.send(aBlock, "_value_", [self['@canvas']]);
-smalltalk.send(self['@canvas'], "_root_", [root]);
+return smalltalk.send(self, "_tag_", ["base"]);
 return self;},
-args: ["aBlock"],
-source: unescape('appendBlock%3A%20aBlock%0A%20%20%20%20%7C%20root%20%7C%0A%20%20%20%20root%20%3A%3D%20canvas%20root.%0A%20%20%20%20canvas%20root%3A%20self.%0A%20%20%20%20aBlock%20value%3A%20canvas.%0A%20%20%20%20canvas%20root%3A%20root'),
-messageSends: ["root", "root:", "value:"],
+args: [],
+source: unescape('base%0A%09%5Eself%20tag%3A%20%27base%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_appendChild_'),
+unescape('_blockquote'),
 smalltalk.method({
-selector: unescape('appendChild%3A'),
-category: 'adding',
-fn: function (anElement){
+selector: unescape('blockquote'),
+category: 'tags',
+fn: function (){
 var self=this;
-var element=self['@element'];
- 	if (null == element.canHaveChildren || element.canHaveChildren) {
-		element.appendChild(anElement);
- 	} else {
- 		element.text = String(element.text) +  anElement.innerHTML;
- 	} ;
+return smalltalk.send(self, "_tag_", ["blockquote"]);
 return self;},
-args: ["anElement"],
-source: unescape('appendChild%3A%20anElement%0A%09%22In%20IE7%20and%20IE8%20appendChild%20fails%20on%20several%20node%20types.%20So%20we%20need%20to%20check%22%20%0A%20%09%3Cvar%20element%3Dself%5B%27@element%27%5D%3B%0A%20%09if%20%28null%20%3D%3D%20element.canHaveChildren%20%7C%7C%20element.canHaveChildren%29%20%7B%0A%09%09element.appendChild%28anElement%29%3B%0A%20%09%7D%20else%20%7B%0A%20%09%09element.text%20%3D%20String%28element.text%29%20+%20%20anElement.innerHTML%3B%0A%20%09%7D%20%3E'),
-messageSends: [],
+args: [],
+source: unescape('blockquote%0A%09%5Eself%20tag%3A%20%27blockquote%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_appendString_'),
+unescape('_body'),
 smalltalk.method({
-selector: unescape('appendString%3A'),
-category: 'adding',
-fn: function (aString){
+selector: unescape('body'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_appendChild_", [smalltalk.send(self, "_createTextNodeFor_", [aString])]);
+return smalltalk.send(self, "_tag_", ["body"]);
 return self;},
-args: ["aString"],
-source: unescape('appendString%3A%20aString%0A%20%20%20%20self%20appendChild%3A%20%28self%20createTextNodeFor%3A%20aString%29'),
-messageSends: ["appendChild:", "createTextNodeFor:"],
+args: [],
+source: unescape('body%0A%09%5Eself%20tag%3A%20%27body%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_empty'),
+unescape('_br'),
 smalltalk.method({
-selector: unescape('empty'),
-category: 'adding',
+selector: unescape('br'),
+category: 'tags',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_empty", []);
+return smalltalk.send(self, "_tag_", ["br"]);
 return self;},
 args: [],
-source: unescape('empty%0A%09self%20asJQuery%20empty'),
-messageSends: ["empty", "asJQuery"],
+source: unescape('br%0A%20%20%20%20%5Eself%20tag%3A%20%27br%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_button'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-category: 'attributes',
-fn: function (aString, aValue){
+selector: unescape('button'),
+category: 'tags',
+fn: function (){
 var self=this;
-self['@element'].setAttribute(aString, aValue);
+return smalltalk.send(self, "_tag_", ["button"]);
 return self;},
-args: ["aString", "aValue"],
-source: unescape('at%3A%20aString%20put%3A%20aValue%0A%20%20%20%20%3Cself%5B%27@element%27%5D.setAttribute%28aString%2C%20aValue%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('button%0A%20%20%20%20%5Eself%20tag%3A%20%27button%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_removeAt_'),
+unescape('_canvas'),
 smalltalk.method({
-selector: unescape('removeAt%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('canvas'),
+category: 'tags',
+fn: function (){
 var self=this;
-self['@element'].removeAttribute(aString);
+return smalltalk.send(self, "_tag_", ["canvas"]);
 return self;},
-args: ["aString"],
-source: unescape('removeAt%3A%20aString%0A%20%20%20%20%3Cself%5B%27@element%27%5D.removeAttribute%28aString%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('canvas%0A%09%5Eself%20tag%3A%20%27canvas%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_class_'),
+unescape('_caption'),
 smalltalk.method({
-selector: unescape('class%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('caption'),
+category: 'tags',
+fn: function (){
 var self=this;
-self['@element'].className = aString;
+return smalltalk.send(self, "_tag_", ["caption"]);
 return self;},
-args: ["aString"],
-source: unescape('class%3A%20aString%0A%20%20%20%20%20%20%3Cself%5B%27@element%27%5D.className%20%3D%20aString%3E'),
-messageSends: [],
+args: [],
+source: unescape('caption%0A%09%5Eself%20tag%3A%20%27caption%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_id_'),
+unescape('_cite'),
 smalltalk.method({
-selector: unescape('id%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('cite'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["id", aString]);
+return smalltalk.send(self, "_tag_", ["cite"]);
 return self;},
-args: ["aString"],
-source: unescape('id%3A%20aString%0A%20%20%20%20self%20at%3A%20%27id%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('cite%0A%09%5Eself%20tag%3A%20%27cite%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_src_'),
+unescape('_code'),
 smalltalk.method({
-selector: unescape('src%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('code'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["src", aString]);
+return smalltalk.send(self, "_tag_", ["code"]);
 return self;},
-args: ["aString"],
-source: unescape('src%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27src%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('code%0A%20%20%20%20%5Eself%20tag%3A%20%27code%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_href_'),
+unescape('_col'),
 smalltalk.method({
-selector: unescape('href%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('col'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["href", aString]);
+return smalltalk.send(self, "_tag_", ["col"]);
 return self;},
-args: ["aString"],
-source: unescape('href%3A%20aString%0A%20%20%20%20self%20at%3A%20%27href%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('col%0A%09%5Eself%20tag%3A%20%27col%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_title_'),
+unescape('_colgroup'),
 smalltalk.method({
-selector: unescape('title%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('colgroup'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["title", aString]);
+return smalltalk.send(self, "_tag_", ["colgroup"]);
 return self;},
-args: ["aString"],
-source: unescape('title%3A%20aString%0A%20%20%20%20self%20at%3A%20%27title%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('colgroup%0A%09%5Eself%20tag%3A%20%27colgroup%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_style_'),
+unescape('_command'),
 smalltalk.method({
-selector: unescape('style%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('command'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["style", aString]);
+return smalltalk.send(self, "_tag_", ["command"]);
 return self;},
-args: ["aString"],
-source: unescape('style%3A%20aString%0A%20%20%20%20self%20at%3A%20%27style%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('command%0A%09%5Eself%20tag%3A%20%27command%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_type_'),
+unescape('_datalist'),
 smalltalk.method({
-selector: unescape('type%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('datalist'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["type", aString]);
+return smalltalk.send(self, "_tag_", ["datalist"]);
 return self;},
-args: ["aString"],
-source: unescape('type%3A%20aString%0A%20%20%20%20self%20at%3A%20%27type%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('datalist%0A%09%5Eself%20tag%3A%20%27datalist%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_media_'),
+unescape('_dd'),
 smalltalk.method({
-selector: unescape('media%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('dd'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["media", aString]);
+return smalltalk.send(self, "_tag_", ["dd"]);
 return self;},
-args: ["aString"],
-source: unescape('media%3A%20aString%0A%20%20%20%20self%20at%3A%20%27media%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('dd%0A%09%5Eself%20tag%3A%20%27dd%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_rel_'),
+unescape('_del'),
 smalltalk.method({
-selector: unescape('rel%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('del'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["rel", aString]);
+return smalltalk.send(self, "_tag_", ["del"]);
 return self;},
-args: ["aString"],
-source: unescape('rel%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27rel%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('del%0A%09%5Eself%20tag%3A%20%27del%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_width_'),
+unescape('_details'),
 smalltalk.method({
-selector: unescape('width%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('details'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["width", aString]);
+return smalltalk.send(self, "_tag_", ["details"]);
 return self;},
-args: ["aString"],
-source: unescape('width%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27width%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('details%0A%09%5Eself%20tag%3A%20%27details%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_height_'),
+unescape('_div'),
 smalltalk.method({
-selector: unescape('height%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('div'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["height", aString]);
+return smalltalk.send(self, "_tag_", ["div"]);
 return self;},
-args: ["aString"],
-source: unescape('height%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27height%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('div%0A%20%20%20%20%5Eself%20tag%3A%20%27div%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_value_'),
+unescape('_div_'),
 smalltalk.method({
-selector: unescape('value%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('div%3A'),
+category: 'tags',
+fn: function (aBlock){
 var self=this;
-smalltalk.send(self, "_at_put_", ["value", aString]);
+return smalltalk.send(smalltalk.send(self, "_div", []), "_with_", [aBlock]);
 return self;},
-args: ["aString"],
-source: unescape('value%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27value%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: ["aBlock"],
+source: unescape('div%3A%20aBlock%0A%20%20%20%20%5Eself%20div%20with%3A%20aBlock'),
+messageSends: ["with:", "div"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_asJQuery'),
+unescape('_dl'),
 smalltalk.method({
-selector: unescape('asJQuery'),
-category: 'converting',
+selector: unescape('dl'),
+category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send((typeof window == 'undefined' ? nil : window), "_jQuery_", [smalltalk.send(self, "_element", [])]);
+return smalltalk.send(self, "_tag_", ["dl"]);
 return self;},
 args: [],
-source: unescape('asJQuery%0A%20%20%20%20%5Ewindow%20jQuery%3A%20self%20element'),
-messageSends: ["jQuery:", "element"],
+source: unescape('dl%0A%09%5Eself%20tag%3A%20%27dl%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onKeyDown_'),
+unescape('_dt'),
 smalltalk.method({
-selector: unescape('onKeyDown%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('dt'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keydown", aBlock]);
+return smalltalk.send(self, "_tag_", ["dt"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onKeyDown%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27keydown%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('dt%0A%09%5Eself%20tag%3A%20%27dt%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onKeyPress_'),
+unescape('_em'),
 smalltalk.method({
-selector: unescape('onKeyPress%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('em'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keypress", aBlock]);
+return smalltalk.send(self, "_tag_", ["em"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onKeyPress%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27keypress%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('em%0A%09%5Eself%20tag%3A%20%27em%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onKeyUp_'),
+unescape('_embed'),
 smalltalk.method({
-selector: unescape('onKeyUp%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('embed'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keyup", aBlock]);
+return smalltalk.send(self, "_tag_", ["embed"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onKeyUp%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27keyup%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('embed%0A%09%5Eself%20tag%3A%20%27embed%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onFocus_'),
+unescape('_fieldset'),
 smalltalk.method({
-selector: unescape('onFocus%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('fieldset'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focus", aBlock]);
+return smalltalk.send(self, "_tag_", ["fieldset"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onFocus%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27focus%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('fieldset%0A%20%20%20%20%5Eself%20tag%3A%20%27fieldset%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onBlur_'),
+unescape('_figcaption'),
 smalltalk.method({
-selector: unescape('onBlur%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('figcaption'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["blur", aBlock]);
+return smalltalk.send(self, "_tag_", ["figcaption"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onBlur%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27blur%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('figcaption%0A%09%5Eself%20tag%3A%20%27figcaption%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onChange_'),
+unescape('_figure'),
 smalltalk.method({
-selector: unescape('onChange%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('figure'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["change", aBlock]);
+return smalltalk.send(self, "_tag_", ["figure"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onChange%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27change%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('figure%0A%09%5Eself%20tag%3A%20%27figure%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onClick_'),
+unescape('_footer'),
 smalltalk.method({
-selector: unescape('onClick%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('footer'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["click", aBlock]);
+return smalltalk.send(self, "_tag_", ["footer"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onClick%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27click%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('footer%0A%20%20%20%20%5Eself%20tag%3A%20%27footer%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_initializeFromString_canvas_'),
+unescape('_form'),
 smalltalk.method({
-selector: unescape('initializeFromString%3Acanvas%3A'),
-category: 'initialization',
-fn: function (aString, aCanvas){
+selector: unescape('form'),
+category: 'tags',
+fn: function (){
 var self=this;
-(self['@element']=smalltalk.send(self, "_createElementFor_", [aString]));
-(self['@canvas']=aCanvas);
+return smalltalk.send(self, "_tag_", ["form"]);
 return self;},
-args: ["aString", "aCanvas"],
-source: unescape('initializeFromString%3A%20aString%20canvas%3A%20aCanvas%0A%20%20%20%20element%20%3A%3D%20self%20createElementFor%3A%20aString.%0A%20%20%20%20canvas%20%3A%3D%20aCanvas'),
-messageSends: ["createElementFor:"],
+args: [],
+source: unescape('form%0A%20%20%20%20%5Eself%20tag%3A%20%27form%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_initializeFromJQuery_canvas_'),
+unescape('_h1'),
 smalltalk.method({
-selector: unescape('initializeFromJQuery%3Acanvas%3A'),
-category: 'initialization',
-fn: function (aJQuery, aCanvas){
+selector: unescape('h1'),
+category: 'tags',
+fn: function (){
 var self=this;
-(self['@element']=smalltalk.send(aJQuery, "_get_", [(0)]));
-(self['@canvas']=aCanvas);
+return smalltalk.send(self, "_tag_", ["h1"]);
 return self;},
-args: ["aJQuery", "aCanvas"],
-source: unescape('initializeFromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%0A%20%20%20%20element%20%3A%3D%20aJQuery%20get%3A%200.%0A%20%20%20%20canvas%20%3A%3D%20aCanvas'),
-messageSends: ["get:"],
+args: [],
+source: unescape('h1%0A%20%20%20%20%5Eself%20tag%3A%20%27h1%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_createElementFor_'),
+unescape('_h1_'),
 smalltalk.method({
-selector: unescape('createElementFor%3A'),
-category: 'private',
-fn: function (aString){
+selector: unescape('h1%3A'),
+category: 'tags',
+fn: function (anObject){
 var self=this;
-return document.createElement(String(aString));
+return smalltalk.send(smalltalk.send(self, "_h1", []), "_with_", [anObject]);
 return self;},
-args: ["aString"],
-source: unescape('createElementFor%3A%20aString%0A%09%3Creturn%20document.createElement%28String%28aString%29%29%3E'),
-messageSends: [],
+args: ["anObject"],
+source: unescape('h1%3A%20anObject%0A%20%20%20%20%5Eself%20h1%20with%3A%20anObject'),
+messageSends: ["with:", "h1"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_createTextNodeFor_'),
+unescape('_h2'),
 smalltalk.method({
-selector: unescape('createTextNodeFor%3A'),
-category: 'private',
-fn: function (aString){
+selector: unescape('h2'),
+category: 'tags',
+fn: function (){
 var self=this;
-return document.createTextNode(String(aString));
+return smalltalk.send(self, "_tag_", ["h2"]);
 return self;},
-args: ["aString"],
-source: unescape('createTextNodeFor%3A%20aString%0A%09%3Creturn%20document.createTextNode%28String%28aString%29%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('h2%0A%20%20%20%20%5Eself%20tag%3A%20%27h2%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onSubmit_'),
+unescape('_h2_'),
 smalltalk.method({
-selector: unescape('onSubmit%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('h2%3A'),
+category: 'tags',
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["submit", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_h2", []), "_with_", [anObject]);
 return self;},
-args: ["aBlock"],
-source: unescape('onSubmit%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27submit%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: ["anObject"],
+source: unescape('h2%3A%20anObject%0A%20%20%20%20%5E%20self%20h2%20with%3A%20anObject'),
+messageSends: ["with:", "h2"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onDblClick_'),
+unescape('_h3'),
 smalltalk.method({
-selector: unescape('onDblClick%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('h3'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["dblclick", aBlock]);
+return smalltalk.send(self, "_tag_", ["h3"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onDblClick%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27dblclick%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('h3%0A%20%20%20%20%5Eself%20tag%3A%20%27h3%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onHover_'),
+unescape('_h3_'),
 smalltalk.method({
-selector: unescape('onHover%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('h3%3A'),
+category: 'tags',
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["hover", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_h3", []), "_with_", [anObject]);
 return self;},
-args: ["aBlock"],
-source: unescape('onHover%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27hover%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: ["anObject"],
+source: unescape('h3%3A%20anObject%0A%20%20%20%20%5Eself%20h3%20with%3A%20anObject'),
+messageSends: ["with:", "h3"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onFocusIn_'),
+unescape('_h4'),
 smalltalk.method({
-selector: unescape('onFocusIn%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('h4'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focusin", aBlock]);
+return smalltalk.send(self, "_tag_", ["h4"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onFocusIn%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27focusin%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('h4%0A%20%20%20%20%5Eself%20tag%3A%20%27h4%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onFocusOut_'),
+unescape('_h4_'),
 smalltalk.method({
-selector: unescape('onFocusOut%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('h4%3A'),
+category: 'tags',
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focusout", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_h4", []), "_with_", [anObject]);
 return self;},
-args: ["aBlock"],
-source: unescape('onFocusOut%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27focusout%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: ["anObject"],
+source: unescape('h4%3A%20anObject%0A%20%20%20%20%5Eself%20h4%20with%3A%20anObject'),
+messageSends: ["with:", "h4"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseDown_'),
+unescape('_h5'),
 smalltalk.method({
-selector: unescape('onMouseDown%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('h5'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mousedown", aBlock]);
+return smalltalk.send(self, "_tag_", ["h5"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onMouseDown%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mousedown%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('h5%0A%20%20%20%20%5Eself%20tag%3A%20%27h5%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseUp_'),
+unescape('_h5_'),
 smalltalk.method({
-selector: unescape('onMouseUp%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('h5%3A'),
+category: 'tags',
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseup", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_h5", []), "_with_", [anObject]);
 return self;},
-args: ["aBlock"],
-source: unescape('onMouseUp%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mouseup%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: ["anObject"],
+source: unescape('h5%3A%20anObject%0A%20%20%20%20%5Eself%20h5%20with%3A%20anObject'),
+messageSends: ["with:", "h5"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseEnter_'),
+unescape('_h6'),
 smalltalk.method({
-selector: unescape('onMouseEnter%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('h6'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseenter", aBlock]);
+return smalltalk.send(self, "_tag_", ["h6"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onMouseEnter%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mouseenter%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('h6%0A%20%20%20%20%5Eself%20tag%3A%20%27h6%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseLeave_'),
+unescape('_h6_'),
 smalltalk.method({
-selector: unescape('onMouseLeave%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('h6%3A'),
+category: 'tags',
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseleave", aBlock]);
+return smalltalk.send(smalltalk.send(self, "_h6", []), "_with_", [anObject]);
 return self;},
-args: ["aBlock"],
-source: unescape('onMouseLeave%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mouseleave%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: ["anObject"],
+source: unescape('h6%3A%20anObject%0A%20%20%20%20%5Eself%20h6%20with%3A%20anObject'),
+messageSends: ["with:", "h6"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseMove_'),
+unescape('_head'),
 smalltalk.method({
-selector: unescape('onMouseMove%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('head'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mousemove", aBlock]);
+return smalltalk.send(self, "_tag_", ["head"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onMouseMove%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mousemove%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('head%0A%09%5Eself%20tag%3A%20%27head%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseOut_'),
+unescape('_header'),
 smalltalk.method({
-selector: unescape('onMouseOut%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('header'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseout", aBlock]);
+return smalltalk.send(self, "_tag_", ["header"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onMouseOut%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mouseout%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('header%0A%20%20%20%20%5Eself%20tag%3A%20%27header%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onMouseOver_'),
+unescape('_hgroup'),
 smalltalk.method({
-selector: unescape('onMouseOver%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('hgroup'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseover", aBlock]);
+return smalltalk.send(self, "_tag_", ["hgroup"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onMouseOver%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mouseover%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('hgroup%0A%09%5Eself%20tag%3A%20%27hgroup%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onSelect_'),
+unescape('_hr'),
 smalltalk.method({
-selector: unescape('onSelect%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('hr'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["select", aBlock]);
+return smalltalk.send(self, "_tag_", ["hr"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onSelect%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27select%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('hr%0A%20%20%20%20%5Eself%20tag%3A%20%27hr%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_onUnload_'),
+unescape('_html'),
 smalltalk.method({
-selector: unescape('onUnload%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('html'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["unload", aBlock]);
+return smalltalk.send(self, "_tag_", ["html"]);
 return self;},
-args: ["aBlock"],
-source: unescape('onUnload%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27unload%27%20do%3A%20aBlock'),
-messageSends: ["bind:do:", "asJQuery"],
+args: [],
+source: unescape('html%0A%09%5Eself%20tag%3A%20%27html%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_for_'),
+unescape('_iframe'),
 smalltalk.method({
-selector: unescape('for%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('iframe'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["for", aString]);
+return smalltalk.send(self, "_tag_", ["iframe"]);
 return self;},
-args: ["aString"],
-source: unescape('for%3A%20aString%0A%09self%20at%3A%20%27for%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('iframe%0A%20%20%20%20%5Eself%20tag%3A%20%27iframe%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_placeholder_'),
+unescape('_iframe_'),
 smalltalk.method({
-selector: unescape('placeholder%3A'),
-category: 'attributes',
+selector: unescape('iframe%3A'),
+category: 'tags',
 fn: function (aString){
 var self=this;
-smalltalk.send(self, "_at_put_", ["placeholder", aString]);
+return smalltalk.send(smalltalk.send(self, "_iframe", []), "_src_", [aString]);
 return self;},
 args: ["aString"],
-source: unescape('placeholder%3A%20aString%0A%09self%20at%3A%20%27placeholder%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+source: unescape('iframe%3A%20aString%0A%20%20%20%20%5Eself%20iframe%20src%3A%20aString'),
+messageSends: ["src:", "iframe"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_accesskey_'),
+unescape('_img'),
 smalltalk.method({
-selector: unescape('accesskey%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('img'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["accesskey", aString]);
+return smalltalk.send(self, "_tag_", ["img"]);
 return self;},
-args: ["aString"],
-source: unescape('accesskey%3A%20aString%0A%09self%20at%3A%20%27accesskey%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('img%0A%20%20%20%20%5Eself%20tag%3A%20%27img%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_contenteditable_'),
+unescape('_img_'),
 smalltalk.method({
-selector: unescape('contenteditable%3A'),
-category: 'attributes',
+selector: unescape('img%3A'),
+category: 'tags',
 fn: function (aString){
 var self=this;
-smalltalk.send(self, "_at_put_", ["contenteditable", aString]);
+return smalltalk.send(smalltalk.send(self, "_img", []), "_src_", [aString]);
 return self;},
 args: ["aString"],
-source: unescape('contenteditable%3A%20aString%0A%09self%20at%3A%20%27contenteditable%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+source: unescape('img%3A%20aString%0A%20%20%20%20%5Eself%20img%20src%3A%20aString'),
+messageSends: ["src:", "img"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_contextmenu_'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('contextmenu%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('initialize'),
+category: 'initialization',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["contextmenu", aString]);
+smalltalk.send(self, "_initialize", [], smalltalk.Object);
+(($receiver = self['@root']) == nil || $receiver == undefined) ? (function(){return (self['@root']=smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromString_canvas_", ["div", self]));})() : $receiver;
 return self;},
-args: ["aString"],
-source: unescape('contextmenu%3A%20aString%0A%09self%20at%3A%20%27contextmenu%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
-referencedClasses: []
+args: [],
+source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20root%20ifNil%3A%20%5Broot%20%3A%3D%20TagBrush%20fromString%3A%20%27div%27%20canvas%3A%20self%5D'),
+messageSends: ["initialize", "ifNil:", "fromString:canvas:"],
+referencedClasses: ["TagBrush"]
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_draggable_'),
+unescape('_initializeFromJQuery_'),
 smalltalk.method({
-selector: unescape('draggable%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('initializeFromJQuery%3A'),
+category: 'initialization',
+fn: function (aJQuery){
 var self=this;
-smalltalk.send(self, "_at_put_", ["draggable", aString]);
+(self['@root']=smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromJQuery_canvas_", [aJQuery, self]));
 return self;},
-args: ["aString"],
-source: unescape('draggable%3A%20aString%0A%09self%20at%3A%20%27draggable%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
-referencedClasses: []
+args: ["aJQuery"],
+source: unescape('initializeFromJQuery%3A%20aJQuery%0A%20%20%20%20root%20%3A%3D%20TagBrush%20fromJQuery%3A%20aJQuery%20canvas%3A%20self'),
+messageSends: ["fromJQuery:canvas:"],
+referencedClasses: ["TagBrush"]
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_hidden'),
+unescape('_input'),
 smalltalk.method({
-selector: unescape('hidden'),
-category: 'attributes',
+selector: unescape('input'),
+category: 'tags',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["hidden", "hidden"]);
+return smalltalk.send(self, "_tag_", ["input"]);
 return self;},
 args: [],
-source: unescape('hidden%0A%09self%20at%3A%20%27hidden%27%20put%3A%20%27hidden%27'),
-messageSends: ["at:put:"],
+source: unescape('input%0A%20%20%20%20%5Eself%20tag%3A%20%27input%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_tabindex_'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('tabindex%3A'),
-category: 'attributes',
-fn: function (aNumber){
+selector: unescape('label'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["tabindex", aNumber]);
+return smalltalk.send(self, "_tag_", ["label"]);
 return self;},
-args: ["aNumber"],
-source: unescape('tabindex%3A%20aNumber%0A%09self%20at%3A%20%27tabindex%27%20put%3A%20aNumber'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('label%0A%09%5Eself%20tag%3A%20%27label%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_target_'),
+unescape('_legend'),
 smalltalk.method({
-selector: unescape('target%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('legend'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["target", aString]);
+return smalltalk.send(self, "_tag_", ["legend"]);
 return self;},
-args: ["aString"],
-source: unescape('target%3A%20aString%0A%09self%20at%3A%20%27target%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('legend%0A%09%5Eself%20tag%3A%20%27legend%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_align_'),
+unescape('_li'),
 smalltalk.method({
-selector: unescape('align%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('li'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["align", aString]);
+return smalltalk.send(self, "_tag_", ["li"]);
 return self;},
-args: ["aString"],
-source: unescape('align%3A%20aString%0A%09self%20at%3A%20%27align%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('li%0A%20%20%20%20%5Eself%20tag%3A%20%27li%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_alt_'),
+unescape('_li_'),
 smalltalk.method({
-selector: unescape('alt%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('li%3A'),
+category: 'tags',
+fn: function (anObject){
 var self=this;
-smalltalk.send(self, "_at_put_", ["alt", aString]);
+return smalltalk.send(smalltalk.send(self, "_li", []), "_with_", [anObject]);
 return self;},
-args: ["aString"],
-source: unescape('alt%3A%20aString%0A%09self%20at%3A%20%27alt%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: ["anObject"],
+source: unescape('li%3A%20anObject%0A%20%20%20%20%5Eself%20li%20with%3A%20anObject'),
+messageSends: ["with:", "li"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_name_'),
+unescape('_link'),
 smalltalk.method({
-selector: unescape('name%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('link'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["name", aString]);
+return smalltalk.send(self, "_tag_", ["link"]);
 return self;},
-args: ["aString"],
-source: unescape('name%3A%20aString%0A%09self%20at%3A%20%27name%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('link%0A%20%20%20%20%5Eself%20tag%3A%20%27link%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_valign_'),
+unescape('_map'),
 smalltalk.method({
-selector: unescape('valign%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('map'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["valign", aString]);
+return smalltalk.send(self, "_tag_", ["map"]);
 return self;},
-args: ["aString"],
-source: unescape('valign%3A%20aString%0A%09self%20at%3A%20%27valign%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('map%0A%09%5Eself%20tag%3A%20%27map%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_method_'),
+unescape('_mark'),
 smalltalk.method({
-selector: unescape('method%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('mark'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["method", aString]);
+return smalltalk.send(self, "_tag_", ["mark"]);
 return self;},
-args: ["aString"],
-source: unescape('method%3A%20aString%0A%09self%20at%3A%20%27method%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('mark%0A%09%5Eself%20tag%3A%20%27mark%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_action_'),
+unescape('_menu'),
 smalltalk.method({
-selector: unescape('action%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('menu'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["action", aString]);
+return smalltalk.send(self, "_tag_", ["menu"]);
 return self;},
-args: ["aString"],
-source: unescape('action%3A%20aString%0A%09self%20at%3A%20%27action%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('menu%0A%09%5Eself%20tag%3A%20%27menu%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_rows_'),
+unescape('_meta'),
 smalltalk.method({
-selector: unescape('rows%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('meta'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["rows", aString]);
+return smalltalk.send(self, "_tag_", ["meta"]);
 return self;},
-args: ["aString"],
-source: unescape('rows%3A%20aString%0A%09self%20at%3A%20%27rows%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('meta%0A%09%5Eself%20tag%3A%20%27meta%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_cols_'),
+unescape('_nav'),
 smalltalk.method({
-selector: unescape('cols%3A'),
-category: 'attributes',
-fn: function (aString){
+selector: unescape('nav'),
+category: 'tags',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_at_put_", ["cols", aString]);
+return smalltalk.send(self, "_tag_", ["nav"]);
 return self;},
-args: ["aString"],
-source: unescape('cols%3A%20aString%0A%09self%20at%3A%20%27cols%27%20put%3A%20aString'),
-messageSends: ["at:put:"],
+args: [],
+source: unescape('nav%0A%09%5Eself%20tag%3A%20%27nav%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush);
-
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_fromString_canvas_'),
+unescape('_newTag_'),
 smalltalk.method({
-selector: unescape('fromString%3Acanvas%3A'),
-category: 'instance creation',
-fn: function (aString, aCanvas){
+selector: unescape('newTag%3A'),
+category: 'tags',
+fn: function (aString){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_initializeFromString_canvas_", [aString, aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromString_canvas_", [aString, self]);
 return self;},
-args: ["aString", "aCanvas"],
-source: unescape('fromString%3A%20aString%20canvas%3A%20aCanvas%0A%20%20%20%20%5Eself%20new%0A%09initializeFromString%3A%20aString%20canvas%3A%20aCanvas%3B%0A%09yourself'),
-messageSends: ["initializeFromString:canvas:", "yourself", "new"],
-referencedClasses: []
+args: ["aString"],
+source: unescape('newTag%3A%20aString%0A%20%20%20%20%5ETagBrush%20fromString%3A%20aString%20canvas%3A%20self'),
+messageSends: ["fromString:canvas:"],
+referencedClasses: ["TagBrush"]
 }),
-smalltalk.TagBrush.klass);
+smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_fromJQuery_canvas_'),
+unescape('_noscript'),
 smalltalk.method({
-selector: unescape('fromJQuery%3Acanvas%3A'),
-category: 'instance creation',
-fn: function (aJQuery, aCanvas){
+selector: unescape('noscript'),
+category: 'tags',
+fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_canvas_", [aJQuery, aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return smalltalk.send(self, "_tag_", ["noscript"]);
 return self;},
-args: ["aJQuery", "aCanvas"],
-source: unescape('fromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%0A%20%20%20%20%5Eself%20new%0A%09initializeFromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%3B%0A%09yourself'),
-messageSends: ["initializeFromJQuery:canvas:", "yourself", "new"],
+args: [],
+source: unescape('noscript%0A%09%5Eself%20tag%3A%20%27noscript%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
-smalltalk.TagBrush.klass);
-
+smalltalk.HTMLCanvas);
 
-smalltalk.addClass('HTMLCanvas', smalltalk.Object, ['root'], 'Canvas');
 smalltalk.addMethod(
-unescape('_root_'),
+unescape('_object'),
 smalltalk.method({
-selector: unescape('root%3A'),
-category: 'accessing',
-fn: function (aTagBrush){
+selector: unescape('object'),
+category: 'tags',
+fn: function (){
 var self=this;
-(self['@root']=aTagBrush);
+return smalltalk.send(self, "_tag_", ["object"]);
 return self;},
-args: ["aTagBrush"],
-source: unescape('root%3A%20aTagBrush%0A%20%20%20%20root%20%3A%3D%20aTagBrush'),
-messageSends: [],
+args: [],
+source: unescape('object%0A%09%5Eself%20tag%3A%20%27object%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_root'),
+unescape('_ol'),
 smalltalk.method({
-selector: unescape('root'),
-category: 'accessing',
+selector: unescape('ol'),
+category: 'tags',
 fn: function (){
 var self=this;
-return self['@root'];
+return smalltalk.send(self, "_tag_", ["ol"]);
 return self;},
 args: [],
-source: unescape('root%0A%20%20%20%20%5Eroot'),
-messageSends: [],
+source: unescape('ol%0A%20%20%20%20%5Eself%20tag%3A%20%27ol%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_with_'),
+unescape('_ol_'),
 smalltalk.method({
-selector: unescape('with%3A'),
-category: 'adding',
+selector: unescape('ol%3A'),
+category: 'tags',
 fn: function (anObject){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_root", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send(self, "_ol", []), "_with_", [anObject]);
 return self;},
 args: ["anObject"],
-source: unescape('with%3A%20anObject%0A%20%20%20%20%5Eself%20root%20with%3A%20anObject'),
-messageSends: ["with:", "root"],
+source: unescape('ol%3A%20anObject%0A%20%20%20%20%5Eself%20ol%20with%3A%20anObject'),
+messageSends: ["with:", "ol"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_optgroup'),
 smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
+selector: unescape('optgroup'),
+category: 'tags',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Object);
-(($receiver = self['@root']) == nil || $receiver == undefined) ? (function(){return (self['@root']=smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromString_canvas_", ["div", self]));})() : $receiver;
+return smalltalk.send(self, "_tag_", ["optgroup"]);
 return self;},
 args: [],
-source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20root%20ifNil%3A%20%5Broot%20%3A%3D%20TagBrush%20fromString%3A%20%27div%27%20canvas%3A%20self%5D'),
-messageSends: ["initialize", "ifNil:", "fromString:canvas:"],
-referencedClasses: ["TagBrush"]
+source: unescape('optgroup%0A%09%5Eself%20tag%3A%20%27optgroup%27'),
+messageSends: ["tag:"],
+referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_initializeFromJQuery_'),
+unescape('_option'),
 smalltalk.method({
-selector: unescape('initializeFromJQuery%3A'),
-category: 'initialization',
-fn: function (aJQuery){
+selector: unescape('option'),
+category: 'tags',
+fn: function (){
 var self=this;
-(self['@root']=smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromJQuery_canvas_", [aJQuery, self]));
+return smalltalk.send(self, "_tag_", ["option"]);
 return self;},
-args: ["aJQuery"],
-source: unescape('initializeFromJQuery%3A%20aJQuery%0A%20%20%20%20root%20%3A%3D%20TagBrush%20fromJQuery%3A%20aJQuery%20canvas%3A%20self'),
-messageSends: ["fromJQuery:canvas:"],
-referencedClasses: ["TagBrush"]
+args: [],
+source: unescape('option%0A%20%20%20%20%5Eself%20tag%3A%20%27option%27'),
+messageSends: ["tag:"],
+referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_newTag_'),
+unescape('_output'),
 smalltalk.method({
-selector: unescape('newTag%3A'),
+selector: unescape('output'),
 category: 'tags',
-fn: function (aString){
+fn: function (){
 var self=this;
-return smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromString_canvas_", [aString, self]);
+return smalltalk.send(self, "_tag_", ["output"]);
 return self;},
-args: ["aString"],
-source: unescape('newTag%3A%20aString%0A%20%20%20%20%5ETagBrush%20fromString%3A%20aString%20canvas%3A%20self'),
-messageSends: ["fromString:canvas:"],
-referencedClasses: ["TagBrush"]
+args: [],
+source: unescape('output%0A%09%5Eself%20tag%3A%20%27output%27'),
+messageSends: ["tag:"],
+referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_tag_'),
+unescape('_p'),
 smalltalk.method({
-selector: unescape('tag%3A'),
+selector: unescape('p'),
 category: 'tags',
-fn: function (aString){
+fn: function (){
 var self=this;
-return smalltalk.send(self['@root'], "_addBrush_", [smalltalk.send(self, "_newTag_", [aString])]);
+return smalltalk.send(self, "_tag_", ["p"]);
 return self;},
-args: ["aString"],
-source: unescape('tag%3A%20aString%0A%20%20%20%20%5Eroot%20addBrush%3A%20%28self%20newTag%3A%20aString%29'),
-messageSends: ["addBrush:", "newTag:"],
+args: [],
+source: unescape('p%0A%20%20%20%20%5Eself%20tag%3A%20%27p%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h1'),
+unescape('_p_'),
 smalltalk.method({
-selector: unescape('h1'),
+selector: unescape('p%3A'),
 category: 'tags',
-fn: function (){
+fn: function (anObject){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h1"]);
+return smalltalk.send(smalltalk.send(self, "_p", []), "_with_", [anObject]);
 return self;},
-args: [],
-source: unescape('h1%0A%20%20%20%20%5Eself%20tag%3A%20%27h1%27'),
-messageSends: ["tag:"],
+args: ["anObject"],
+source: unescape('p%3A%20anObject%0A%20%20%20%20%5Eself%20p%20with%3A%20anObject'),
+messageSends: ["with:", "p"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h2'),
+unescape('_param'),
 smalltalk.method({
-selector: unescape('h2'),
+selector: unescape('param'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h2"]);
+return smalltalk.send(self, "_tag_", ["param"]);
 return self;},
 args: [],
-source: unescape('h2%0A%20%20%20%20%5Eself%20tag%3A%20%27h2%27'),
+source: unescape('param%0A%09%5Eself%20tag%3A%20%27param%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h3'),
+unescape('_pre'),
 smalltalk.method({
-selector: unescape('h3'),
+selector: unescape('pre'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h3"]);
+return smalltalk.send(self, "_tag_", ["pre"]);
 return self;},
 args: [],
-source: unescape('h3%0A%20%20%20%20%5Eself%20tag%3A%20%27h3%27'),
+source: unescape('pre%0A%20%20%20%20%5Eself%20tag%3A%20%27pre%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h4'),
+unescape('_progress'),
 smalltalk.method({
-selector: unescape('h4'),
+selector: unescape('progress'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h4"]);
+return smalltalk.send(self, "_tag_", ["progress"]);
 return self;},
 args: [],
-source: unescape('h4%0A%20%20%20%20%5Eself%20tag%3A%20%27h4%27'),
+source: unescape('progress%0A%09%5Eself%20tag%3A%20%27progress%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h5'),
+unescape('_root'),
 smalltalk.method({
-selector: unescape('h5'),
-category: 'tags',
+selector: unescape('root'),
+category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h5"]);
+return self['@root'];
 return self;},
 args: [],
-source: unescape('h5%0A%20%20%20%20%5Eself%20tag%3A%20%27h5%27'),
-messageSends: ["tag:"],
+source: unescape('root%0A%20%20%20%20%5Eroot'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h6'),
+unescape('_root_'),
 smalltalk.method({
-selector: unescape('h6'),
-category: 'tags',
-fn: function (){
+selector: unescape('root%3A'),
+category: 'accessing',
+fn: function (aTagBrush){
 var self=this;
-return smalltalk.send(self, "_tag_", ["h6"]);
+(self['@root']=aTagBrush);
 return self;},
-args: [],
-source: unescape('h6%0A%20%20%20%20%5Eself%20tag%3A%20%27h6%27'),
-messageSends: ["tag:"],
+args: ["aTagBrush"],
+source: unescape('root%3A%20aTagBrush%0A%20%20%20%20root%20%3A%3D%20aTagBrush'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_p'),
+unescape('_script'),
 smalltalk.method({
-selector: unescape('p'),
+selector: unescape('script'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["p"]);
+return smalltalk.send(self, "_tag_", ["script"]);
 return self;},
 args: [],
-source: unescape('p%0A%20%20%20%20%5Eself%20tag%3A%20%27p%27'),
+source: unescape('script%0A%20%20%20%20%5Eself%20tag%3A%20%27script%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_div'),
+unescape('_section'),
 smalltalk.method({
-selector: unescape('div'),
+selector: unescape('section'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["div"]);
+return smalltalk.send(self, "_tag_", ["section"]);
 return self;},
 args: [],
-source: unescape('div%0A%20%20%20%20%5Eself%20tag%3A%20%27div%27'),
+source: unescape('section%0A%20%20%20%20%5Eself%20tag%3A%20%27section%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_span'),
+unescape('_select'),
 smalltalk.method({
-selector: unescape('span'),
+selector: unescape('select'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["span"]);
+return smalltalk.send(self, "_tag_", ["select"]);
 return self;},
 args: [],
-source: unescape('span%0A%20%20%20%20%5Eself%20tag%3A%20%27span%27'),
+source: unescape('select%0A%20%20%20%20%5Eself%20tag%3A%20%27select%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_img'),
+unescape('_small'),
 smalltalk.method({
-selector: unescape('img'),
+selector: unescape('small'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["img"]);
+return smalltalk.send(self, "_tag_", ["small"]);
 return self;},
 args: [],
-source: unescape('img%0A%20%20%20%20%5Eself%20tag%3A%20%27img%27'),
+source: unescape('small%0A%09%5Eself%20tag%3A%20%27small%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_ul'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('ul'),
+selector: unescape('source'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["ul"]);
+return smalltalk.send(self, "_tag_", ["source"]);
 return self;},
 args: [],
-source: unescape('ul%0A%20%20%20%20%5Eself%20tag%3A%20%27ul%27'),
+source: unescape('source%0A%09%5Eself%20tag%3A%20%27source%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_ol'),
+unescape('_span'),
 smalltalk.method({
-selector: unescape('ol'),
+selector: unescape('span'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["ol"]);
+return smalltalk.send(self, "_tag_", ["span"]);
 return self;},
 args: [],
-source: unescape('ol%0A%20%20%20%20%5Eself%20tag%3A%20%27ol%27'),
+source: unescape('span%0A%20%20%20%20%5Eself%20tag%3A%20%27span%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_li'),
+unescape('_span_'),
 smalltalk.method({
-selector: unescape('li'),
+selector: unescape('span%3A'),
 category: 'tags',
-fn: function (){
+fn: function (anObject){
 var self=this;
-return smalltalk.send(self, "_tag_", ["li"]);
+return smalltalk.send(smalltalk.send(self, "_span", []), "_with_", [anObject]);
 return self;},
-args: [],
-source: unescape('li%0A%20%20%20%20%5Eself%20tag%3A%20%27li%27'),
-messageSends: ["tag:"],
+args: ["anObject"],
+source: unescape('span%3A%20anObject%0A%20%20%20%20%5Eself%20span%20with%3A%20anObject'),
+messageSends: ["with:", "span"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_table'),
+unescape('_strong'),
 smalltalk.method({
-selector: unescape('table'),
+selector: unescape('strong'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["table"]);
+return smalltalk.send(self, "_tag_", ["strong"]);
 return self;},
 args: [],
-source: unescape('table%0A%20%20%20%20%5Eself%20tag%3A%20%27table%27'),
+source: unescape('strong%0A%09%5Eself%20tag%3A%20%27strong%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_tr'),
+unescape('_strong_'),
 smalltalk.method({
-selector: unescape('tr'),
+selector: unescape('strong%3A'),
 category: 'tags',
-fn: function (){
+fn: function (anObject){
 var self=this;
-return smalltalk.send(self, "_tag_", ["tr"]);
+return smalltalk.send(smalltalk.send(self, "_strong", []), "_with_", [anObject]);
 return self;},
-args: [],
-source: unescape('tr%0A%20%20%20%20%5Eself%20tag%3A%20%27tr%27'),
-messageSends: ["tag:"],
+args: ["anObject"],
+source: unescape('strong%3A%20anObject%0A%09%5Eself%20strong%20with%3A%20anObject'),
+messageSends: ["with:", "strong"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_td'),
+unescape('_style'),
 smalltalk.method({
-selector: unescape('td'),
+selector: unescape('style'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["td"]);
+return smalltalk.send(self['@root'], "_addBrush_", [smalltalk.send((smalltalk.StyleTag || StyleTag), "_canvas_", [self])]);
 return self;},
 args: [],
-source: unescape('td%20%0A%20%20%20%20%5Eself%20tag%3A%20%27td%27'),
-messageSends: ["tag:"],
-referencedClasses: []
+source: unescape('style%0A%09%5E%20root%20addBrush%3A%20%20%28StyleTag%20canvas%3A%20self%29'),
+messageSends: ["addBrush:", "canvas:"],
+referencedClasses: ["StyleTag"]
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_th'),
+unescape('_style_'),
 smalltalk.method({
-selector: unescape('th'),
+selector: unescape('style%3A'),
 category: 'tags',
-fn: function (){
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["th"]);
+return (function($rec){smalltalk.send($rec, "_with_", [aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_style", []));
 return self;},
-args: [],
-source: unescape('th%0A%20%20%20%20%5Eself%20tag%3A%20%27th%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('style%3A%20aString%0A%09%5E%20self%20style%20with%3A%20aString%3B%20yourself'),
+messageSends: ["with:", "yourself", "style"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_form'),
+unescape('_sub'),
 smalltalk.method({
-selector: unescape('form'),
+selector: unescape('sub'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["form"]);
+return smalltalk.send(self, "_tag_", ["sub"]);
 return self;},
 args: [],
-source: unescape('form%0A%20%20%20%20%5Eself%20tag%3A%20%27form%27'),
+source: unescape('sub%0A%09%5Eself%20tag%3A%20%27sub%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_input'),
+unescape('_summary'),
 smalltalk.method({
-selector: unescape('input'),
+selector: unescape('summary'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["input"]);
+return smalltalk.send(self, "_tag_", ["summary"]);
 return self;},
 args: [],
-source: unescape('input%0A%20%20%20%20%5Eself%20tag%3A%20%27input%27'),
+source: unescape('summary%0A%09%5Eself%20tag%3A%20%27summary%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_button'),
+unescape('_sup'),
 smalltalk.method({
-selector: unescape('button'),
+selector: unescape('sup'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["button"]);
+return smalltalk.send(self, "_tag_", ["sup"]);
 return self;},
 args: [],
-source: unescape('button%0A%20%20%20%20%5Eself%20tag%3A%20%27button%27'),
+source: unescape('sup%0A%09%5Eself%20tag%3A%20%27sup%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_select'),
+unescape('_table'),
 smalltalk.method({
-selector: unescape('select'),
+selector: unescape('table'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["select"]);
+return smalltalk.send(self, "_tag_", ["table"]);
 return self;},
 args: [],
-source: unescape('select%0A%20%20%20%20%5Eself%20tag%3A%20%27select%27'),
+source: unescape('table%0A%20%20%20%20%5Eself%20tag%3A%20%27table%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_option'),
+unescape('_tag_'),
 smalltalk.method({
-selector: unescape('option'),
+selector: unescape('tag%3A'),
 category: 'tags',
-fn: function (){
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["option"]);
+return smalltalk.send(self['@root'], "_addBrush_", [smalltalk.send(self, "_newTag_", [aString])]);
 return self;},
-args: [],
-source: unescape('option%0A%20%20%20%20%5Eself%20tag%3A%20%27option%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('tag%3A%20aString%0A%20%20%20%20%5Eroot%20addBrush%3A%20%28self%20newTag%3A%20aString%29'),
+messageSends: ["addBrush:", "newTag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_textarea'),
+unescape('_tbody'),
 smalltalk.method({
-selector: unescape('textarea'),
+selector: unescape('tbody'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["textarea"]);
+return smalltalk.send(self, "_tag_", ["tbody"]);
 return self;},
 args: [],
-source: unescape('textarea%0A%20%20%20%20%5Eself%20tag%3A%20%27textarea%27'),
+source: unescape('tbody%0A%20%20%20%20%5Eself%20tag%3A%20%27tbody%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_a'),
+unescape('_td'),
 smalltalk.method({
-selector: unescape('a'),
+selector: unescape('td'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["a"]);
+return smalltalk.send(self, "_tag_", ["td"]);
 return self;},
 args: [],
-source: unescape('a%0A%20%20%20%20%5Eself%20tag%3A%20%27a%27'),
+source: unescape('td%20%0A%20%20%20%20%5Eself%20tag%3A%20%27td%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_canvas'),
+unescape('_textarea'),
 smalltalk.method({
-selector: unescape('canvas'),
+selector: unescape('textarea'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["canvas"]);
+return smalltalk.send(self, "_tag_", ["textarea"]);
 return self;},
 args: [],
-source: unescape('canvas%0A%09%5Eself%20tag%3A%20%27canvas%27'),
+source: unescape('textarea%0A%20%20%20%20%5Eself%20tag%3A%20%27textarea%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_pre'),
+unescape('_tfoot'),
 smalltalk.method({
-selector: unescape('pre'),
+selector: unescape('tfoot'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["pre"]);
+return smalltalk.send(self, "_tag_", ["tfoot"]);
 return self;},
 args: [],
-source: unescape('pre%0A%20%20%20%20%5Eself%20tag%3A%20%27pre%27'),
+source: unescape('tfoot%0A%20%20%20%20%5Eself%20tag%3A%20%27tfoot%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_code'),
+unescape('_th'),
 smalltalk.method({
-selector: unescape('code'),
+selector: unescape('th'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["code"]);
+return smalltalk.send(self, "_tag_", ["th"]);
 return self;},
 args: [],
-source: unescape('code%0A%20%20%20%20%5Eself%20tag%3A%20%27code%27'),
+source: unescape('th%0A%20%20%20%20%5Eself%20tag%3A%20%27th%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_br'),
+unescape('_thead'),
 smalltalk.method({
-selector: unescape('br'),
+selector: unescape('thead'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["br"]);
+return smalltalk.send(self, "_tag_", ["thead"]);
 return self;},
 args: [],
-source: unescape('br%0A%20%20%20%20%5Eself%20tag%3A%20%27br%27'),
+source: unescape('thead%0A%20%20%20%20%5Eself%20tag%3A%20%27thead%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_script'),
+unescape('_time'),
 smalltalk.method({
-selector: unescape('script'),
+selector: unescape('time'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["script"]);
+return smalltalk.send(self, "_tag_", ["time"]);
 return self;},
 args: [],
-source: unescape('script%0A%20%20%20%20%5Eself%20tag%3A%20%27script%27'),
+source: unescape('time%0A%09%5Eself%20tag%3A%20%27time%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_link'),
+unescape('_title'),
 smalltalk.method({
-selector: unescape('link'),
+selector: unescape('title'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["link"]);
+return smalltalk.send(self, "_tag_", ["title"]);
 return self;},
 args: [],
-source: unescape('link%0A%20%20%20%20%5Eself%20tag%3A%20%27link%27'),
+source: unescape('title%0A%09%5Eself%20tag%3A%20%27title%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_style'),
+unescape('_tr'),
 smalltalk.method({
-selector: unescape('style'),
+selector: unescape('tr'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self['@root'], "_addBrush_", [smalltalk.send((smalltalk.StyleTag || StyleTag), "_canvas_", [self])]);
+return smalltalk.send(self, "_tag_", ["tr"]);
 return self;},
 args: [],
-source: unescape('style%0A%09%5E%20root%20addBrush%3A%20%20%28StyleTag%20canvas%3A%20self%29'),
-messageSends: ["addBrush:", "canvas:"],
-referencedClasses: ["StyleTag"]
+source: unescape('tr%0A%20%20%20%20%5Eself%20tag%3A%20%27tr%27'),
+messageSends: ["tag:"],
+referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_p_'),
+unescape('_ul'),
 smalltalk.method({
-selector: unescape('p%3A'),
+selector: unescape('ul'),
 category: 'tags',
-fn: function (anObject){
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_p", []), "_with_", [anObject]);
+return smalltalk.send(self, "_tag_", ["ul"]);
 return self;},
-args: ["anObject"],
-source: unescape('p%3A%20anObject%0A%20%20%20%20%5Eself%20p%20with%3A%20anObject'),
-messageSends: ["with:", "p"],
+args: [],
+source: unescape('ul%0A%20%20%20%20%5Eself%20tag%3A%20%27ul%27'),
+messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_h1_'),
+unescape('_ul_'),
 smalltalk.method({
-selector: unescape('h1%3A'),
+selector: unescape('ul%3A'),
 category: 'tags',
 fn: function (anObject){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h1", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send(self, "_ul", []), "_with_", [anObject]);
 return self;},
 args: ["anObject"],
-source: unescape('h1%3A%20anObject%0A%20%20%20%20%5Eself%20h1%20with%3A%20anObject'),
-messageSends: ["with:", "h1"],
+source: unescape('ul%3A%20anObject%0A%20%20%20%20%5Eself%20ul%20with%3A%20anObject'),
+messageSends: ["with:", "ul"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_iframe'),
+unescape('_video'),
 smalltalk.method({
-selector: unescape('iframe'),
+selector: unescape('video'),
 category: 'tags',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["iframe"]);
+return smalltalk.send(self, "_tag_", ["video"]);
 return self;},
 args: [],
-source: unescape('iframe%0A%20%20%20%20%5Eself%20tag%3A%20%27iframe%27'),
+source: unescape('video%0A%20%20%20%20%5Eself%20tag%3A%20%27video%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
 smalltalk.addMethod(
-unescape('_iframe_'),
-smalltalk.method({
-selector: unescape('iframe%3A'),
-category: 'tags',
-fn: function (aString){
-var self=this;
-return smalltalk.send(smalltalk.send(self, "_iframe", []), "_src_", [aString]);
-return self;},
-args: ["aString"],
-source: unescape('iframe%3A%20aString%0A%20%20%20%20%5Eself%20iframe%20src%3A%20aString'),
-messageSends: ["src:", "iframe"],
-referencedClasses: []
-}),
-smalltalk.HTMLCanvas);
-
-smalltalk.addMethod(
-unescape('_h2_'),
+unescape('_with_'),
 smalltalk.method({
-selector: unescape('h2%3A'),
-category: 'tags',
+selector: unescape('with%3A'),
+category: 'adding',
 fn: function (anObject){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h2", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send(self, "_root", []), "_with_", [anObject]);
 return self;},
 args: ["anObject"],
-source: unescape('h2%3A%20anObject%0A%20%20%20%20%5E%20self%20h2%20with%3A%20anObject'),
-messageSends: ["with:", "h2"],
+source: unescape('with%3A%20anObject%0A%20%20%20%20%5Eself%20root%20with%3A%20anObject'),
+messageSends: ["with:", "root"],
 referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
+
 smalltalk.addMethod(
-unescape('_h3_'),
+unescape('_browserVersion'),
 smalltalk.method({
-selector: unescape('h3%3A'),
-category: 'tags',
-fn: function (anObject){
+selector: unescape('browserVersion'),
+category: 'instance creation',
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h3", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_version", []);
 return self;},
-args: ["anObject"],
-source: unescape('h3%3A%20anObject%0A%20%20%20%20%5Eself%20h3%20with%3A%20anObject'),
-messageSends: ["with:", "h3"],
+args: [],
+source: unescape('browserVersion%0A%09%5E%28jQuery%20at%3A%20%23browser%29%20version'),
+messageSends: ["version", "at:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
 
 smalltalk.addMethod(
-unescape('_h4_'),
+unescape('_isMSIE'),
 smalltalk.method({
-selector: unescape('h4%3A'),
-category: 'tags',
-fn: function (anObject){
+selector: unescape('isMSIE'),
+category: 'instance creation',
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h4", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("msie")]), "_notNil", []);
 return self;},
-args: ["anObject"],
-source: unescape('h4%3A%20anObject%0A%20%20%20%20%5Eself%20h4%20with%3A%20anObject'),
-messageSends: ["with:", "h4"],
+args: [],
+source: unescape('isMSIE%0A%09%5E%28%28jQuery%20at%3A%20%23browser%29%20at%3A%20%23msie%29%20notNil'),
+messageSends: ["notNil", "at:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
 
 smalltalk.addMethod(
-unescape('_h5_'),
+unescape('_isMozilla'),
 smalltalk.method({
-selector: unescape('h5%3A'),
-category: 'tags',
-fn: function (anObject){
+selector: unescape('isMozilla'),
+category: 'instance creation',
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h5", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("mozilla")]), "_notNil", []);
 return self;},
-args: ["anObject"],
-source: unescape('h5%3A%20anObject%0A%20%20%20%20%5Eself%20h5%20with%3A%20anObject'),
-messageSends: ["with:", "h5"],
+args: [],
+source: unescape('isMozilla%0A%09%5E%28%28jQuery%20at%3A%20%23browser%29%20at%3A%20%23mozilla%29%20notNil'),
+messageSends: ["notNil", "at:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
 
 smalltalk.addMethod(
-unescape('_h6_'),
+unescape('_isOpera'),
 smalltalk.method({
-selector: unescape('h6%3A'),
-category: 'tags',
-fn: function (anObject){
+selector: unescape('isOpera'),
+category: 'instance creation',
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_h6", []), "_with_", [anObject]);
+return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("opera")]), "_notNil", []);
 return self;},
-args: ["anObject"],
-source: unescape('h6%3A%20anObject%0A%20%20%20%20%5Eself%20h6%20with%3A%20anObject'),
-messageSends: ["with:", "h6"],
+args: [],
+source: unescape('isOpera%0A%09%5E%28%28jQuery%20at%3A%20%23browser%29%20at%3A%20%23opera%29%20notNil'),
+messageSends: ["notNil", "at:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
 
 smalltalk.addMethod(
-unescape('_img_'),
+unescape('_isWebkit'),
 smalltalk.method({
-selector: unescape('img%3A'),
-category: 'tags',
-fn: function (aString){
+selector: unescape('isWebkit'),
+category: 'instance creation',
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_img", []), "_src_", [aString]);
+return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("webkit")]), "_notNil", []);
 return self;},
-args: ["aString"],
-source: unescape('img%3A%20aString%0A%20%20%20%20%5Eself%20img%20src%3A%20aString'),
-messageSends: ["src:", "img"],
+args: [],
+source: unescape('isWebkit%0A%09%5E%28%28jQuery%20at%3A%20%23browser%29%20at%3A%20%23webkit%29%20notNil'),
+messageSends: ["notNil", "at:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
 
 smalltalk.addMethod(
-unescape('_ol_'),
+unescape('_onJQuery_'),
 smalltalk.method({
-selector: unescape('ol%3A'),
-category: 'tags',
-fn: function (anObject){
+selector: unescape('onJQuery%3A'),
+category: 'instance creation',
+fn: function (aJQuery){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_ol", []), "_with_", [anObject]);
+return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_", [aJQuery]);smalltalk.send($rec, "_initialize", []);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_basicNew", []));
 return self;},
-args: ["anObject"],
-source: unescape('ol%3A%20anObject%0A%20%20%20%20%5Eself%20ol%20with%3A%20anObject'),
-messageSends: ["with:", "ol"],
+args: ["aJQuery"],
+source: unescape('onJQuery%3A%20aJQuery%0A%09%5Eself%20basicNew%0A%09%09initializeFromJQuery%3A%20aJQuery%3B%0A%09%09initialize%3B%0A%09%09yourself'),
+messageSends: ["initializeFromJQuery:", "initialize", "yourself", "basicNew"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.HTMLCanvas.klass);
+
 
+smalltalk.addClass('TagBrush', smalltalk.Object, ['canvas', 'element'], 'Canvas');
 smalltalk.addMethod(
-unescape('_li_'),
+unescape('_accesskey_'),
 smalltalk.method({
-selector: unescape('li%3A'),
-category: 'tags',
-fn: function (anObject){
+selector: unescape('accesskey%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_li", []), "_with_", [anObject]);
+smalltalk.send(self, "_at_put_", ["accesskey", aString]);
 return self;},
-args: ["anObject"],
-source: unescape('li%3A%20anObject%0A%20%20%20%20%5Eself%20li%20with%3A%20anObject'),
-messageSends: ["with:", "li"],
+args: ["aString"],
+source: unescape('accesskey%3A%20aString%0A%09self%20at%3A%20%27accesskey%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_ul_'),
+unescape('_action_'),
 smalltalk.method({
-selector: unescape('ul%3A'),
-category: 'tags',
-fn: function (anObject){
+selector: unescape('action%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_ul", []), "_with_", [anObject]);
+smalltalk.send(self, "_at_put_", ["action", aString]);
 return self;},
-args: ["anObject"],
-source: unescape('ul%3A%20anObject%0A%20%20%20%20%5Eself%20ul%20with%3A%20anObject'),
-messageSends: ["with:", "ul"],
+args: ["aString"],
+source: unescape('action%3A%20aString%0A%09self%20at%3A%20%27action%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_span_'),
+unescape('_addBrush_'),
 smalltalk.method({
-selector: unescape('span%3A'),
-category: 'tags',
-fn: function (anObject){
+selector: unescape('addBrush%3A'),
+category: 'adding',
+fn: function (aTagBrush){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_span", []), "_with_", [anObject]);
+smalltalk.send(self, "_appendChild_", [smalltalk.send(aTagBrush, "_element", [])]);
+return aTagBrush;
 return self;},
-args: ["anObject"],
-source: unescape('span%3A%20anObject%0A%20%20%20%20%5Eself%20span%20with%3A%20anObject'),
-messageSends: ["with:", "span"],
+args: ["aTagBrush"],
+source: unescape('addBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendChild%3A%20aTagBrush%20element.%0A%20%20%20%20%5EaTagBrush'),
+messageSends: ["appendChild:", "element"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_style_'),
+unescape('_align_'),
 smalltalk.method({
-selector: unescape('style%3A'),
-category: 'tags',
+selector: unescape('align%3A'),
+category: 'attributes',
 fn: function (aString){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_with_", [aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_style", []));
+smalltalk.send(self, "_at_put_", ["align", aString]);
 return self;},
 args: ["aString"],
-source: unescape('style%3A%20aString%0A%09%5E%20self%20style%20with%3A%20aString%3B%20yourself'),
-messageSends: ["with:", "yourself", "style"],
+source: unescape('align%3A%20aString%0A%09self%20at%3A%20%27align%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_audio'),
+unescape('_alt_'),
 smalltalk.method({
-selector: unescape('audio'),
-category: 'tags',
-fn: function (){
+selector: unescape('alt%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["audio"]);
+smalltalk.send(self, "_at_put_", ["alt", aString]);
 return self;},
-args: [],
-source: unescape('audio%0A%20%20%20%20%5Eself%20tag%3A%20%27audio%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('alt%3A%20aString%0A%09self%20at%3A%20%27alt%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_fieldset'),
+unescape('_append_'),
 smalltalk.method({
-selector: unescape('fieldset'),
-category: 'tags',
-fn: function (){
+selector: unescape('append%3A'),
+category: 'adding',
+fn: function (anObject){
 var self=this;
-return smalltalk.send(self, "_tag_", ["fieldset"]);
+smalltalk.send(anObject, "_appendToBrush_", [self]);
 return self;},
-args: [],
-source: unescape('fieldset%0A%20%20%20%20%5Eself%20tag%3A%20%27fieldset%27'),
-messageSends: ["tag:"],
+args: ["anObject"],
+source: unescape('append%3A%20anObject%0A%20%20%20%20anObject%20appendToBrush%3A%20self'),
+messageSends: ["appendToBrush:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_footer'),
+unescape('_appendBlock_'),
 smalltalk.method({
-selector: unescape('footer'),
-category: 'tags',
-fn: function (){
+selector: unescape('appendBlock%3A'),
+category: 'adding',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["footer"]);
+var root=nil;
+(root=smalltalk.send(self['@canvas'], "_root", []));
+smalltalk.send(self['@canvas'], "_root_", [self]);
+smalltalk.send(aBlock, "_value_", [self['@canvas']]);
+smalltalk.send(self['@canvas'], "_root_", [root]);
 return self;},
-args: [],
-source: unescape('footer%0A%20%20%20%20%5Eself%20tag%3A%20%27footer%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('appendBlock%3A%20aBlock%0A%20%20%20%20%7C%20root%20%7C%0A%20%20%20%20root%20%3A%3D%20canvas%20root.%0A%20%20%20%20canvas%20root%3A%20self.%0A%20%20%20%20aBlock%20value%3A%20canvas.%0A%20%20%20%20canvas%20root%3A%20root'),
+messageSends: ["root", "root:", "value:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_header'),
+unescape('_appendChild_'),
 smalltalk.method({
-selector: unescape('header'),
-category: 'tags',
-fn: function (){
+selector: unescape('appendChild%3A'),
+category: 'adding',
+fn: function (anElement){
 var self=this;
-return smalltalk.send(self, "_tag_", ["header"]);
+var element=self['@element'];
+ 	if (null == element.canHaveChildren || element.canHaveChildren) {
+		element.appendChild(anElement);
+ 	} else {
+ 		element.text = String(element.text) +  anElement.innerHTML;
+ 	} ;
 return self;},
-args: [],
-source: unescape('header%0A%20%20%20%20%5Eself%20tag%3A%20%27header%27'),
-messageSends: ["tag:"],
+args: ["anElement"],
+source: unescape('appendChild%3A%20anElement%0A%09%22In%20IE7%20and%20IE8%20appendChild%20fails%20on%20several%20node%20types.%20So%20we%20need%20to%20check%22%20%0A%20%09%3Cvar%20element%3Dself%5B%27@element%27%5D%3B%0A%20%09if%20%28null%20%3D%3D%20element.canHaveChildren%20%7C%7C%20element.canHaveChildren%29%20%7B%0A%09%09element.appendChild%28anElement%29%3B%0A%20%09%7D%20else%20%7B%0A%20%09%09element.text%20%3D%20String%28element.text%29%20+%20%20anElement.innerHTML%3B%0A%20%09%7D%20%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_hr'),
+unescape('_appendString_'),
 smalltalk.method({
-selector: unescape('hr'),
-category: 'tags',
-fn: function (){
+selector: unescape('appendString%3A'),
+category: 'adding',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["hr"]);
+smalltalk.send(self, "_appendChild_", [smalltalk.send(self, "_createTextNodeFor_", [aString])]);
 return self;},
-args: [],
-source: unescape('hr%0A%20%20%20%20%5Eself%20tag%3A%20%27hr%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('appendString%3A%20aString%0A%20%20%20%20self%20appendChild%3A%20%28self%20createTextNodeFor%3A%20aString%29'),
+messageSends: ["appendChild:", "createTextNodeFor:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_section'),
+unescape('_appendToBrush_'),
 smalltalk.method({
-selector: unescape('section'),
-category: 'tags',
-fn: function (){
+selector: unescape('appendToBrush%3A'),
+category: 'adding',
+fn: function (aTagBrush){
 var self=this;
-return smalltalk.send(self, "_tag_", ["section"]);
+smalltalk.send(aTagBrush, "_addBrush_", [self]);
 return self;},
-args: [],
-source: unescape('section%0A%20%20%20%20%5Eself%20tag%3A%20%27section%27'),
-messageSends: ["tag:"],
+args: ["aTagBrush"],
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20addBrush%3A%20self'),
+messageSends: ["addBrush:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_tbody'),
+unescape('_asJQuery'),
 smalltalk.method({
-selector: unescape('tbody'),
-category: 'tags',
+selector: unescape('asJQuery'),
+category: 'converting',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["tbody"]);
+return smalltalk.send((typeof window == 'undefined' ? nil : window), "_jQuery_", [smalltalk.send(self, "_element", [])]);
 return self;},
 args: [],
-source: unescape('tbody%0A%20%20%20%20%5Eself%20tag%3A%20%27tbody%27'),
-messageSends: ["tag:"],
+source: unescape('asJQuery%0A%20%20%20%20%5Ewindow%20jQuery%3A%20self%20element'),
+messageSends: ["jQuery:", "element"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_tfoot'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('tfoot'),
-category: 'tags',
-fn: function (){
+selector: unescape('at%3Aput%3A'),
+category: 'attributes',
+fn: function (aString, aValue){
 var self=this;
-return smalltalk.send(self, "_tag_", ["tfoot"]);
+self['@element'].setAttribute(aString, aValue);
 return self;},
-args: [],
-source: unescape('tfoot%0A%20%20%20%20%5Eself%20tag%3A%20%27tfoot%27'),
-messageSends: ["tag:"],
+args: ["aString", "aValue"],
+source: unescape('at%3A%20aString%20put%3A%20aValue%0A%20%20%20%20%3Cself%5B%27@element%27%5D.setAttribute%28aString%2C%20aValue%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_thead'),
+unescape('_class_'),
 smalltalk.method({
-selector: unescape('thead'),
-category: 'tags',
-fn: function (){
+selector: unescape('class%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["thead"]);
+self['@element'].className = aString;
 return self;},
-args: [],
-source: unescape('thead%0A%20%20%20%20%5Eself%20tag%3A%20%27thead%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('class%3A%20aString%0A%20%20%20%20%20%20%3Cself%5B%27@element%27%5D.className%20%3D%20aString%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_video'),
+unescape('_cols_'),
 smalltalk.method({
-selector: unescape('video'),
-category: 'tags',
-fn: function (){
+selector: unescape('cols%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["video"]);
+smalltalk.send(self, "_at_put_", ["cols", aString]);
 return self;},
-args: [],
-source: unescape('video%0A%20%20%20%20%5Eself%20tag%3A%20%27video%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('cols%3A%20aString%0A%09self%20at%3A%20%27cols%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_contenteditable_'),
 smalltalk.method({
-selector: unescape('label'),
-category: 'tags',
-fn: function (){
+selector: unescape('contenteditable%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["label"]);
+smalltalk.send(self, "_at_put_", ["contenteditable", aString]);
 return self;},
-args: [],
-source: unescape('label%0A%09%5Eself%20tag%3A%20%27label%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('contenteditable%3A%20aString%0A%09self%20at%3A%20%27contenteditable%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_title'),
+unescape('_contents_'),
 smalltalk.method({
-selector: unescape('title'),
-category: 'tags',
-fn: function (){
+selector: unescape('contents%3A'),
+category: 'adding',
+fn: function (anObject){
 var self=this;
-return smalltalk.send(self, "_tag_", ["title"]);
+(function($rec){smalltalk.send($rec, "_empty", []);return smalltalk.send($rec, "_append_", [anObject]);})(self);
 return self;},
-args: [],
-source: unescape('title%0A%09%5Eself%20tag%3A%20%27title%27'),
-messageSends: ["tag:"],
+args: ["anObject"],
+source: unescape('contents%3A%20anObject%0A%20%20%20%20self%20%0A%09empty%3B%0A%20%20%20%09append%3A%20anObject'),
+messageSends: ["empty", "append:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_time'),
+unescape('_contextmenu_'),
 smalltalk.method({
-selector: unescape('time'),
-category: 'tags',
-fn: function (){
+selector: unescape('contextmenu%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["time"]);
+smalltalk.send(self, "_at_put_", ["contextmenu", aString]);
 return self;},
-args: [],
-source: unescape('time%0A%09%5Eself%20tag%3A%20%27time%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('contextmenu%3A%20aString%0A%09self%20at%3A%20%27contextmenu%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_sup'),
+unescape('_createElementFor_'),
 smalltalk.method({
-selector: unescape('sup'),
-category: 'tags',
-fn: function (){
+selector: unescape('createElementFor%3A'),
+category: 'private',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["sup"]);
+return document.createElement(String(aString));
 return self;},
-args: [],
-source: unescape('sup%0A%09%5Eself%20tag%3A%20%27sup%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('createElementFor%3A%20aString%0A%09%3Creturn%20document.createElement%28String%28aString%29%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_summary'),
+unescape('_createTextNodeFor_'),
 smalltalk.method({
-selector: unescape('summary'),
-category: 'tags',
-fn: function (){
+selector: unescape('createTextNodeFor%3A'),
+category: 'private',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["summary"]);
+return document.createTextNode(String(aString));
 return self;},
-args: [],
-source: unescape('summary%0A%09%5Eself%20tag%3A%20%27summary%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('createTextNodeFor%3A%20aString%0A%09%3Creturn%20document.createTextNode%28String%28aString%29%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_sub'),
+unescape('_draggable_'),
 smalltalk.method({
-selector: unescape('sub'),
-category: 'tags',
-fn: function (){
+selector: unescape('draggable%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["sub"]);
+smalltalk.send(self, "_at_put_", ["draggable", aString]);
 return self;},
-args: [],
-source: unescape('sub%0A%09%5Eself%20tag%3A%20%27sub%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('draggable%3A%20aString%0A%09self%20at%3A%20%27draggable%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_strong'),
+unescape('_element'),
 smalltalk.method({
-selector: unescape('strong'),
-category: 'tags',
+selector: unescape('element'),
+category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["strong"]);
+return self['@element'];
 return self;},
 args: [],
-source: unescape('strong%0A%09%5Eself%20tag%3A%20%27strong%27'),
-messageSends: ["tag:"],
+source: unescape('element%0A%20%20%20%20%5Eelement'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_strong_'),
+unescape('_empty'),
 smalltalk.method({
-selector: unescape('strong%3A'),
-category: 'tags',
-fn: function (anObject){
+selector: unescape('empty'),
+category: 'adding',
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_strong", []), "_with_", [anObject]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_empty", []);
 return self;},
-args: ["anObject"],
-source: unescape('strong%3A%20anObject%0A%09%5Eself%20strong%20with%3A%20anObject'),
-messageSends: ["with:", "strong"],
+args: [],
+source: unescape('empty%0A%09self%20asJQuery%20empty'),
+messageSends: ["empty", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_for_'),
 smalltalk.method({
-selector: unescape('source'),
-category: 'tags',
-fn: function (){
+selector: unescape('for%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["source"]);
+smalltalk.send(self, "_at_put_", ["for", aString]);
 return self;},
-args: [],
-source: unescape('source%0A%09%5Eself%20tag%3A%20%27source%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('for%3A%20aString%0A%09self%20at%3A%20%27for%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_small'),
+unescape('_height_'),
 smalltalk.method({
-selector: unescape('small'),
-category: 'tags',
-fn: function (){
+selector: unescape('height%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["small"]);
+smalltalk.send(self, "_at_put_", ["height", aString]);
 return self;},
-args: [],
-source: unescape('small%0A%09%5Eself%20tag%3A%20%27small%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('height%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27height%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_progress'),
+unescape('_hidden'),
 smalltalk.method({
-selector: unescape('progress'),
-category: 'tags',
+selector: unescape('hidden'),
+category: 'attributes',
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_tag_", ["progress"]);
+smalltalk.send(self, "_at_put_", ["hidden", "hidden"]);
 return self;},
 args: [],
-source: unescape('progress%0A%09%5Eself%20tag%3A%20%27progress%27'),
-messageSends: ["tag:"],
+source: unescape('hidden%0A%09self%20at%3A%20%27hidden%27%20put%3A%20%27hidden%27'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_param'),
+unescape('_href_'),
 smalltalk.method({
-selector: unescape('param'),
-category: 'tags',
-fn: function (){
+selector: unescape('href%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["param"]);
+smalltalk.send(self, "_at_put_", ["href", aString]);
 return self;},
-args: [],
-source: unescape('param%0A%09%5Eself%20tag%3A%20%27param%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('href%3A%20aString%0A%20%20%20%20self%20at%3A%20%27href%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_output'),
+unescape('_id_'),
 smalltalk.method({
-selector: unescape('output'),
-category: 'tags',
-fn: function (){
+selector: unescape('id%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["output"]);
+smalltalk.send(self, "_at_put_", ["id", aString]);
 return self;},
-args: [],
-source: unescape('output%0A%09%5Eself%20tag%3A%20%27output%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('id%3A%20aString%0A%20%20%20%20self%20at%3A%20%27id%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_optgroup'),
+unescape('_initializeFromJQuery_canvas_'),
 smalltalk.method({
-selector: unescape('optgroup'),
-category: 'tags',
-fn: function (){
+selector: unescape('initializeFromJQuery%3Acanvas%3A'),
+category: 'initialization',
+fn: function (aJQuery, aCanvas){
 var self=this;
-return smalltalk.send(self, "_tag_", ["optgroup"]);
+(self['@element']=smalltalk.send(aJQuery, "_get_", [(0)]));
+(self['@canvas']=aCanvas);
 return self;},
-args: [],
-source: unescape('optgroup%0A%09%5Eself%20tag%3A%20%27optgroup%27'),
-messageSends: ["tag:"],
+args: ["aJQuery", "aCanvas"],
+source: unescape('initializeFromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%0A%20%20%20%20element%20%3A%3D%20aJQuery%20get%3A%200.%0A%20%20%20%20canvas%20%3A%3D%20aCanvas'),
+messageSends: ["get:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_object'),
+unescape('_initializeFromString_canvas_'),
 smalltalk.method({
-selector: unescape('object'),
-category: 'tags',
-fn: function (){
+selector: unescape('initializeFromString%3Acanvas%3A'),
+category: 'initialization',
+fn: function (aString, aCanvas){
 var self=this;
-return smalltalk.send(self, "_tag_", ["object"]);
+(self['@element']=smalltalk.send(self, "_createElementFor_", [aString]));
+(self['@canvas']=aCanvas);
 return self;},
-args: [],
-source: unescape('object%0A%09%5Eself%20tag%3A%20%27object%27'),
-messageSends: ["tag:"],
+args: ["aString", "aCanvas"],
+source: unescape('initializeFromString%3A%20aString%20canvas%3A%20aCanvas%0A%20%20%20%20element%20%3A%3D%20self%20createElementFor%3A%20aString.%0A%20%20%20%20canvas%20%3A%3D%20aCanvas'),
+messageSends: ["createElementFor:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_noscript'),
+unescape('_media_'),
 smalltalk.method({
-selector: unescape('noscript'),
-category: 'tags',
-fn: function (){
+selector: unescape('media%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["noscript"]);
+smalltalk.send(self, "_at_put_", ["media", aString]);
 return self;},
-args: [],
-source: unescape('noscript%0A%09%5Eself%20tag%3A%20%27noscript%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('media%3A%20aString%0A%20%20%20%20self%20at%3A%20%27media%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_nav'),
+unescape('_method_'),
 smalltalk.method({
-selector: unescape('nav'),
-category: 'tags',
-fn: function (){
+selector: unescape('method%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["nav"]);
+smalltalk.send(self, "_at_put_", ["method", aString]);
 return self;},
-args: [],
-source: unescape('nav%0A%09%5Eself%20tag%3A%20%27nav%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('method%3A%20aString%0A%09self%20at%3A%20%27method%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_meta'),
+unescape('_name_'),
 smalltalk.method({
-selector: unescape('meta'),
-category: 'tags',
-fn: function (){
+selector: unescape('name%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["meta"]);
+smalltalk.send(self, "_at_put_", ["name", aString]);
 return self;},
-args: [],
-source: unescape('meta%0A%09%5Eself%20tag%3A%20%27meta%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('name%3A%20aString%0A%09self%20at%3A%20%27name%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_menu'),
+unescape('_onBlur_'),
 smalltalk.method({
-selector: unescape('menu'),
-category: 'tags',
-fn: function (){
+selector: unescape('onBlur%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["menu"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["blur", aBlock]);
 return self;},
-args: [],
-source: unescape('menu%0A%09%5Eself%20tag%3A%20%27menu%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onBlur%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27blur%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_mark'),
+unescape('_onChange_'),
 smalltalk.method({
-selector: unescape('mark'),
-category: 'tags',
-fn: function (){
+selector: unescape('onChange%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["mark"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["change", aBlock]);
 return self;},
-args: [],
-source: unescape('mark%0A%09%5Eself%20tag%3A%20%27mark%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onChange%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27change%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_map'),
+unescape('_onClick_'),
 smalltalk.method({
-selector: unescape('map'),
-category: 'tags',
-fn: function (){
+selector: unescape('onClick%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["map"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["click", aBlock]);
 return self;},
-args: [],
-source: unescape('map%0A%09%5Eself%20tag%3A%20%27map%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onClick%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27click%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_legend'),
+unescape('_onDblClick_'),
 smalltalk.method({
-selector: unescape('legend'),
-category: 'tags',
-fn: function (){
+selector: unescape('onDblClick%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["legend"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["dblclick", aBlock]);
 return self;},
-args: [],
-source: unescape('legend%0A%09%5Eself%20tag%3A%20%27legend%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onDblClick%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27dblclick%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_html'),
+unescape('_onFocus_'),
 smalltalk.method({
-selector: unescape('html'),
-category: 'tags',
-fn: function (){
+selector: unescape('onFocus%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["html"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focus", aBlock]);
 return self;},
-args: [],
-source: unescape('html%0A%09%5Eself%20tag%3A%20%27html%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onFocus%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27focus%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_hgroup'),
+unescape('_onFocusIn_'),
 smalltalk.method({
-selector: unescape('hgroup'),
-category: 'tags',
-fn: function (){
+selector: unescape('onFocusIn%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["hgroup"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focusin", aBlock]);
 return self;},
-args: [],
-source: unescape('hgroup%0A%09%5Eself%20tag%3A%20%27hgroup%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onFocusIn%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27focusin%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_head'),
+unescape('_onFocusOut_'),
 smalltalk.method({
-selector: unescape('head'),
-category: 'tags',
-fn: function (){
+selector: unescape('onFocusOut%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["head"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["focusout", aBlock]);
 return self;},
-args: [],
-source: unescape('head%0A%09%5Eself%20tag%3A%20%27head%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onFocusOut%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27focusout%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_figure'),
+unescape('_onHover_'),
 smalltalk.method({
-selector: unescape('figure'),
-category: 'tags',
-fn: function (){
+selector: unescape('onHover%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["figure"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["hover", aBlock]);
 return self;},
-args: [],
-source: unescape('figure%0A%09%5Eself%20tag%3A%20%27figure%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onHover%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27hover%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_figcaption'),
+unescape('_onKeyDown_'),
 smalltalk.method({
-selector: unescape('figcaption'),
-category: 'tags',
-fn: function (){
+selector: unescape('onKeyDown%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["figcaption"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keydown", aBlock]);
 return self;},
-args: [],
-source: unescape('figcaption%0A%09%5Eself%20tag%3A%20%27figcaption%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onKeyDown%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27keydown%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_embed'),
+unescape('_onKeyPress_'),
 smalltalk.method({
-selector: unescape('embed'),
-category: 'tags',
-fn: function (){
+selector: unescape('onKeyPress%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["embed"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keypress", aBlock]);
 return self;},
-args: [],
-source: unescape('embed%0A%09%5Eself%20tag%3A%20%27embed%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onKeyPress%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27keypress%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_em'),
+unescape('_onKeyUp_'),
 smalltalk.method({
-selector: unescape('em'),
-category: 'tags',
-fn: function (){
+selector: unescape('onKeyUp%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["em"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["keyup", aBlock]);
 return self;},
-args: [],
-source: unescape('em%0A%09%5Eself%20tag%3A%20%27em%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onKeyUp%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20bind%3A%20%27keyup%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_dt'),
+unescape('_onMouseDown_'),
 smalltalk.method({
-selector: unescape('dt'),
-category: 'tags',
-fn: function (){
+selector: unescape('onMouseDown%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["dt"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mousedown", aBlock]);
 return self;},
-args: [],
-source: unescape('dt%0A%09%5Eself%20tag%3A%20%27dt%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onMouseDown%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mousedown%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_dl'),
+unescape('_onMouseEnter_'),
 smalltalk.method({
-selector: unescape('dl'),
-category: 'tags',
-fn: function (){
+selector: unescape('onMouseEnter%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["dl"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseenter", aBlock]);
 return self;},
-args: [],
-source: unescape('dl%0A%09%5Eself%20tag%3A%20%27dl%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onMouseEnter%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mouseenter%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_details'),
+unescape('_onMouseLeave_'),
 smalltalk.method({
-selector: unescape('details'),
-category: 'tags',
-fn: function (){
+selector: unescape('onMouseLeave%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["details"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseleave", aBlock]);
 return self;},
-args: [],
-source: unescape('details%0A%09%5Eself%20tag%3A%20%27details%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onMouseLeave%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mouseleave%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_del'),
+unescape('_onMouseMove_'),
 smalltalk.method({
-selector: unescape('del'),
-category: 'tags',
-fn: function (){
+selector: unescape('onMouseMove%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["del"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mousemove", aBlock]);
 return self;},
-args: [],
-source: unescape('del%0A%09%5Eself%20tag%3A%20%27del%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onMouseMove%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mousemove%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_dd'),
+unescape('_onMouseOut_'),
 smalltalk.method({
-selector: unescape('dd'),
-category: 'tags',
-fn: function (){
+selector: unescape('onMouseOut%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["dd"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseout", aBlock]);
 return self;},
-args: [],
-source: unescape('dd%0A%09%5Eself%20tag%3A%20%27dd%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onMouseOut%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mouseout%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_datalist'),
+unescape('_onMouseOver_'),
 smalltalk.method({
-selector: unescape('datalist'),
-category: 'tags',
-fn: function (){
+selector: unescape('onMouseOver%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["datalist"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseover", aBlock]);
 return self;},
-args: [],
-source: unescape('datalist%0A%09%5Eself%20tag%3A%20%27datalist%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onMouseOver%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mouseover%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_command'),
+unescape('_onMouseUp_'),
 smalltalk.method({
-selector: unescape('command'),
-category: 'tags',
-fn: function (){
+selector: unescape('onMouseUp%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["command"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["mouseup", aBlock]);
 return self;},
-args: [],
-source: unescape('command%0A%09%5Eself%20tag%3A%20%27command%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onMouseUp%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27mouseup%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_colgroup'),
+unescape('_onSelect_'),
 smalltalk.method({
-selector: unescape('colgroup'),
-category: 'tags',
-fn: function (){
+selector: unescape('onSelect%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["colgroup"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["select", aBlock]);
 return self;},
-args: [],
-source: unescape('colgroup%0A%09%5Eself%20tag%3A%20%27colgroup%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onSelect%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27select%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_col'),
+unescape('_onSubmit_'),
 smalltalk.method({
-selector: unescape('col'),
-category: 'tags',
-fn: function (){
+selector: unescape('onSubmit%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["col"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["submit", aBlock]);
 return self;},
-args: [],
-source: unescape('col%0A%09%5Eself%20tag%3A%20%27col%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onSubmit%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27submit%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_cite'),
+unescape('_onUnload_'),
 smalltalk.method({
-selector: unescape('cite'),
-category: 'tags',
-fn: function (){
+selector: unescape('onUnload%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_tag_", ["cite"]);
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_bind_do_", ["unload", aBlock]);
 return self;},
-args: [],
-source: unescape('cite%0A%09%5Eself%20tag%3A%20%27cite%27'),
-messageSends: ["tag:"],
+args: ["aBlock"],
+source: unescape('onUnload%3A%20aBlock%0A%09self%20asJQuery%20bind%3A%20%27unload%27%20do%3A%20aBlock'),
+messageSends: ["bind:do:", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_caption'),
+unescape('_placeholder_'),
 smalltalk.method({
-selector: unescape('caption'),
-category: 'tags',
-fn: function (){
+selector: unescape('placeholder%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["caption"]);
+smalltalk.send(self, "_at_put_", ["placeholder", aString]);
 return self;},
-args: [],
-source: unescape('caption%0A%09%5Eself%20tag%3A%20%27caption%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('placeholder%3A%20aString%0A%09self%20at%3A%20%27placeholder%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_body'),
+unescape('_rel_'),
 smalltalk.method({
-selector: unescape('body'),
-category: 'tags',
-fn: function (){
+selector: unescape('rel%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["body"]);
+smalltalk.send(self, "_at_put_", ["rel", aString]);
 return self;},
-args: [],
-source: unescape('body%0A%09%5Eself%20tag%3A%20%27body%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('rel%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27rel%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_blockquote'),
+unescape('_removeAt_'),
 smalltalk.method({
-selector: unescape('blockquote'),
-category: 'tags',
-fn: function (){
+selector: unescape('removeAt%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["blockquote"]);
+self['@element'].removeAttribute(aString);
 return self;},
-args: [],
-source: unescape('blockquote%0A%09%5Eself%20tag%3A%20%27blockquote%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('removeAt%3A%20aString%0A%20%20%20%20%3Cself%5B%27@element%27%5D.removeAttribute%28aString%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_base'),
+unescape('_rows_'),
 smalltalk.method({
-selector: unescape('base'),
-category: 'tags',
-fn: function (){
+selector: unescape('rows%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["base"]);
+smalltalk.send(self, "_at_put_", ["rows", aString]);
 return self;},
-args: [],
-source: unescape('base%0A%09%5Eself%20tag%3A%20%27base%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('rows%3A%20aString%0A%09self%20at%3A%20%27rows%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_aside'),
+unescape('_src_'),
 smalltalk.method({
-selector: unescape('aside'),
-category: 'tags',
-fn: function (){
+selector: unescape('src%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["aside"]);
+smalltalk.send(self, "_at_put_", ["src", aString]);
 return self;},
-args: [],
-source: unescape('aside%0A%09%5Eself%20tag%3A%20%27aside%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('src%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27src%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_article'),
+unescape('_style_'),
 smalltalk.method({
-selector: unescape('article'),
-category: 'tags',
-fn: function (){
+selector: unescape('style%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["article"]);
+smalltalk.send(self, "_at_put_", ["style", aString]);
 return self;},
-args: [],
-source: unescape('article%0A%20%20%20%20%5Eself%20tag%3A%20%27article%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('style%3A%20aString%0A%20%20%20%20self%20at%3A%20%27style%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_area'),
+unescape('_tabindex_'),
 smalltalk.method({
-selector: unescape('area'),
-category: 'tags',
-fn: function (){
+selector: unescape('tabindex%3A'),
+category: 'attributes',
+fn: function (aNumber){
 var self=this;
-return smalltalk.send(self, "_tag_", ["area"]);
+smalltalk.send(self, "_at_put_", ["tabindex", aNumber]);
 return self;},
-args: [],
-source: unescape('area%0A%09%5Eself%20tag%3A%20%27area%27'),
-messageSends: ["tag:"],
+args: ["aNumber"],
+source: unescape('tabindex%3A%20aNumber%0A%09self%20at%3A%20%27tabindex%27%20put%3A%20aNumber'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_address'),
-smalltalk.method({
-selector: unescape('address'),
-category: 'tags',
-fn: function (){
+unescape('_target_'),
+smalltalk.method({
+selector: unescape('target%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["address"]);
+smalltalk.send(self, "_at_put_", ["target", aString]);
 return self;},
-args: [],
-source: unescape('address%0A%09%5Eself%20tag%3A%20%27address%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('target%3A%20aString%0A%09self%20at%3A%20%27target%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_abbr'),
+unescape('_title_'),
 smalltalk.method({
-selector: unescape('abbr'),
-category: 'tags',
-fn: function (){
+selector: unescape('title%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(self, "_tag_", ["abbr"]);
+smalltalk.send(self, "_at_put_", ["title", aString]);
 return self;},
-args: [],
-source: unescape('abbr%0A%09%5Eself%20tag%3A%20%27abbr%27'),
-messageSends: ["tag:"],
+args: ["aString"],
+source: unescape('title%3A%20aString%0A%20%20%20%20self%20at%3A%20%27title%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_div_'),
+unescape('_type_'),
 smalltalk.method({
-selector: unescape('div%3A'),
-category: 'tags',
-fn: function (aBlock){
+selector: unescape('type%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_div", []), "_with_", [aBlock]);
+smalltalk.send(self, "_at_put_", ["type", aString]);
 return self;},
-args: ["aBlock"],
-source: unescape('div%3A%20aBlock%0A%20%20%20%20%5Eself%20div%20with%3A%20aBlock'),
-messageSends: ["with:", "div"],
+args: ["aString"],
+source: unescape('type%3A%20aString%0A%20%20%20%20self%20at%3A%20%27type%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas);
-
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_onJQuery_'),
+unescape('_valign_'),
 smalltalk.method({
-selector: unescape('onJQuery%3A'),
-category: 'instance creation',
-fn: function (aJQuery){
+selector: unescape('valign%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_", [aJQuery]);smalltalk.send($rec, "_initialize", []);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_basicNew", []));
+smalltalk.send(self, "_at_put_", ["valign", aString]);
 return self;},
-args: ["aJQuery"],
-source: unescape('onJQuery%3A%20aJQuery%0A%09%5Eself%20basicNew%0A%09%09initializeFromJQuery%3A%20aJQuery%3B%0A%09%09initialize%3B%0A%09%09yourself'),
-messageSends: ["initializeFromJQuery:", "initialize", "yourself", "basicNew"],
+args: ["aString"],
+source: unescape('valign%3A%20aString%0A%09self%20at%3A%20%27valign%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_isMSIE'),
+unescape('_value_'),
 smalltalk.method({
-selector: unescape('isMSIE'),
-category: 'instance creation',
-fn: function (){
+selector: unescape('value%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("msie")]), "_notNil", []);
+smalltalk.send(self, "_at_put_", ["value", aString]);
 return self;},
-args: [],
-source: unescape('isMSIE%0A%09%5E%28%28jQuery%20at%3A%20%23browser%29%20at%3A%20%23msie%29%20notNil'),
-messageSends: ["notNil", "at:"],
+args: ["aString"],
+source: unescape('value%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27value%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_isOpera'),
+unescape('_width_'),
 smalltalk.method({
-selector: unescape('isOpera'),
-category: 'instance creation',
-fn: function (){
+selector: unescape('width%3A'),
+category: 'attributes',
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("opera")]), "_notNil", []);
+smalltalk.send(self, "_at_put_", ["width", aString]);
 return self;},
-args: [],
-source: unescape('isOpera%0A%09%5E%28%28jQuery%20at%3A%20%23browser%29%20at%3A%20%23opera%29%20notNil'),
-messageSends: ["notNil", "at:"],
+args: ["aString"],
+source: unescape('width%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27width%27%20put%3A%20aString'),
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush);
 
 smalltalk.addMethod(
-unescape('_isMozilla'),
+unescape('_with_'),
 smalltalk.method({
-selector: unescape('isMozilla'),
-category: 'instance creation',
-fn: function (){
+selector: unescape('with%3A'),
+category: 'adding',
+fn: function (anObject){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("mozilla")]), "_notNil", []);
+smalltalk.send(self, "_append_", [anObject]);
 return self;},
-args: [],
-source: unescape('isMozilla%0A%09%5E%28%28jQuery%20at%3A%20%23browser%29%20at%3A%20%23mozilla%29%20notNil'),
-messageSends: ["notNil", "at:"],
+args: ["anObject"],
+source: unescape('with%3A%20anObject%0A%20%20%20%20self%20append%3A%20anObject'),
+messageSends: ["append:"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush);
+
 
 smalltalk.addMethod(
-unescape('_isWebkit'),
+unescape('_fromJQuery_canvas_'),
 smalltalk.method({
-selector: unescape('isWebkit'),
+selector: unescape('fromJQuery%3Acanvas%3A'),
 category: 'instance creation',
-fn: function (){
+fn: function (aJQuery, aCanvas){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_at_", [smalltalk.symbolFor("webkit")]), "_notNil", []);
+return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_canvas_", [aJQuery, aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-args: [],
-source: unescape('isWebkit%0A%09%5E%28%28jQuery%20at%3A%20%23browser%29%20at%3A%20%23webkit%29%20notNil'),
-messageSends: ["notNil", "at:"],
+args: ["aJQuery", "aCanvas"],
+source: unescape('fromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%0A%20%20%20%20%5Eself%20new%0A%09initializeFromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%3B%0A%09yourself'),
+messageSends: ["initializeFromJQuery:canvas:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush.klass);
 
 smalltalk.addMethod(
-unescape('_browserVersion'),
+unescape('_fromString_canvas_'),
 smalltalk.method({
-selector: unescape('browserVersion'),
+selector: unescape('fromString%3Acanvas%3A'),
 category: 'instance creation',
-fn: function (){
+fn: function (aString, aCanvas){
 var self=this;
-return smalltalk.send(smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_at_", [smalltalk.symbolFor("browser")]), "_version", []);
+return (function($rec){smalltalk.send($rec, "_initializeFromString_canvas_", [aString, aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-args: [],
-source: unescape('browserVersion%0A%09%5E%28jQuery%20at%3A%20%23browser%29%20version'),
-messageSends: ["version", "at:"],
+args: ["aString", "aCanvas"],
+source: unescape('fromString%3A%20aString%20canvas%3A%20aCanvas%0A%20%20%20%20%5Eself%20new%0A%09initializeFromString%3A%20aString%20canvas%3A%20aCanvas%3B%0A%09yourself'),
+messageSends: ["initializeFromString:canvas:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.HTMLCanvas.klass);
+smalltalk.TagBrush.klass);
 
 
 smalltalk.addClass('StyleTag', smalltalk.TagBrush, ['canvas', 'element'], 'Canvas');
@@ -3097,21 +3046,56 @@ referencedClasses: []
 smalltalk.StyleTag.klass);
 
 
+smalltalk.addClass('Widget', smalltalk.Object, [], 'Canvas');
+smalltalk.addMethod(
+unescape('_appendToBrush_'),
+smalltalk.method({
+selector: unescape('appendToBrush%3A'),
+category: 'adding',
+fn: function (aTagBrush){
+var self=this;
+smalltalk.send(self, "_appendToJQuery_", [smalltalk.send(aTagBrush, "_asJQuery", [])]);
+return self;},
+args: ["aTagBrush"],
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendToJQuery%3A%20aTagBrush%20asJQuery'),
+messageSends: ["appendToJQuery:", "asJQuery"],
+referencedClasses: []
+}),
+smalltalk.Widget);
+
 smalltalk.addMethod(
 unescape('_appendToJQuery_'),
 smalltalk.method({
 selector: unescape('appendToJQuery%3A'),
-category: '*Canvas',
+category: 'adding',
 fn: function (aJQuery){
 var self=this;
-smalltalk.send(aJQuery, "_append_", [smalltalk.send(self, "_asString", [])]);
+smalltalk.send(self, "_renderOn_", [smalltalk.send((smalltalk.HTMLCanvas || HTMLCanvas), "_onJQuery_", [aJQuery])]);
 return self;},
 args: ["aJQuery"],
-source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20aJQuery%20append%3A%20self%20asString'),
-messageSends: ["append:", "asString"],
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20self%20renderOn%3A%20%28HTMLCanvas%20onJQuery%3A%20aJQuery%29'),
+messageSends: ["renderOn:", "onJQuery:"],
+referencedClasses: ["HTMLCanvas"]
+}),
+smalltalk.Widget);
+
+smalltalk.addMethod(
+unescape('_renderOn_'),
+smalltalk.method({
+selector: unescape('renderOn%3A'),
+category: 'rendering',
+fn: function (html){
+var self=this;
+self;
+return self;},
+args: ["html"],
+source: unescape('renderOn%3A%20html%0A%20%20%20%20self'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Object);
+smalltalk.Widget);
+
+
 
 smalltalk.addMethod(
 unescape('_appendToBrush_'),
@@ -3136,14 +3120,14 @@ selector: unescape('appendToJQuery%3A'),
 category: '*Canvas',
 fn: function (aJQuery){
 var self=this;
-smalltalk.send(self, "_value_", [smalltalk.send((smalltalk.HTMLCanvas || HTMLCanvas), "_onJQuery_", [aJQuery])]);
+smalltalk.send(aJQuery, "_append_", [smalltalk.send(self, "_asString", [])]);
 return self;},
 args: ["aJQuery"],
-source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20self%20value%3A%20%28HTMLCanvas%20onJQuery%3A%20aJQuery%29'),
-messageSends: ["value:", "onJQuery:"],
-referencedClasses: ["HTMLCanvas"]
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20aJQuery%20append%3A%20self%20asString'),
+messageSends: ["append:", "asString"],
+referencedClasses: []
 }),
-smalltalk.BlockClosure);
+smalltalk.Object);
 
 smalltalk.addMethod(
 unescape('_appendToBrush_'),
@@ -3162,17 +3146,33 @@ referencedClasses: []
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_asJQuery'),
+unescape('_appendToJQuery_'),
 smalltalk.method({
-selector: unescape('asJQuery'),
+selector: unescape('appendToJQuery%3A'),
 category: '*Canvas',
-fn: function (){
+fn: function (aJQuery){
 var self=this;
-return jQuery(String(self));
+smalltalk.send(self, "_value_", [smalltalk.send((smalltalk.HTMLCanvas || HTMLCanvas), "_onJQuery_", [aJQuery])]);
 return self;},
-args: [],
-source: unescape('asJQuery%0A%20%20%20%20%3Creturn%20jQuery%28String%28self%29%29%3E'),
-messageSends: [],
+args: ["aJQuery"],
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20self%20value%3A%20%28HTMLCanvas%20onJQuery%3A%20aJQuery%29'),
+messageSends: ["value:", "onJQuery:"],
+referencedClasses: ["HTMLCanvas"]
+}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+unescape('_appendToBrush_'),
+smalltalk.method({
+selector: unescape('appendToBrush%3A'),
+category: '*Canvas',
+fn: function (aTagBrush){
+var self=this;
+smalltalk.send(aTagBrush, "_appendString_", [self]);
+return self;},
+args: ["aTagBrush"],
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20appendString%3A%20self'),
+messageSends: ["appendString:"],
 referencedClasses: []
 }),
 smalltalk.String);
@@ -3194,17 +3194,17 @@ referencedClasses: []
 smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_appendToBrush_'),
+unescape('_asJQuery'),
 smalltalk.method({
-selector: unescape('appendToBrush%3A'),
+selector: unescape('asJQuery'),
 category: '*Canvas',
-fn: function (aTagBrush){
+fn: function (){
 var self=this;
-smalltalk.send(aTagBrush, "_appendString_", [self]);
+return jQuery(String(self));
 return self;},
-args: ["aTagBrush"],
-source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20appendString%3A%20self'),
-messageSends: ["appendString:"],
+args: [],
+source: unescape('asJQuery%0A%20%20%20%20%3Creturn%20jQuery%28String%28self%29%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.String);
diff --git a/amber/src/js/Compiler.deploy.js b/amber/src/js/Compiler.deploy.js
index a99d9324a2a..1d973a2c2d9 100644
--- a/amber/src/js/Compiler.deploy.js
+++ b/amber/src/js/Compiler.deploy.js
@@ -1,221 +1,209 @@
 smalltalk.addPackage('Compiler', {});
-smalltalk.addClass('NodeVisitor', smalltalk.Object, [], 'Compiler');
+smalltalk.addClass('ChunkParser', smalltalk.Object, ['stream'], 'Compiler');
 smalltalk.addMethod(
-unescape('_visit_'),
+unescape('_nextChunk'),
 smalltalk.method({
-selector: unescape('visit%3A'),
-fn: function (aNode){
+selector: unescape('nextChunk'),
+fn: function (){
 var self=this;
-smalltalk.send(aNode, "_accept_", [self]);
-return self;}
+try{var char_=nil;
+var result=nil;
+var chunk=nil;
+(result=smalltalk.send("", "_writeStream", []));
+(function(){while((function(){(char_=smalltalk.send(self['@stream'], "_next", []));return smalltalk.send(char_, "_notNil", []);})()) {(function(){((($receiver = smalltalk.send(char_, "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@stream'], "_peek", []), "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_next", []);})() : (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_next", []);}), (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@stream'], "_peek", []), "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_next", []);})() : (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_next", []);}), (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})]));})]));return smalltalk.send(result, "_nextPut_", [char_]);})()}})();
+(function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return nil}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_nextChunk'){return e.fn()} throw(e)}}
 }),
-smalltalk.NodeVisitor);
+smalltalk.ChunkParser);
 
 smalltalk.addMethod(
-unescape('_visitNode_'),
+unescape('_stream_'),
 smalltalk.method({
-selector: unescape('visitNode%3A'),
-fn: function (aNode){
+selector: unescape('stream%3A'),
+fn: function (aStream){
 var self=this;
-
+(self['@stream']=aStream);
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.ChunkParser);
 
-smalltalk.addMethod(
-unescape('_visitMethodNode_'),
-smalltalk.method({
-selector: unescape('visitMethodNode%3A'),
-fn: function (aNode){
-var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
-return self;}
-}),
-smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitSequenceNode_'),
+unescape('_on_'),
 smalltalk.method({
-selector: unescape('visitSequenceNode%3A'),
-fn: function (aNode){
+selector: unescape('on%3A'),
+fn: function (aStream){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+return smalltalk.send(smalltalk.send(self, "_new", []), "_stream_", [aStream]);
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.ChunkParser.klass);
 
-smalltalk.addMethod(
-unescape('_visitBlockSequenceNode_'),
-smalltalk.method({
-selector: unescape('visitBlockSequenceNode%3A'),
-fn: function (aNode){
-var self=this;
-smalltalk.send(self, "_visitSequenceNode_", [aNode]);
-return self;}
-}),
-smalltalk.NodeVisitor);
 
+smalltalk.addClass('DoIt', smalltalk.Object, [], 'Compiler');
+
+
+smalltalk.addClass('Exporter', smalltalk.Object, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_visitBlockNode_'),
+unescape('_classNameFor_'),
 smalltalk.method({
-selector: unescape('visitBlockNode%3A'),
-fn: function (aNode){
+selector: unescape('classNameFor%3A'),
+fn: function (aClass){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitReturnNode_'),
+unescape('_exportAll'),
 smalltalk.method({
-selector: unescape('visitReturnNode%3A'),
-fn: function (aNode){
+selector: unescape('exportAll'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){return smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_packages", []), "_do_", [(function(pkg){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self, "_exportPackage_", [smalltalk.send(pkg, "_name", [])])]);})]);})]);
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitSendNode_'),
+unescape('_exportClass_'),
 smalltalk.method({
-selector: unescape('visitSendNode%3A'),
-fn: function (aNode){
+selector: unescape('exportClass%3A'),
+fn: function (aClass){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){smalltalk.send(self, "_exportDefinitionOf_on_", [aClass, stream]);smalltalk.send(self, "_exportMethodsOf_on_", [aClass, stream]);smalltalk.send(self, "_exportMetaDefinitionOf_on_", [aClass, stream]);return smalltalk.send(self, "_exportMethodsOf_on_", [smalltalk.send(aClass, "_class", []), stream]);})]);
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitCascadeNode_'),
+unescape('_exportDefinitionOf_on_'),
 smalltalk.method({
-selector: unescape('visitCascadeNode%3A'),
-fn: function (aNode){
+selector: unescape('exportDefinitionOf%3Aon%3A'),
+fn: function (aClass, aStream){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addClass%28")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%27%2C%20")])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20%5B")]);})(aStream);
+smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C%20")]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%5D%2C%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(aClass, "_category", []), "__comma", [unescape("%27")])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);})(aStream);
+((($receiver = smalltalk.send(smalltalk.send(aClass, "_comment", []), "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [aClass])]);smalltalk.send($rec, "_nextPutAll_", [unescape(".comment%3D")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aClass, "_comment", []), "_escaped", [])]), "__comma", [unescape("%27%29")])]);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [aClass])]);smalltalk.send($rec, "_nextPutAll_", [unescape(".comment%3D")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aClass, "_comment", []), "_escaped", [])]), "__comma", [unescape("%27%29")])]);})(aStream);})]));
+smalltalk.send(aStream, "_lf", []);
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitValueNode_'),
+unescape('_exportMetaDefinitionOf_on_'),
 smalltalk.method({
-selector: unescape('visitValueNode%3A'),
-fn: function (aNode){
+selector: unescape('exportMetaDefinitionOf%3Aon%3A'),
+fn: function (aClass, aStream){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape(".iVarNames%20%3D%20%5B")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(unescape("%5D%3B"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape(".iVarNames%20%3D%20%5B")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(unescape("%5D%3B"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])])]);})]));
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitVariableNode_'),
+unescape('_exportMethod_of_on_'),
 smalltalk.method({
-selector: unescape('visitVariableNode%3A'),
-fn: function (aNode){
+selector: unescape('exportMethod%3Aof%3Aon%3A'),
+fn: function (aMethod, aClass, aStream){
 var self=this;
-
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addMethod%28")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_asSelector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("category%3A%20%27"), "__comma", [smalltalk.send(aMethod, "_category", [])]), "__comma", [unescape("%27%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("fn: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_fn", []), "_compiledSource", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("args: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_arguments", []), "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("source%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_source", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("messageSends: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_messageSends", []), "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("referencedClasses: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_referencedClasses", []), "_asJavascript", [])])]);})(aStream);
+(function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%2C")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitAssignmentNode_'),
+unescape('_exportMethodsOf_on_'),
 smalltalk.method({
-selector: unescape('visitAssignmentNode%3A'),
-fn: function (aNode){
+selector: unescape('exportMethodsOf%3Aon%3A'),
+fn: function (aClass, aStream){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_selector", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(b, "_selector", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(b, "_selector", [])]));})]), "_do_", [(function(each){return ((($receiver = smalltalk.send(smalltalk.send(each, "_category", []), "_match_", [unescape("%5E%5C*")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})]));})]);
+smalltalk.send(aStream, "_lf", []);
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitClassReferenceNode_'),
+unescape('_exportPackage_'),
 smalltalk.method({
-selector: unescape('visitClassReferenceNode%3A'),
-fn: function (aNode){
+selector: unescape('exportPackage%3A'),
+fn: function (packageName){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(aNode, "_value", [])]);})(self);
+var package=nil;
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){(package=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_packageAt_", [packageName]));smalltalk.send(self, "_exportPackageDefinitionOf_on_", [package, stream]);smalltalk.send(smalltalk.send(package, "_sortedClasses", []), "_do_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self, "_exportClass_", [each])]);})]);return smalltalk.send(self, "_exportPackageExtensionsOf_on_", [package, stream]);})]);
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitJSStatementNode_'),
+unescape('_exportPackageDefinitionOf_on_'),
 smalltalk.method({
-selector: unescape('visitJSStatementNode%3A'),
-fn: function (aNode){
+selector: unescape('exportPackageDefinitionOf%3Aon%3A'),
+fn: function (package, aStream){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("function%28%29%7B")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(aNode, "_source", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%28%29")]);})(self);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addPackage%28")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(package, "_name", [])]), "__comma", [unescape("%27%2C%20")]), "__comma", [smalltalk.send(package, "_propertiesAsJSON", [])]), "__comma", [unescape("%29%3B")])]);})(aStream);
+smalltalk.send(aStream, "_lf", []);
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitDynamicArrayNode_'),
+unescape('_exportPackageExtensionsOf_on_'),
 smalltalk.method({
-selector: unescape('visitDynamicArrayNode%3A'),
-fn: function (aNode){
+selector: unescape('exportPackageExtensionsOf%3Aon%3A'),
+fn: function (package, aStream){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+var name=nil;
+(name=smalltalk.send(package, "_name", []));
+smalltalk.send(smalltalk.send((smalltalk.Package || Package), "_sortedClasses_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", [])]), "_do_", [(function(each){return smalltalk.send([each,smalltalk.send(each, "_class", [])], "_do_", [(function(aClass){return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_selector", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(b, "_selector", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(b, "_selector", [])]));})]), "_do_", [(function(method){return ((($receiver = smalltalk.send(smalltalk.send(method, "_category", []), "_match_", [smalltalk.send(unescape("%5E%5C*"), "__comma", [name])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_exportMethod_of_on_", [method, each, aStream]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self, "_exportMethod_of_on_", [method, each, aStream]);})]));})]);})]);})]);
 return self;}
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
+
+
+smalltalk.addClass('ChunkExporter', smalltalk.Exporter, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_visitDynamicDictionaryNode_'),
+unescape('_chunkEscape_'),
 smalltalk.method({
-selector: unescape('visitDynamicDictionaryNode%3A'),
-fn: function (aNode){
+selector: unescape('chunkEscape%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+return smalltalk.send(smalltalk.send(aString, "_replace_with_", [unescape("%21"), unescape("%21%21")]), "_trimBoth", []);
 return self;}
 }),
-smalltalk.NodeVisitor);
-
-
-
-smalltalk.addClass('DoIt', smalltalk.Object, [], 'Compiler');
-
+smalltalk.ChunkExporter);
 
-smalltalk.addClass('Importer', smalltalk.Object, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_import_'),
+unescape('_classNameFor_'),
 smalltalk.method({
-selector: unescape('import%3A'),
-fn: function (aStream){
+selector: unescape('classNameFor%3A'),
+fn: function (aClass){
 var self=this;
-var chunk=nil;
-var result=nil;
-var parser=nil;
-var lastEmpty=nil;
-(parser=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_on_", [aStream]));
-(lastEmpty=false);
-(function(){while(!(function(){(chunk=smalltalk.send(parser, "_nextChunk", []));return smalltalk.send(chunk, "_isNil", []);})()) {(function(){return ((($receiver = smalltalk.send(chunk, "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (lastEmpty=true);})() : (function(){(result=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [chunk]));return ((($receiver = lastEmpty).klass === smalltalk.Boolean) ? ($receiver ? (function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (lastEmpty=true);}), (function(){(result=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [chunk]));return ((($receiver = lastEmpty).klass === smalltalk.Boolean) ? ($receiver ? (function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})]));})]));})()}})();
+return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [" class"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [" class"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
 return self;}
 }),
-smalltalk.Importer);
-
-
+smalltalk.ChunkExporter);
 
-smalltalk.addClass('Exporter', smalltalk.Object, [], 'Compiler');
 smalltalk.addMethod(
 unescape('_exportDefinitionOf_on_'),
 smalltalk.method({
 selector: unescape('exportDefinitionOf%3Aon%3A'),
 fn: function (aClass, aStream){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addClass%28")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%27%2C%20")])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20%5B")]);})(aStream);
-smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C%20")]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%5D%2C%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(aClass, "_category", []), "__comma", [unescape("%27")])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);})(aStream);
-((($receiver = smalltalk.send(smalltalk.send(aClass, "_comment", []), "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [aClass])]);smalltalk.send($rec, "_nextPutAll_", [unescape(".comment%3D")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aClass, "_comment", []), "_escaped", [])]), "__comma", [unescape("%27%29")])]);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [aClass])]);smalltalk.send($rec, "_nextPutAll_", [unescape(".comment%3D")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aClass, "_comment", []), "_escaped", [])]), "__comma", [unescape("%27%29")])]);})(aStream);})]));
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(unescape("%20subclass%3A%20%23"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("%09instanceVariableNames%3A%20%27")]);})(aStream);
+smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%09package%3A%20%27"), "__comma", [smalltalk.send(aClass, "_category", [])]), "__comma", [unescape("%27%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);
+((($receiver = smalltalk.send(smalltalk.send(aClass, "_comment", []), "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%20commentStamp%21")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aClass, "_comment", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%20commentStamp%21")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aClass, "_comment", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);})]));
 smalltalk.send(aStream, "_lf", []);
 return self;}
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
 unescape('_exportMetaDefinitionOf_on_'),
@@ -223,79 +211,60 @@ smalltalk.method({
 selector: unescape('exportMetaDefinitionOf%3Aon%3A'),
 fn: function (aClass, aStream){
 var self=this;
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape(".iVarNames%20%3D%20%5B")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(unescape("%5D%3B"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape(".iVarNames%20%3D%20%5B")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(unescape("%5D%3B"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])])]);})]));
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%20instanceVariableNames%3A%20%27")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%20instanceVariableNames%3A%20%27")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);})]));
 return self;}
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
-unescape('_exportMethodsOf_on_'),
+unescape('_exportMethod_of_on_'),
 smalltalk.method({
-selector: unescape('exportMethodsOf%3Aon%3A'),
-fn: function (aClass, aStream){
+selector: unescape('exportMethod%3Aof%3Aon%3A'),
+fn: function (aMethod, aClass, aStream){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(smalltalk.send(each, "_category", []), "_match_", [unescape("%5E%5C*")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})]));})]);
-smalltalk.send(aStream, "_lf", []);
+(function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aMethod, "_source", [])])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("%21")]);})(aStream);
 return self;}
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
-unescape('_classNameFor_'),
+unescape('_exportMethods_category_of_on_'),
 smalltalk.method({
-selector: unescape('classNameFor%3A'),
-fn: function (aClass){
+selector: unescape('exportMethods%3Acategory%3Aof%3Aon%3A'),
+fn: function (methods, category, aClass, aStream){
 var self=this;
-return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%20methodsFor%3A%20%27"), "__comma", [category]), "__comma", [unescape("%27%21")])]);})(aStream);
+smalltalk.send(smalltalk.send(methods, "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_selector", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(b, "_selector", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(b, "_selector", [])]));})]), "_do_", [(function(each){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%20%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
 return self;}
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
-unescape('_exportMethod_of_on_'),
+unescape('_exportMethodsOf_on_'),
 smalltalk.method({
-selector: unescape('exportMethod%3Aof%3Aon%3A'),
-fn: function (aMethod, aClass, aStream){
+selector: unescape('exportMethodsOf%3Aon%3A'),
+fn: function (aClass, aStream){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addMethod%28")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_asSelector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("category%3A%20%27"), "__comma", [smalltalk.send(aMethod, "_category", [])]), "__comma", [unescape("%27%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("fn: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_fn", []), "_compiledSource", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("args: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_arguments", []), "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("source%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_source", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("messageSends: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_messageSends", []), "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("referencedClasses: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_referencedClasses", []), "_asJavascript", [])])]);})(aStream);
-(function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%2C")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
+var map=nil;
+(map=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(aClass, "_protocolsDo_", [(function(category, methods){return ((($receiver = smalltalk.send(category, "_match_", [unescape("%5E%5C*")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(map, "_at_put_", [category, methods]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(map, "_at_put_", [category, methods]);})]));})]);
+smalltalk.send(smalltalk.send(smalltalk.send(map, "_keys", []), "_sorted_", [(function(a, b){return ((($receiver = a).klass === smalltalk.Number) ? $receiver <=b : smalltalk.send($receiver, "__lt_eq", [b]));})]), "_do_", [(function(category){var methods=nil;
+(methods=smalltalk.send(map, "_at_", [category]));return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, aClass, aStream]);})]);
 return self;}
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
-unescape('_exportPackage_'),
+unescape('_exportPackageDefinitionOf_on_'),
 smalltalk.method({
-selector: unescape('exportPackage%3A'),
-fn: function (packageName){
-var self=this;
-var package=nil;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){(package=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_packageAt_", [packageName]));smalltalk.send(self, "_exportPackageDefinitionOf_on_", [package, stream]);smalltalk.send(smalltalk.send(package, "_sortedClasses", []), "_do_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self, "_exportClass_", [each])]);})]);return smalltalk.send(self, "_exportPackageExtensionsOf_on_", [package, stream]);})]);
-return self;}
-}),
-smalltalk.Exporter);
-
-smalltalk.addMethod(
-unescape('_exportAll'),
-smalltalk.method({
-selector: unescape('exportAll'),
-fn: function (){
-var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){return smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_packages", []), "_do_", [(function(pkg){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self, "_exportPackage_", [smalltalk.send(pkg, "_name", [])])]);})]);})]);
-return self;}
-}),
-smalltalk.Exporter);
-
-smalltalk.addMethod(
-unescape('_exportClass_'),
-smalltalk.method({
-selector: unescape('exportClass%3A'),
-fn: function (aClass){
+selector: unescape('exportPackageDefinitionOf%3Aon%3A'),
+fn: function (package, aStream){
 var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){smalltalk.send(self, "_exportDefinitionOf_on_", [aClass, stream]);smalltalk.send(self, "_exportMethodsOf_on_", [aClass, stream]);smalltalk.send(self, "_exportMetaDefinitionOf_on_", [aClass, stream]);return smalltalk.send(self, "_exportMethodsOf_on_", [smalltalk.send(aClass, "_class", []), stream]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("Smalltalk%20current%20createPackage%3A%20%27"), "__comma", [smalltalk.send(package, "_name", [])]), "__comma", [unescape("%27%20properties%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(package, "_properties", []), "_storeString", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);
 return self;}
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
 unescape('_exportPackageExtensionsOf_on_'),
@@ -304,109 +273,105 @@ selector: unescape('exportPackageExtensionsOf%3Aon%3A'),
 fn: function (package, aStream){
 var self=this;
 var name=nil;
+var map=nil;
 (name=smalltalk.send(package, "_name", []));
-smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_collect_", [(function(each){return smalltalk.send(each, "_class", []);})])]), "_do_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_values", []), "_do_", [(function(method){return ((($receiver = smalltalk.send(smalltalk.send(method, "_category", []), "__eq", [smalltalk.send(unescape("*"), "__comma", [name])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_exportMethod_of_on_", [method, each, aStream]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self, "_exportMethod_of_on_", [method, each, aStream]);})]));})]);})]);
+smalltalk.send(smalltalk.send((smalltalk.Package || Package), "_sortedClasses_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", [])]), "_do_", [(function(each){return smalltalk.send([each,smalltalk.send(each, "_class", [])], "_do_", [(function(aClass){(map=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));smalltalk.send(aClass, "_protocolsDo_", [(function(category, methods){return ((($receiver = smalltalk.send(category, "_match_", [smalltalk.send(unescape("%5E%5C*"), "__comma", [name])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(map, "_at_put_", [category, methods]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(map, "_at_put_", [category, methods]);})]));})]);return smalltalk.send(smalltalk.send(smalltalk.send(map, "_keys", []), "_sorted_", [(function(a, b){return ((($receiver = a).klass === smalltalk.Number) ? $receiver <=b : smalltalk.send($receiver, "__lt_eq", [b]));})]), "_do_", [(function(category){var methods=nil;
+(methods=smalltalk.send(map, "_at_", [category]));return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, each, aStream]);})]);})]);})]);
 return self;}
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
+
 
+
+smalltalk.addClass('StrippedExporter', smalltalk.Exporter, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_exportPackageDefinitionOf_on_'),
+unescape('_exportDefinitionOf_on_'),
 smalltalk.method({
-selector: unescape('exportPackageDefinitionOf%3Aon%3A'),
-fn: function (package, aStream){
+selector: unescape('exportDefinitionOf%3Aon%3A'),
+fn: function (aClass, aStream){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addPackage%28")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(package, "_name", [])]), "__comma", [unescape("%27%2C%20")]), "__comma", [smalltalk.send(package, "_propertiesAsJSON", [])]), "__comma", [unescape("%29%3B")])]);})(aStream);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addClass%28")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%27%2C%20")])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20%5B")]);})(aStream);
+smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C%20")]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%5D%2C%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(aClass, "_category", []), "__comma", [unescape("%27")])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);})(aStream);
 smalltalk.send(aStream, "_lf", []);
 return self;}
 }),
-smalltalk.Exporter);
-
-
+smalltalk.StrippedExporter);
 
-smalltalk.addClass('ChunkParser', smalltalk.Object, ['stream'], 'Compiler');
 smalltalk.addMethod(
-unescape('_stream_'),
+unescape('_exportMethod_of_on_'),
 smalltalk.method({
-selector: unescape('stream%3A'),
-fn: function (aStream){
+selector: unescape('exportMethod%3Aof%3Aon%3A'),
+fn: function (aMethod, aClass, aStream){
 var self=this;
-(self['@stream']=aStream);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addMethod%28")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_asSelector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("fn: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_fn", []), "_compiledSource", [])])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%2C")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
 return self;}
 }),
-smalltalk.ChunkParser);
+smalltalk.StrippedExporter);
 
-smalltalk.addMethod(
-unescape('_nextChunk'),
-smalltalk.method({
-selector: unescape('nextChunk'),
-fn: function (){
-var self=this;
-try{var char_=nil;
-var result=nil;
-var chunk=nil;
-(result=smalltalk.send("", "_writeStream", []));
-(function(){while((function(){(char_=smalltalk.send(self['@stream'], "_next", []));return smalltalk.send(char_, "_notNil", []);})()) {(function(){((($receiver = smalltalk.send(char_, "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@stream'], "_peek", []), "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_next", []);})() : (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_next", []);}), (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@stream'], "_peek", []), "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_next", []);})() : (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_next", []);}), (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})]));})]));return smalltalk.send(result, "_nextPut_", [char_]);})()}})();
-(function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return nil}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_nextChunk'){return e.fn()} throw(e)}}
-}),
-smalltalk.ChunkParser);
 
 
+smalltalk.addClass('Importer', smalltalk.Object, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_on_'),
+unescape('_import_'),
 smalltalk.method({
-selector: unescape('on%3A'),
+selector: unescape('import%3A'),
 fn: function (aStream){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_new", []), "_stream_", [aStream]);
+var chunk=nil;
+var result=nil;
+var parser=nil;
+var lastEmpty=nil;
+(parser=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_on_", [aStream]));
+(lastEmpty=false);
+(function(){while(!(function(){(chunk=smalltalk.send(parser, "_nextChunk", []));return smalltalk.send(chunk, "_isNil", []);})()) {(function(){return ((($receiver = smalltalk.send(chunk, "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (lastEmpty=true);})() : (function(){(result=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [chunk]));return ((($receiver = lastEmpty).klass === smalltalk.Boolean) ? ($receiver ? (function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (lastEmpty=true);}), (function(){(result=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [chunk]));return ((($receiver = lastEmpty).klass === smalltalk.Boolean) ? ($receiver ? (function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})]));})]));})()}})();
 return self;}
 }),
-smalltalk.ChunkParser.klass);
+smalltalk.Importer);
+
 
 
 smalltalk.addClass('Node', smalltalk.Object, ['nodes'], 'Compiler');
 smalltalk.addMethod(
-unescape('_nodes'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('nodes'),
-fn: function (){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-return (($receiver = self['@nodes']) == nil || $receiver == undefined) ? (function(){return (self['@nodes']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+smalltalk.send(aVisitor, "_visitNode_", [self]);
 return self;}
 }),
 smalltalk.Node);
 
 smalltalk.addMethod(
-unescape('_nodes_'),
+unescape('_addNode_'),
 smalltalk.method({
-selector: unescape('nodes%3A'),
-fn: function (aCollection){
+selector: unescape('addNode%3A'),
+fn: function (aNode){
 var self=this;
-(self['@nodes']=aCollection);
+smalltalk.send(smalltalk.send(self, "_nodes", []), "_add_", [aNode]);
 return self;}
 }),
 smalltalk.Node);
 
 smalltalk.addMethod(
-unescape('_addNode_'),
+unescape('_isBlockNode'),
 smalltalk.method({
-selector: unescape('addNode%3A'),
-fn: function (aNode){
+selector: unescape('isBlockNode'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_nodes", []), "_add_", [aNode]);
+return false;
 return self;}
 }),
 smalltalk.Node);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_isBlockSequenceNode'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('isBlockSequenceNode'),
+fn: function (){
 var self=this;
-smalltalk.send(aVisitor, "_visitNode_", [self]);
+return false;
 return self;}
 }),
 smalltalk.Node);
@@ -423,330 +388,359 @@ return self;}
 smalltalk.Node);
 
 smalltalk.addMethod(
-unescape('_isBlockNode'),
+unescape('_nodes'),
 smalltalk.method({
-selector: unescape('isBlockNode'),
+selector: unescape('nodes'),
 fn: function (){
 var self=this;
-return false;
+return (($receiver = self['@nodes']) == nil || $receiver == undefined) ? (function(){return (self['@nodes']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;}
 }),
 smalltalk.Node);
 
 smalltalk.addMethod(
-unescape('_isBlockSequenceNode'),
+unescape('_nodes_'),
 smalltalk.method({
-selector: unescape('isBlockSequenceNode'),
-fn: function (){
+selector: unescape('nodes%3A'),
+fn: function (aCollection){
 var self=this;
-return false;
+(self['@nodes']=aCollection);
 return self;}
 }),
 smalltalk.Node);
 
 
 
-smalltalk.addClass('SequenceNode', smalltalk.Node, ['temps'], 'Compiler');
+smalltalk.addClass('AssignmentNode', smalltalk.Node, ['left', 'right'], 'Compiler');
 smalltalk.addMethod(
-unescape('_temps'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('temps'),
-fn: function (){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-return (($receiver = self['@temps']) == nil || $receiver == undefined) ? (function(){return [];})() : $receiver;
+smalltalk.send(aVisitor, "_visitAssignmentNode_", [self]);
 return self;}
 }),
-smalltalk.SequenceNode);
+smalltalk.AssignmentNode);
 
 smalltalk.addMethod(
-unescape('_temps_'),
+unescape('_left'),
 smalltalk.method({
-selector: unescape('temps%3A'),
-fn: function (aCollection){
+selector: unescape('left'),
+fn: function (){
 var self=this;
-(self['@temps']=aCollection);
+return self['@left'];
 return self;}
 }),
-smalltalk.SequenceNode);
+smalltalk.AssignmentNode);
 
 smalltalk.addMethod(
-unescape('_asBlockSequenceNode'),
+unescape('_left_'),
 smalltalk.method({
-selector: unescape('asBlockSequenceNode'),
-fn: function (){
+selector: unescape('left%3A'),
+fn: function (aNode){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_nodes_", [smalltalk.send(self, "_nodes", [])]);smalltalk.send($rec, "_temps_", [smalltalk.send(self, "_temps", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.BlockSequenceNode || BlockSequenceNode), "_new", []));
+(self['@left']=aNode);
+smalltalk.send(self['@left'], "_assigned_", [true]);
 return self;}
 }),
-smalltalk.SequenceNode);
+smalltalk.AssignmentNode);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_right'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('right'),
+fn: function (){
 var self=this;
-smalltalk.send(aVisitor, "_visitSequenceNode_", [self]);
+return self['@right'];
 return self;}
 }),
-smalltalk.SequenceNode);
-
-
+smalltalk.AssignmentNode);
 
-smalltalk.addClass('DynamicDictionaryNode', smalltalk.Node, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_right_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('right%3A'),
+fn: function (aNode){
 var self=this;
-smalltalk.send(aVisitor, "_visitDynamicDictionaryNode_", [self]);
+(self['@right']=aNode);
 return self;}
 }),
-smalltalk.DynamicDictionaryNode);
+smalltalk.AssignmentNode);
 
 
 
-smalltalk.addClass('ReturnNode', smalltalk.Node, [], 'Compiler');
+smalltalk.addClass('BlockNode', smalltalk.Node, ['parameters', 'inlined'], 'Compiler');
 smalltalk.addMethod(
 unescape('_accept_'),
 smalltalk.method({
 selector: unescape('accept%3A'),
 fn: function (aVisitor){
 var self=this;
-smalltalk.send(aVisitor, "_visitReturnNode_", [self]);
+smalltalk.send(aVisitor, "_visitBlockNode_", [self]);
 return self;}
 }),
-smalltalk.ReturnNode);
-
-
+smalltalk.BlockNode);
 
-smalltalk.addClass('ValueNode', smalltalk.Node, ['value'], 'Compiler');
 smalltalk.addMethod(
-unescape('_value'),
+unescape('_inlined'),
 smalltalk.method({
-selector: unescape('value'),
+selector: unescape('inlined'),
 fn: function (){
 var self=this;
-return self['@value'];
+return (($receiver = self['@inlined']) == nil || $receiver == undefined) ? (function(){return false;})() : $receiver;
 return self;}
 }),
-smalltalk.ValueNode);
+smalltalk.BlockNode);
 
 smalltalk.addMethod(
-unescape('_value_'),
+unescape('_inlined_'),
 smalltalk.method({
-selector: unescape('value%3A'),
-fn: function (anObject){
+selector: unescape('inlined%3A'),
+fn: function (aBoolean){
 var self=this;
-(self['@value']=anObject);
+(self['@inlined']=aBoolean);
 return self;}
 }),
-smalltalk.ValueNode);
+smalltalk.BlockNode);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_isBlockNode'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('isBlockNode'),
+fn: function (){
 var self=this;
-smalltalk.send(aVisitor, "_visitValueNode_", [self]);
+return true;
 return self;}
 }),
-smalltalk.ValueNode);
+smalltalk.BlockNode);
 
 smalltalk.addMethod(
-unescape('_isValueNode'),
+unescape('_parameters'),
 smalltalk.method({
-selector: unescape('isValueNode'),
+selector: unescape('parameters'),
 fn: function (){
 var self=this;
-return true;
+return (($receiver = self['@parameters']) == nil || $receiver == undefined) ? (function(){return (self['@parameters']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;}
 }),
-smalltalk.ValueNode);
+smalltalk.BlockNode);
 
+smalltalk.addMethod(
+unescape('_parameters_'),
+smalltalk.method({
+selector: unescape('parameters%3A'),
+fn: function (aCollection){
+var self=this;
+(self['@parameters']=aCollection);
+return self;}
+}),
+smalltalk.BlockNode);
 
 
-smalltalk.addClass('VariableNode', smalltalk.ValueNode, ['assigned'], 'Compiler');
+
+smalltalk.addClass('CascadeNode', smalltalk.Node, ['receiver'], 'Compiler');
 smalltalk.addMethod(
 unescape('_accept_'),
 smalltalk.method({
 selector: unescape('accept%3A'),
 fn: function (aVisitor){
 var self=this;
-smalltalk.send(aVisitor, "_visitVariableNode_", [self]);
+smalltalk.send(aVisitor, "_visitCascadeNode_", [self]);
 return self;}
 }),
-smalltalk.VariableNode);
+smalltalk.CascadeNode);
 
 smalltalk.addMethod(
-unescape('_assigned'),
+unescape('_receiver'),
 smalltalk.method({
-selector: unescape('assigned'),
+selector: unescape('receiver'),
 fn: function (){
 var self=this;
-return (($receiver = self['@assigned']) == nil || $receiver == undefined) ? (function(){return false;})() : $receiver;
+return self['@receiver'];
 return self;}
 }),
-smalltalk.VariableNode);
+smalltalk.CascadeNode);
 
 smalltalk.addMethod(
-unescape('_assigned_'),
+unescape('_receiver_'),
 smalltalk.method({
-selector: unescape('assigned%3A'),
-fn: function (aBoolean){
+selector: unescape('receiver%3A'),
+fn: function (aNode){
 var self=this;
-(self['@assigned']=aBoolean);
+(self['@receiver']=aNode);
 return self;}
 }),
-smalltalk.VariableNode);
+smalltalk.CascadeNode);
 
 
 
-smalltalk.addClass('ChunkExporter', smalltalk.Exporter, [], 'Compiler');
+smalltalk.addClass('DynamicArrayNode', smalltalk.Node, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_exportDefinitionOf_on_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('exportDefinitionOf%3Aon%3A'),
-fn: function (aClass, aStream){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(unescape("%20subclass%3A%20%23"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("%09instanceVariableNames%3A%20%27")]);})(aStream);
-smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%09category%3A%20%27"), "__comma", [smalltalk.send(aClass, "_category", [])]), "__comma", [unescape("%27%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);
-((($receiver = smalltalk.send(smalltalk.send(aClass, "_comment", []), "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%20commentStamp%21")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aClass, "_comment", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%20commentStamp%21")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aClass, "_comment", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);})]));
-smalltalk.send(aStream, "_lf", []);
+smalltalk.send(aVisitor, "_visitDynamicArrayNode_", [self]);
 return self;}
 }),
-smalltalk.ChunkExporter);
+smalltalk.DynamicArrayNode);
+
+
 
+smalltalk.addClass('DynamicDictionaryNode', smalltalk.Node, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_exportMethod_of_on_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('exportMethod%3Aof%3Aon%3A'),
-fn: function (aMethod, aClass, aStream){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-(function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aMethod, "_source", [])])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("%21")]);})(aStream);
+smalltalk.send(aVisitor, "_visitDynamicDictionaryNode_", [self]);
 return self;}
 }),
-smalltalk.ChunkExporter);
+smalltalk.DynamicDictionaryNode);
+
 
+
+smalltalk.addClass('JSStatementNode', smalltalk.Node, ['source'], 'Compiler');
 smalltalk.addMethod(
-unescape('_exportMethodsOf_on_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('exportMethodsOf%3Aon%3A'),
-fn: function (aClass, aStream){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-smalltalk.send(aClass, "_protocolsDo_", [(function(category, methods){return ((($receiver = smalltalk.send(category, "_match_", [unescape("%5E%5C*")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, aClass, aStream]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, aClass, aStream]);})]));})]);
+smalltalk.send(aVisitor, "_visitJSStatementNode_", [self]);
 return self;}
 }),
-smalltalk.ChunkExporter);
+smalltalk.JSStatementNode);
 
 smalltalk.addMethod(
-unescape('_exportMetaDefinitionOf_on_'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('exportMetaDefinitionOf%3Aon%3A'),
-fn: function (aClass, aStream){
+selector: unescape('source'),
+fn: function (){
 var self=this;
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%20instanceVariableNames%3A%20%27")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%20instanceVariableNames%3A%20%27")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);})]));
+return (($receiver = self['@source']) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
 return self;}
 }),
-smalltalk.ChunkExporter);
+smalltalk.JSStatementNode);
 
 smalltalk.addMethod(
-unescape('_classNameFor_'),
+unescape('_source_'),
 smalltalk.method({
-selector: unescape('classNameFor%3A'),
-fn: function (aClass){
+selector: unescape('source%3A'),
+fn: function (aString){
 var self=this;
-return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [" class"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [" class"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
+(self['@source']=aString);
 return self;}
 }),
-smalltalk.ChunkExporter);
+smalltalk.JSStatementNode);
+
 
+
+smalltalk.addClass('MethodNode', smalltalk.Node, ['selector', 'arguments', 'source'], 'Compiler');
 smalltalk.addMethod(
-unescape('_chunkEscape_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('chunkEscape%3A'),
-fn: function (aString){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-return smalltalk.send(smalltalk.send(aString, "_replace_with_", [unescape("%21"), unescape("%21%21")]), "_trimBoth", []);
+smalltalk.send(aVisitor, "_visitMethodNode_", [self]);
 return self;}
 }),
-smalltalk.ChunkExporter);
+smalltalk.MethodNode);
 
 smalltalk.addMethod(
-unescape('_exportMethods_category_of_on_'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('exportMethods%3Acategory%3Aof%3Aon%3A'),
-fn: function (methods, category, aClass, aStream){
+selector: unescape('arguments'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%20methodsFor%3A%20%27"), "__comma", [category]), "__comma", [unescape("%27%21")])]);})(aStream);
-smalltalk.send(methods, "_do_", [(function(each){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%20%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
+return (($receiver = self['@arguments']) == nil || $receiver == undefined) ? (function(){return [];})() : $receiver;
 return self;}
 }),
-smalltalk.ChunkExporter);
+smalltalk.MethodNode);
 
 smalltalk.addMethod(
-unescape('_exportPackageExtensionsOf_on_'),
+unescape('_arguments_'),
 smalltalk.method({
-selector: unescape('exportPackageExtensionsOf%3Aon%3A'),
-fn: function (package, aStream){
+selector: unescape('arguments%3A'),
+fn: function (aCollection){
 var self=this;
-var name=nil;
-(name=smalltalk.send(package, "_name", []));
-smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_collect_", [(function(each){return smalltalk.send(each, "_class", []);})])]), "_do_", [(function(each){return smalltalk.send(each, "_protocolsDo_", [(function(category, methods){return ((($receiver = smalltalk.send(category, "__eq", [smalltalk.send(unescape("*"), "__comma", [name])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, each, aStream]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, each, aStream]);})]));})]);})]);
+(self['@arguments']=aCollection);
 return self;}
 }),
-smalltalk.ChunkExporter);
+smalltalk.MethodNode);
 
 smalltalk.addMethod(
-unescape('_exportPackageDefinitionOf_on_'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('exportPackageDefinitionOf%3Aon%3A'),
-fn: function (package, aStream){
+selector: unescape('selector'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("Smalltalk%20current%20createPackage%3A%20%27"), "__comma", [smalltalk.send(package, "_name", [])]), "__comma", [unescape("%27%20properties%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(package, "_properties", []), "_storeString", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);
+return self['@selector'];
 return self;}
 }),
-smalltalk.ChunkExporter);
+smalltalk.MethodNode);
 
+smalltalk.addMethod(
+unescape('_selector_'),
+smalltalk.method({
+selector: unescape('selector%3A'),
+fn: function (aString){
+var self=this;
+(self['@selector']=aString);
+return self;}
+}),
+smalltalk.MethodNode);
 
+smalltalk.addMethod(
+unescape('_source'),
+smalltalk.method({
+selector: unescape('source'),
+fn: function (){
+var self=this;
+return self['@source'];
+return self;}
+}),
+smalltalk.MethodNode);
 
-smalltalk.addClass('ClassReferenceNode', smalltalk.VariableNode, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_source_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('source%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.send(aVisitor, "_visitClassReferenceNode_", [self]);
+(self['@source']=aString);
 return self;}
 }),
-smalltalk.ClassReferenceNode);
+smalltalk.MethodNode);
 
 
 
-smalltalk.addClass('SendNode', smalltalk.Node, ['selector', 'arguments', 'receiver'], 'Compiler');
+smalltalk.addClass('ReturnNode', smalltalk.Node, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('selector'),
-fn: function (){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-return self['@selector'];
+smalltalk.send(aVisitor, "_visitReturnNode_", [self]);
 return self;}
 }),
-smalltalk.SendNode);
+smalltalk.ReturnNode);
+
 
+
+smalltalk.addClass('SendNode', smalltalk.Node, ['selector', 'arguments', 'receiver'], 'Compiler');
 smalltalk.addMethod(
-unescape('_selector_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('selector%3A'),
-fn: function (aString){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-(self['@selector']=aString);
+smalltalk.send(aVisitor, "_visitSendNode_", [self]);
 return self;}
 }),
 smalltalk.SendNode);
@@ -773,6 +767,19 @@ return self;}
 }),
 smalltalk.SendNode);
 
+smalltalk.addMethod(
+unescape('_cascadeNodeWithMessages_'),
+smalltalk.method({
+selector: unescape('cascadeNodeWithMessages%3A'),
+fn: function (aCollection){
+var self=this;
+var first=nil;
+(first=(function($rec){smalltalk.send($rec, "_selector_", [smalltalk.send(self, "_selector", [])]);smalltalk.send($rec, "_arguments_", [smalltalk.send(self, "_arguments", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SendNode || SendNode), "_new", [])));
+return (function($rec){smalltalk.send($rec, "_receiver_", [smalltalk.send(self, "_receiver", [])]);smalltalk.send($rec, "_nodes_", [smalltalk.send(smalltalk.send((smalltalk.Array || Array), "_with_", [first]), "__comma", [aCollection])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.CascadeNode || CascadeNode), "_new", []));
+return self;}
+}),
+smalltalk.SendNode);
+
 smalltalk.addMethod(
 unescape('_receiver'),
 smalltalk.method({
@@ -796,476 +803,374 @@ return self;}
 smalltalk.SendNode);
 
 smalltalk.addMethod(
-unescape('_valueForReceiver_'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('valueForReceiver%3A'),
-fn: function (anObject){
+selector: unescape('selector'),
+fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_receiver_", [(($receiver = smalltalk.send(self, "_receiver", [])) == nil || $receiver == undefined) ? (function(){return anObject;})() : (function(){return smalltalk.send(smalltalk.send(self, "_receiver", []), "_valueForReceiver_", [anObject]);})()]);smalltalk.send($rec, "_selector_", [smalltalk.send(self, "_selector", [])]);smalltalk.send($rec, "_arguments_", [smalltalk.send(self, "_arguments", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SendNode || SendNode), "_new", []));
+return self['@selector'];
 return self;}
 }),
 smalltalk.SendNode);
 
 smalltalk.addMethod(
-unescape('_cascadeNodeWithMessages_'),
+unescape('_selector_'),
 smalltalk.method({
-selector: unescape('cascadeNodeWithMessages%3A'),
-fn: function (aCollection){
+selector: unescape('selector%3A'),
+fn: function (aString){
 var self=this;
-var first=nil;
-(first=(function($rec){smalltalk.send($rec, "_selector_", [smalltalk.send(self, "_selector", [])]);smalltalk.send($rec, "_arguments_", [smalltalk.send(self, "_arguments", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SendNode || SendNode), "_new", [])));
-return (function($rec){smalltalk.send($rec, "_receiver_", [smalltalk.send(self, "_receiver", [])]);smalltalk.send($rec, "_nodes_", [smalltalk.send(smalltalk.send((smalltalk.Array || Array), "_with_", [first]), "__comma", [aCollection])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.CascadeNode || CascadeNode), "_new", []));
+(self['@selector']=aString);
 return self;}
 }),
 smalltalk.SendNode);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_valueForReceiver_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('valueForReceiver%3A'),
+fn: function (anObject){
 var self=this;
-smalltalk.send(aVisitor, "_visitSendNode_", [self]);
+return (function($rec){smalltalk.send($rec, "_receiver_", [(($receiver = smalltalk.send(self, "_receiver", [])) == nil || $receiver == undefined) ? (function(){return anObject;})() : (function(){return smalltalk.send(smalltalk.send(self, "_receiver", []), "_valueForReceiver_", [anObject]);})()]);smalltalk.send($rec, "_selector_", [smalltalk.send(self, "_selector", [])]);smalltalk.send($rec, "_arguments_", [smalltalk.send(self, "_arguments", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SendNode || SendNode), "_new", []));
 return self;}
 }),
 smalltalk.SendNode);
 
 
 
-smalltalk.addClass('JSStatementNode', smalltalk.Node, ['source'], 'Compiler');
+smalltalk.addClass('SequenceNode', smalltalk.Node, ['temps'], 'Compiler');
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('source'),
-fn: function (){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-return (($receiver = self['@source']) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
+smalltalk.send(aVisitor, "_visitSequenceNode_", [self]);
 return self;}
 }),
-smalltalk.JSStatementNode);
+smalltalk.SequenceNode);
 
 smalltalk.addMethod(
-unescape('_source_'),
+unescape('_asBlockSequenceNode'),
 smalltalk.method({
-selector: unescape('source%3A'),
-fn: function (aString){
+selector: unescape('asBlockSequenceNode'),
+fn: function (){
 var self=this;
-(self['@source']=aString);
+return (function($rec){smalltalk.send($rec, "_nodes_", [smalltalk.send(self, "_nodes", [])]);smalltalk.send($rec, "_temps_", [smalltalk.send(self, "_temps", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.BlockSequenceNode || BlockSequenceNode), "_new", []));
 return self;}
 }),
-smalltalk.JSStatementNode);
+smalltalk.SequenceNode);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_temps'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('temps'),
+fn: function (){
 var self=this;
-smalltalk.send(aVisitor, "_visitJSStatementNode_", [self]);
+return (($receiver = self['@temps']) == nil || $receiver == undefined) ? (function(){return [];})() : $receiver;
 return self;}
 }),
-smalltalk.JSStatementNode);
-
-
+smalltalk.SequenceNode);
 
-smalltalk.addClass('AssignmentNode', smalltalk.Node, ['left', 'right'], 'Compiler');
 smalltalk.addMethod(
-unescape('_left'),
+unescape('_temps_'),
 smalltalk.method({
-selector: unescape('left'),
-fn: function (){
+selector: unescape('temps%3A'),
+fn: function (aCollection){
 var self=this;
-return self['@left'];
+(self['@temps']=aCollection);
 return self;}
 }),
-smalltalk.AssignmentNode);
+smalltalk.SequenceNode);
 
-smalltalk.addMethod(
-unescape('_left_'),
-smalltalk.method({
-selector: unescape('left%3A'),
-fn: function (aNode){
-var self=this;
-(self['@left']=aNode);
-smalltalk.send(self['@left'], "_assigned_", [true]);
-return self;}
-}),
-smalltalk.AssignmentNode);
 
-smalltalk.addMethod(
-unescape('_right'),
-smalltalk.method({
-selector: unescape('right'),
-fn: function (){
-var self=this;
-return self['@right'];
-return self;}
-}),
-smalltalk.AssignmentNode);
 
+smalltalk.addClass('BlockSequenceNode', smalltalk.SequenceNode, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_right_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('right%3A'),
-fn: function (aNode){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-(self['@right']=aNode);
+smalltalk.send(aVisitor, "_visitBlockSequenceNode_", [self]);
 return self;}
 }),
-smalltalk.AssignmentNode);
+smalltalk.BlockSequenceNode);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_isBlockSequenceNode'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('isBlockSequenceNode'),
+fn: function (){
 var self=this;
-smalltalk.send(aVisitor, "_visitAssignmentNode_", [self]);
+return true;
 return self;}
 }),
-smalltalk.AssignmentNode);
+smalltalk.BlockSequenceNode);
 
 
 
-smalltalk.addClass('DynamicArrayNode', smalltalk.Node, [], 'Compiler');
+smalltalk.addClass('ValueNode', smalltalk.Node, ['value'], 'Compiler');
 smalltalk.addMethod(
 unescape('_accept_'),
 smalltalk.method({
 selector: unescape('accept%3A'),
 fn: function (aVisitor){
 var self=this;
-smalltalk.send(aVisitor, "_visitDynamicArrayNode_", [self]);
+smalltalk.send(aVisitor, "_visitValueNode_", [self]);
 return self;}
 }),
-smalltalk.DynamicArrayNode);
-
-
+smalltalk.ValueNode);
 
-smalltalk.addClass('Compiler', smalltalk.NodeVisitor, ['stream', 'nestedBlocks', 'earlyReturn', 'currentClass', 'currentSelector', 'unknownVariables', 'tempVariables', 'messageSends', 'referencedClasses', 'classReferenced', 'source', 'argVariables'], 'Compiler');
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_isValueNode'),
 smalltalk.method({
-selector: unescape('initialize'),
+selector: unescape('isValueNode'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.NodeVisitor);
-(self['@stream']=smalltalk.send("", "_writeStream", []));
-(self['@unknownVariables']=[]);
-(self['@tempVariables']=[]);
-(self['@argVariables']=[]);
-(self['@messageSends']=[]);
-(self['@classReferenced']=[]);
+return true;
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.ValueNode);
 
 smalltalk.addMethod(
-unescape('_parser'),
+unescape('_value'),
 smalltalk.method({
-selector: unescape('parser'),
+selector: unescape('value'),
 fn: function (){
 var self=this;
-return smalltalk.send((smalltalk.SmalltalkParser || SmalltalkParser), "_new", []);
+return self['@value'];
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.ValueNode);
 
 smalltalk.addMethod(
-unescape('_currentClass'),
+unescape('_value_'),
 smalltalk.method({
-selector: unescape('currentClass'),
-fn: function (){
+selector: unescape('value%3A'),
+fn: function (anObject){
 var self=this;
-return self['@currentClass'];
+(self['@value']=anObject);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.ValueNode);
+
 
+
+smalltalk.addClass('VariableNode', smalltalk.ValueNode, ['assigned'], 'Compiler');
 smalltalk.addMethod(
-unescape('_currentClass_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('currentClass%3A'),
-fn: function (aClass){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-(self['@currentClass']=aClass);
+smalltalk.send(aVisitor, "_visitVariableNode_", [self]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.VariableNode);
 
 smalltalk.addMethod(
-unescape('_loadExpression_'),
+unescape('_assigned'),
 smalltalk.method({
-selector: unescape('loadExpression%3A'),
-fn: function (aString){
+selector: unescape('assigned'),
+fn: function (){
 var self=this;
-var result=nil;
-smalltalk.send((smalltalk.DoIt || DoIt), "_addCompiledMethod_", [smalltalk.send(self, "_eval_", [smalltalk.send(self, "_compileExpression_", [aString])])]);
-(result=smalltalk.send(smalltalk.send((smalltalk.DoIt || DoIt), "_new", []), "_doIt", []));
-smalltalk.send((smalltalk.DoIt || DoIt), "_removeCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.DoIt || DoIt), "_methodDictionary", []), "_at_", ["doIt"])]);
-return result;
+return (($receiver = self['@assigned']) == nil || $receiver == undefined) ? (function(){return false;})() : $receiver;
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.VariableNode);
 
 smalltalk.addMethod(
-unescape('_load_forClass_'),
+unescape('_assigned_'),
 smalltalk.method({
-selector: unescape('load%3AforClass%3A'),
-fn: function (aString, aClass){
+selector: unescape('assigned%3A'),
+fn: function (aBoolean){
 var self=this;
-var compiled=nil;
-(compiled=smalltalk.send(self, "_eval_", [smalltalk.send(self, "_compile_forClass_", [aString, aClass])]));
-smalltalk.send(self, "_setupClass_", [aClass]);
-return compiled;
+(self['@assigned']=aBoolean);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.VariableNode);
+
 
+
+smalltalk.addClass('ClassReferenceNode', smalltalk.VariableNode, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_compile_forClass_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('compile%3AforClass%3A'),
-fn: function (aString, aClass){
+selector: unescape('accept%3A'),
+fn: function (aVisitor){
 var self=this;
-smalltalk.send(self, "_currentClass_", [aClass]);
-smalltalk.send(self, "_source_", [aString]);
-return smalltalk.send(self, "_compile_", [aString]);
+smalltalk.send(aVisitor, "_visitClassReferenceNode_", [self]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.ClassReferenceNode);
 
+
+
+smalltalk.addClass('NodeVisitor', smalltalk.Object, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_compileExpression_'),
+unescape('_visit_'),
 smalltalk.method({
-selector: unescape('compileExpression%3A'),
-fn: function (aString){
+selector: unescape('visit%3A'),
+fn: function (aNode){
 var self=this;
-smalltalk.send(self, "_currentClass_", [(smalltalk.DoIt || DoIt)]);
-smalltalk.send(self, "_source_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")])]);
-return smalltalk.send(self, "_compileNode_", [smalltalk.send(self, "_parse_", [smalltalk.send(self, "_source", [])])]);
+smalltalk.send(aNode, "_accept_", [self]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_eval_'),
+unescape('_visitAssignmentNode_'),
 smalltalk.method({
-selector: unescape('eval%3A'),
-fn: function (aString){
+selector: unescape('visitAssignmentNode%3A'),
+fn: function (aNode){
 var self=this;
-return eval(aString);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_compile_'),
+unescape('_visitBlockNode_'),
 smalltalk.method({
-selector: unescape('compile%3A'),
-fn: function (aString){
+selector: unescape('visitBlockNode%3A'),
+fn: function (aNode){
 var self=this;
-return smalltalk.send(self, "_compileNode_", [smalltalk.send(self, "_parse_", [aString])]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_compileNode_'),
+unescape('_visitBlockSequenceNode_'),
 smalltalk.method({
-selector: unescape('compileNode%3A'),
+selector: unescape('visitBlockSequenceNode%3A'),
 fn: function (aNode){
 var self=this;
-(self['@stream']=smalltalk.send("", "_writeStream", []));
-smalltalk.send(self, "_visit_", [aNode]);
-return smalltalk.send(self['@stream'], "_contents", []);
+smalltalk.send(self, "_visitSequenceNode_", [aNode]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visit_'),
+unescape('_visitCascadeNode_'),
 smalltalk.method({
-selector: unescape('visit%3A'),
+selector: unescape('visitCascadeNode%3A'),
 fn: function (aNode){
 var self=this;
-smalltalk.send(aNode, "_accept_", [self]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitMethodNode_'),
+unescape('_visitClassReferenceNode_'),
 smalltalk.method({
-selector: unescape('visitMethodNode%3A'),
+selector: unescape('visitClassReferenceNode%3A'),
 fn: function (aNode){
 var self=this;
-var str=nil;
-var currentSelector=nil;
-(self['@currentSelector']=smalltalk.send(smalltalk.send(aNode, "_selector", []), "_asSelector", []));
-(self['@nestedBlocks']=(0));
-(self['@earlyReturn']=false);
-(self['@messageSends']=[]);
-(self['@referencedClasses']=[]);
-(self['@unknownVariables']=[]);
-(self['@tempVariables']=[]);
-(self['@argVariables']=[]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20%22"), "__comma", [smalltalk.send(aNode, "_selector", [])]), "__comma", [unescape("%22%2C")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("source%3A%20unescape%28%22"), "__comma", [smalltalk.send(smalltalk.send(self, "_source", []), "_escaped", [])]), "__comma", [unescape("%22%29%2C")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("fn%3A%20function%28")]);
-smalltalk.send(smalltalk.send(aNode, "_arguments", []), "_do_separatedBy_", [(function(each){smalltalk.send(self['@argVariables'], "_add_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%29%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("var%20self%3Dthis%3B")]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
-(str=self['@stream']);
-(self['@stream']=smalltalk.send("", "_writeStream", []));
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
-((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(str, "_nextPutAll_", [unescape("try%7B")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(str, "_nextPutAll_", [unescape("try%7B")]);})]));
-smalltalk.send(str, "_nextPutAll_", [smalltalk.send(self['@stream'], "_contents", [])]);
-(self['@stream']=str);
-(function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("return%20self%3B")]);})(self['@stream']);
-((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27stReturn%27%20%26%26%20e.selector%20%3D%3D%3D%20"), "__comma", [smalltalk.send(self['@currentSelector'], "_printString", [])]), "__comma", [unescape("%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D")])]);})(self['@stream']);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27stReturn%27%20%26%26%20e.selector%20%3D%3D%3D%20"), "__comma", [smalltalk.send(self['@currentSelector'], "_printString", [])]), "__comma", [unescape("%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D")])]);})(self['@stream']);})]));
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D")]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%2C"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])]), "__comma", ["messageSends: "])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@messageSends'], "_asJavascript", []), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("args: ", "__comma", [smalltalk.send(self['@argVariables'], "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("referencedClasses%3A%20%5B")]);})(self['@stream']);
-smalltalk.send(self['@referencedClasses'], "_do_separatedBy_", [(function(each){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(each, "_printString", [])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D")]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29")]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(aNode, "_value", [])]);})(self);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitBlockNode_'),
+unescape('_visitDynamicArrayNode_'),
 smalltalk.method({
-selector: unescape('visitBlockNode%3A'),
+selector: unescape('visitDynamicArrayNode%3A'),
 fn: function (aNode){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28function%28")]);
-smalltalk.send(smalltalk.send(aNode, "_parameters", []), "_do_separatedBy_", [(function(each){smalltalk.send(self['@tempVariables'], "_add_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29%7B")]);
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29")]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitSequenceNode_'),
+unescape('_visitDynamicDictionaryNode_'),
 smalltalk.method({
-selector: unescape('visitSequenceNode%3A'),
+selector: unescape('visitDynamicDictionaryNode%3A'),
 fn: function (aNode){
 var self=this;
-smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
-(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);}), (function(){return smalltalk.send(self['@stream'], "_lf", []);})]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitBlockSequenceNode_'),
+unescape('_visitJSStatementNode_'),
 smalltalk.method({
-selector: unescape('visitBlockSequenceNode%3A'),
+selector: unescape('visitJSStatementNode%3A'),
 fn: function (aNode){
 var self=this;
-var index=nil;
-(self['@nestedBlocks']=((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
-((($receiver = smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("return%20nil%3B")]);})() : (function(){smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
-(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);(index=(0));return smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("return%20nil%3B")]);}), (function(){smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
-(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);(index=(0));return smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);})]));
-(self['@nestedBlocks']=((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])));
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("function%28%29%7B")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(aNode, "_source", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%28%29")]);})(self);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitReturnNode_'),
+unescape('_visitMethodNode_'),
 smalltalk.method({
-selector: unescape('visitReturnNode%3A'),
+selector: unescape('visitMethodNode%3A'),
 fn: function (aNode){
 var self=this;
-((($receiver = ((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver >(0) : smalltalk.send($receiver, "__gt", [(0)]))).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (self['@earlyReturn']=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (self['@earlyReturn']=true);})]));
-((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%28function%28%29%7Bthrow%28")]);smalltalk.send($rec, "_nextPutAll_", [unescape("%7Bname%3A%20%27stReturn%27%2C%20selector%3A%20")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@currentSelector'], "_printString", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20fn%3A%20function%28%29%7Breturn%20")]);})(self['@stream']);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%28function%28%29%7Bthrow%28")]);smalltalk.send($rec, "_nextPutAll_", [unescape("%7Bname%3A%20%27stReturn%27%2C%20selector%3A%20")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@currentSelector'], "_printString", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20fn%3A%20function%28%29%7Breturn%20")]);})(self['@stream']);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
-((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%7D%29%7D%29%28%29")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%7D%29%7D%29%28%29")]);})]));
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitSendNode_'),
+unescape('_visitNode_'),
 smalltalk.method({
-selector: unescape('visitSendNode%3A'),
+selector: unescape('visitNode%3A'),
 fn: function (aNode){
 var self=this;
-var str=nil;
-var receiver=nil;
-var superSend=nil;
-var inlined=nil;
-(str=self['@stream']);
-((($receiver = smalltalk.send(self['@messageSends'], "_includes_", [smalltalk.send(aNode, "_selector", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@messageSends'], "_add_", [smalltalk.send(aNode, "_selector", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@messageSends'], "_add_", [smalltalk.send(aNode, "_selector", [])]);})]));
-(self['@stream']=smalltalk.send("", "_writeStream", []));
-smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_receiver", [])]);
-(superSend=smalltalk.send(smalltalk.send(self['@stream'], "_contents", []), "__eq", ["super"]));
-(receiver=((($receiver = superSend).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "self";})() : (function(){return smalltalk.send(self['@stream'], "_contents", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "self";}), (function(){return smalltalk.send(self['@stream'], "_contents", []);})])));
-(self['@stream']=str);
-((($receiver = smalltalk.send(self, "_performOptimizations", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inlineLiteral_receiverNode_argumentNodes_", [smalltalk.send(aNode, "_selector", []), smalltalk.send(aNode, "_receiver", []), smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})]));})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inlineLiteral_receiverNode_argumentNodes_", [smalltalk.send(aNode, "_selector", []), smalltalk.send(aNode, "_receiver", []), smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})]));}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));
+
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitCascadeNode_'),
+unescape('_visitReturnNode_'),
 smalltalk.method({
-selector: unescape('visitCascadeNode%3A'),
+selector: unescape('visitReturnNode%3A'),
 fn: function (aNode){
 var self=this;
-var index=nil;
-(index=(0));
-((($receiver = smalltalk.send(self['@tempVariables'], "_includes_", ["$rec"])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@tempVariables'], "_add_", ["$rec"]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@tempVariables'], "_add_", ["$rec"]);})]));
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28function%28%24rec%29%7B")]);
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(each, "_receiver_", [smalltalk.send(smalltalk.send((smalltalk.VariableNode || VariableNode), "_new", []), "_value_", ["$rec"])]);smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29%28")]);
-smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_receiver", [])]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29")]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitValueNode_'),
+unescape('_visitSendNode_'),
 smalltalk.method({
-selector: unescape('visitValueNode%3A'),
+selector: unescape('visitSendNode%3A'),
 fn: function (aNode){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(aNode, "_value", []), "_asJavascript", [])]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitAssignmentNode_'),
+unescape('_visitSequenceNode_'),
 smalltalk.method({
-selector: unescape('visitAssignmentNode%3A'),
+selector: unescape('visitSequenceNode%3A'),
 fn: function (aNode){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28")]);
-smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_left", [])]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3D")]);
-smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_right", [])]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29")]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitClassReferenceNode_'),
+unescape('_visitValueNode_'),
 smalltalk.method({
-selector: unescape('visitClassReferenceNode%3A'),
+selector: unescape('visitValueNode%3A'),
 fn: function (aNode){
 var self=this;
-((($receiver = smalltalk.send(self['@referencedClasses'], "_includes_", [smalltalk.send(aNode, "_value", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@referencedClasses'], "_add_", [smalltalk.send(aNode, "_value", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@referencedClasses'], "_add_", [smalltalk.send(aNode, "_value", [])]);})]));
-smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28smalltalk."), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%20%7C%7C%20")]), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%29")])]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
 unescape('_visitVariableNode_'),
@@ -1273,165 +1178,168 @@ smalltalk.method({
 selector: unescape('visitVariableNode%3A'),
 fn: function (aNode){
 var self=this;
-var varName=nil;
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_currentClass", []), "_allInstanceVariableNames", []), "_includes_", [smalltalk.send(aNode, "_value", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("self%5B%27@"), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%27%5D")])]);})() : (function(){(varName=smalltalk.send(self, "_safeVariableNameFor_", [smalltalk.send(aNode, "_value", [])]));return ((($receiver = smalltalk.send(smalltalk.send(self, "_knownVariables", []), "_includes_", [varName])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("self%5B%27@"), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%27%5D")])]);}), (function(){(varName=smalltalk.send(self, "_safeVariableNameFor_", [smalltalk.send(aNode, "_value", [])]));return ((($receiver = smalltalk.send(smalltalk.send(self, "_knownVariables", []), "_includes_", [varName])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})]));})]));
-return self;}
-}),
-smalltalk.Compiler);
 
-smalltalk.addMethod(
-unescape('_visitJSStatementNode_'),
-smalltalk.method({
-selector: unescape('visitJSStatementNode%3A'),
-fn: function (aNode){
-var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(aNode, "_source", []), "_replace_with_", [unescape("%3E%3E"), unescape("%3E")])]);
 return self;}
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
+
 
+
+smalltalk.addClass('Compiler', smalltalk.NodeVisitor, ['stream', 'nestedBlocks', 'earlyReturn', 'currentClass', 'currentSelector', 'unknownVariables', 'tempVariables', 'messageSends', 'referencedClasses', 'classReferenced', 'source', 'argVariables'], 'Compiler');
 smalltalk.addMethod(
-unescape('_parse_'),
+unescape('_argVariables'),
 smalltalk.method({
-selector: unescape('parse%3A'),
-fn: function (aString){
+selector: unescape('argVariables'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_parse_", [aString]);
+return smalltalk.send(self['@argVariables'], "_copy", []);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_parseExpression_'),
+unescape('_checkClass_for_'),
 smalltalk.method({
-selector: unescape('parseExpression%3A'),
-fn: function (aString){
+selector: unescape('checkClass%3Afor%3A'),
+fn: function (aClassName, receiver){
 var self=this;
-return smalltalk.send(self, "_parse_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")])]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28%28%28%24receiver%20%3D%20"), "__comma", [receiver]), "__comma", [unescape("%29.klass%20%3D%3D%3D%20smalltalk.")]), "__comma", [aClassName]), "__comma", [unescape("%29%20%3F%20")])]);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_unknownVariables'),
+unescape('_classNameFor_'),
 smalltalk.method({
-selector: unescape('unknownVariables'),
-fn: function (){
+selector: unescape('classNameFor%3A'),
+fn: function (aClass){
 var self=this;
-return smalltalk.send(self['@unknownVariables'], "_copy", []);
+return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_pseudoVariables'),
+unescape('_compile_'),
 smalltalk.method({
-selector: unescape('pseudoVariables'),
-fn: function (){
+selector: unescape('compile%3A'),
+fn: function (aString){
 var self=this;
-return ["self", "super", "true", "false", "nil", "thisContext"];
+return smalltalk.send(self, "_compileNode_", [smalltalk.send(self, "_parse_", [aString])]);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_tempVariables'),
+unescape('_compile_forClass_'),
 smalltalk.method({
-selector: unescape('tempVariables'),
-fn: function (){
+selector: unescape('compile%3AforClass%3A'),
+fn: function (aString, aClass){
 var self=this;
-return smalltalk.send(self['@tempVariables'], "_copy", []);
+smalltalk.send(self, "_currentClass_", [aClass]);
+smalltalk.send(self, "_source_", [aString]);
+return smalltalk.send(self, "_compile_", [aString]);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_knownVariables'),
+unescape('_compileExpression_'),
 smalltalk.method({
-selector: unescape('knownVariables'),
-fn: function (){
+selector: unescape('compileExpression%3A'),
+fn: function (aString){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_tempVariables", [])]);smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_argVariables", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_pseudoVariables", []));
+smalltalk.send(self, "_currentClass_", [(smalltalk.DoIt || DoIt)]);
+smalltalk.send(self, "_source_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")])]);
+return smalltalk.send(self, "_compileNode_", [smalltalk.send(self, "_parse_", [smalltalk.send(self, "_source", [])])]);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_recompile_'),
+unescape('_compileNode_'),
 smalltalk.method({
-selector: unescape('recompile%3A'),
-fn: function (aClass){
+selector: unescape('compileNode%3A'),
+fn: function (aNode){
 var self=this;
-smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_do_", [(function(each){var method=nil;
-(method=smalltalk.send(self, "_load_forClass_", [smalltalk.send(each, "_source", []), aClass]));smalltalk.send(method, "_category_", [smalltalk.send(each, "_category", [])]);return smalltalk.send(aClass, "_addCompiledMethod_", [method]);})]);
-((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})]));
+(self['@stream']=smalltalk.send("", "_writeStream", []));
+smalltalk.send(self, "_visit_", [aNode]);
+return smalltalk.send(self['@stream'], "_contents", []);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_recompileAll'),
+unescape('_currentClass'),
 smalltalk.method({
-selector: unescape('recompileAll'),
+selector: unescape('currentClass'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){(function($rec){smalltalk.send($rec, "_show_", [each]);return smalltalk.send($rec, "_cr", []);})((smalltalk.Transcript || Transcript));return smalltalk.send((function(){return smalltalk.send(self, "_recompile_", [each]);}), "_valueWithTimeout_", [(100)]);})]);
+return self['@currentClass'];
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_classNameFor_'),
+unescape('_currentClass_'),
 smalltalk.method({
-selector: unescape('classNameFor%3A'),
+selector: unescape('currentClass%3A'),
 fn: function (aClass){
 var self=this;
-return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
-return self;}
-}),
-smalltalk.Compiler);
-
-smalltalk.addMethod(
-unescape('_visitFailure_'),
-smalltalk.method({
-selector: unescape('visitFailure%3A'),
-fn: function (aFailure){
-var self=this;
-smalltalk.send(self, "_error_", [smalltalk.send(aFailure, "_asString", [])]);
+(self['@currentClass']=aClass);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_setupClass_'),
+unescape('_eval_'),
 smalltalk.method({
-selector: unescape('setupClass%3A'),
-fn: function (aClass){
+selector: unescape('eval%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.init(aClass);
+return eval(aString);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_send_to_arguments_superSend_'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('send%3Ato%3Aarguments%3AsuperSend%3A'),
-fn: function (aSelector, aReceiver, aCollection, aBoolean){
+selector: unescape('initialize'),
+fn: function (){
 var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(str){var tmp=nil;
-(tmp=self['@stream']);smalltalk.send(str, "_nextPutAll_", [unescape("smalltalk.send%28")]);smalltalk.send(str, "_nextPutAll_", [aReceiver]);smalltalk.send(str, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%2C%20%22"), "__comma", [smalltalk.send(aSelector, "_asSelector", [])]), "__comma", [unescape("%22%2C%20%5B")])]);(self['@stream']=str);smalltalk.send(aCollection, "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);(self['@stream']=tmp);smalltalk.send(str, "_nextPutAll_", [unescape("%5D")]);((($receiver = aBoolean).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(str, "_nextPutAll_", [smalltalk.send(unescape("%2C%20smalltalk."), "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(smalltalk.send(self, "_currentClass", []), "_superclass", [])])])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(str, "_nextPutAll_", [smalltalk.send(unescape("%2C%20smalltalk."), "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(smalltalk.send(self, "_currentClass", []), "_superclass", [])])])]);})]));return smalltalk.send(str, "_nextPutAll_", [unescape("%29")]);})]);
+smalltalk.send(self, "_initialize", [], smalltalk.NodeVisitor);
+(self['@stream']=smalltalk.send("", "_writeStream", []));
+(self['@unknownVariables']=[]);
+(self['@tempVariables']=[]);
+(self['@argVariables']=[]);
+(self['@messageSends']=[]);
+(self['@classReferenced']=[]);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_checkClass_for_'),
+unescape('_inline_receiver_argumentNodes_'),
 smalltalk.method({
-selector: unescape('checkClass%3Afor%3A'),
-fn: function (aClassName, receiver){
+selector: unescape('inline%3Areceiver%3AargumentNodes%3A'),
+fn: function (aSelector, receiver, aCollection){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28%28%28%24receiver%20%3D%20"), "__comma", [receiver]), "__comma", [unescape("%29.klass%20%3D%3D%3D%20smalltalk.")]), "__comma", [aClassName]), "__comma", [unescape("%29%20%3F%20")])]);
+var inlined=nil;
+(inlined=false);
+((($receiver = smalltalk.send(aSelector, "__eq", ["ifFalse:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})]));
+((($receiver = smalltalk.send(aSelector, "__eq", ["ifTrue:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})]));
+((($receiver = smalltalk.send(aSelector, "__eq", ["ifTrue:ifFalse:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})]));
+((($receiver = smalltalk.send(aSelector, "__eq", ["ifFalse:ifTrue:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3C")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3C%3D")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3E")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3E%3D")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("+")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20+")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20+")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("-")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20-")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20-")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("*")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20*")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20*")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("/")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20/")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20/")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+return inlined;
 return self;}
 }),
 smalltalk.Compiler);
@@ -1477,113 +1385,100 @@ return self;}
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_inline_receiver_argumentNodes_'),
+unescape('_knownVariables'),
 smalltalk.method({
-selector: unescape('inline%3Areceiver%3AargumentNodes%3A'),
-fn: function (aSelector, receiver, aCollection){
+selector: unescape('knownVariables'),
+fn: function (){
 var self=this;
-var inlined=nil;
-(inlined=false);
-((($receiver = smalltalk.send(aSelector, "__eq", ["ifFalse:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})]));
-((($receiver = smalltalk.send(aSelector, "__eq", ["ifTrue:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})]));
-((($receiver = smalltalk.send(aSelector, "__eq", ["ifTrue:ifFalse:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})]));
-((($receiver = smalltalk.send(aSelector, "__eq", ["ifFalse:ifTrue:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3C")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3C%3D")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3E")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3E%3D")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("+")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20+")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20+")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("-")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20-")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20-")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("*")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20*")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20*")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("/")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20/")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20/")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-return inlined;
+return (function($rec){smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_tempVariables", [])]);smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_argVariables", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_pseudoVariables", []));
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_performOptimizations'),
+unescape('_load_forClass_'),
 smalltalk.method({
-selector: unescape('performOptimizations'),
-fn: function (){
+selector: unescape('load%3AforClass%3A'),
+fn: function (aString, aClass){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_performOptimizations", []);
+var compiled=nil;
+(compiled=smalltalk.send(self, "_eval_", [smalltalk.send(self, "_compile_forClass_", [aString, aClass])]));
+smalltalk.send(self, "_setupClass_", [aClass]);
+return compiled;
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_loadExpression_'),
 smalltalk.method({
-selector: unescape('source'),
-fn: function (){
+selector: unescape('loadExpression%3A'),
+fn: function (aString){
 var self=this;
-return (($receiver = self['@source']) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
+var result=nil;
+smalltalk.send((smalltalk.DoIt || DoIt), "_addCompiledMethod_", [smalltalk.send(self, "_eval_", [smalltalk.send(self, "_compileExpression_", [aString])])]);
+(result=smalltalk.send(smalltalk.send((smalltalk.DoIt || DoIt), "_new", []), "_doIt", []));
+smalltalk.send((smalltalk.DoIt || DoIt), "_removeCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.DoIt || DoIt), "_methodDictionary", []), "_at_", ["doIt"])]);
+return result;
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_source_'),
+unescape('_parse_'),
 smalltalk.method({
-selector: unescape('source%3A'),
+selector: unescape('parse%3A'),
 fn: function (aString){
 var self=this;
-(self['@source']=aString);
+return smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_parse_", [aString]);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_visitDynamicArrayNode_'),
+unescape('_parseExpression_'),
 smalltalk.method({
-selector: unescape('visitDynamicArrayNode%3A'),
-fn: function (aNode){
+selector: unescape('parseExpression%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5B")]);
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D")]);
+return smalltalk.send(self, "_parse_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")])]);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_visitDynamicDictionaryNode_'),
+unescape('_parser'),
 smalltalk.method({
-selector: unescape('visitDynamicDictionaryNode%3A'),
-fn: function (aNode){
+selector: unescape('parser'),
+fn: function (){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("smalltalk.HashedCollection._fromPairs_%28%5B")]);
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D%29")]);
+return smalltalk.send((smalltalk.SmalltalkParser || SmalltalkParser), "_new", []);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_argVariables'),
+unescape('_performOptimizations'),
 smalltalk.method({
-selector: unescape('argVariables'),
+selector: unescape('performOptimizations'),
 fn: function (){
 var self=this;
-return smalltalk.send(self['@argVariables'], "_copy", []);
+return smalltalk.send(smalltalk.send(self, "_class", []), "_performOptimizations", []);
 return self;}
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_safeVariableNameFor_'),
+unescape('_pseudoVariables'),
 smalltalk.method({
-selector: unescape('safeVariableNameFor%3A'),
-fn: function (aString){
+selector: unescape('pseudoVariables'),
+fn: function (){
 var self=this;
-return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_reservedWords", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(aString, "__comma", ["_"]);})() : (function(){return aString;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(aString, "__comma", ["_"]);}), (function(){return aString;})]));
+return ["self", "super", "true", "false", "nil", "thisContext"];
 return self;}
 }),
 smalltalk.Compiler);
 
-
-smalltalk.Compiler.klass.iVarNames = ['performOptimizations'];
 smalltalk.addMethod(
 unescape('_recompile_'),
 smalltalk.method({
@@ -1591,11 +1486,11 @@ selector: unescape('recompile%3A'),
 fn: function (aClass){
 var self=this;
 smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_do_", [(function(each){var method=nil;
-(method=smalltalk.send(smalltalk.send(self, "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), aClass]));smalltalk.send(method, "_category_", [smalltalk.send(each, "_category", [])]);return smalltalk.send(aClass, "_addCompiledMethod_", [method]);})]);
+(method=smalltalk.send(self, "_load_forClass_", [smalltalk.send(each, "_source", []), aClass]));smalltalk.send(method, "_category_", [smalltalk.send(each, "_category", [])]);return smalltalk.send(aClass, "_addCompiledMethod_", [method]);})]);
 ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})]));
 return self;}
 }),
-smalltalk.Compiler.klass);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
 unescape('_recompileAll'),
@@ -1603,269 +1498,380 @@ smalltalk.method({
 selector: unescape('recompileAll'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){return smalltalk.send(self, "_recompile_", [each]);})]);
+smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){(function($rec){smalltalk.send($rec, "_show_", [each]);return smalltalk.send($rec, "_cr", []);})((smalltalk.Transcript || Transcript));return smalltalk.send((function(){return smalltalk.send(self, "_recompile_", [each]);}), "_valueWithTimeout_", [(100)]);})]);
 return self;}
 }),
-smalltalk.Compiler.klass);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_performOptimizations'),
+unescape('_safeVariableNameFor_'),
 smalltalk.method({
-selector: unescape('performOptimizations'),
-fn: function (){
+selector: unescape('safeVariableNameFor%3A'),
+fn: function (aString){
 var self=this;
-return (($receiver = self['@performOptimizations']) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver;
+return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_reservedWords", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(aString, "__comma", ["_"]);})() : (function(){return aString;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(aString, "__comma", ["_"]);}), (function(){return aString;})]));
 return self;}
 }),
-smalltalk.Compiler.klass);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_performOptimizations_'),
+unescape('_send_to_arguments_superSend_'),
 smalltalk.method({
-selector: unescape('performOptimizations%3A'),
-fn: function (aBoolean){
+selector: unescape('send%3Ato%3Aarguments%3AsuperSend%3A'),
+fn: function (aSelector, aReceiver, aCollection, aBoolean){
 var self=this;
-(self['@performOptimizations']=aBoolean);
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(str){var tmp=nil;
+(tmp=self['@stream']);smalltalk.send(str, "_nextPutAll_", [unescape("smalltalk.send%28")]);smalltalk.send(str, "_nextPutAll_", [aReceiver]);smalltalk.send(str, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%2C%20%22"), "__comma", [smalltalk.send(aSelector, "_asSelector", [])]), "__comma", [unescape("%22%2C%20%5B")])]);(self['@stream']=str);smalltalk.send(aCollection, "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);(self['@stream']=tmp);smalltalk.send(str, "_nextPutAll_", [unescape("%5D")]);((($receiver = aBoolean).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(str, "_nextPutAll_", [smalltalk.send(unescape("%2C%20smalltalk."), "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(smalltalk.send(self, "_currentClass", []), "_superclass", [])])])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(str, "_nextPutAll_", [smalltalk.send(unescape("%2C%20smalltalk."), "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(smalltalk.send(self, "_currentClass", []), "_superclass", [])])])]);})]));return smalltalk.send(str, "_nextPutAll_", [unescape("%29")]);})]);
 return self;}
 }),
-smalltalk.Compiler.klass);
-
+smalltalk.Compiler);
 
-smalltalk.addClass('BlockSequenceNode', smalltalk.SequenceNode, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_setupClass_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('setupClass%3A'),
+fn: function (aClass){
 var self=this;
-smalltalk.send(aVisitor, "_visitBlockSequenceNode_", [self]);
+smalltalk.init(aClass);
 return self;}
 }),
-smalltalk.BlockSequenceNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_isBlockSequenceNode'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('isBlockSequenceNode'),
+selector: unescape('source'),
 fn: function (){
 var self=this;
-return true;
+return (($receiver = self['@source']) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
 return self;}
 }),
-smalltalk.BlockSequenceNode);
-
+smalltalk.Compiler);
 
+smalltalk.addMethod(
+unescape('_source_'),
+smalltalk.method({
+selector: unescape('source%3A'),
+fn: function (aString){
+var self=this;
+(self['@source']=aString);
+return self;}
+}),
+smalltalk.Compiler);
 
-smalltalk.addClass('BlockNode', smalltalk.Node, ['parameters', 'inlined'], 'Compiler');
 smalltalk.addMethod(
-unescape('_parameters'),
+unescape('_tempVariables'),
 smalltalk.method({
-selector: unescape('parameters'),
+selector: unescape('tempVariables'),
 fn: function (){
 var self=this;
-return (($receiver = self['@parameters']) == nil || $receiver == undefined) ? (function(){return (self['@parameters']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return smalltalk.send(self['@tempVariables'], "_copy", []);
 return self;}
 }),
-smalltalk.BlockNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_parameters_'),
+unescape('_unknownVariables'),
 smalltalk.method({
-selector: unescape('parameters%3A'),
-fn: function (aCollection){
+selector: unescape('unknownVariables'),
+fn: function (){
 var self=this;
-(self['@parameters']=aCollection);
+return smalltalk.send(self['@unknownVariables'], "_copy", []);
 return self;}
 }),
-smalltalk.BlockNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_visit_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('visit%3A'),
+fn: function (aNode){
 var self=this;
-smalltalk.send(aVisitor, "_visitBlockNode_", [self]);
+smalltalk.send(aNode, "_accept_", [self]);
 return self;}
 }),
-smalltalk.BlockNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_isBlockNode'),
+unescape('_visitAssignmentNode_'),
 smalltalk.method({
-selector: unescape('isBlockNode'),
-fn: function (){
+selector: unescape('visitAssignmentNode%3A'),
+fn: function (aNode){
 var self=this;
-return true;
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28")]);
+smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_left", [])]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3D")]);
+smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_right", [])]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29")]);
 return self;}
 }),
-smalltalk.BlockNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_inlined'),
+unescape('_visitBlockNode_'),
 smalltalk.method({
-selector: unescape('inlined'),
-fn: function (){
+selector: unescape('visitBlockNode%3A'),
+fn: function (aNode){
 var self=this;
-return (($receiver = self['@inlined']) == nil || $receiver == undefined) ? (function(){return false;})() : $receiver;
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28function%28")]);
+smalltalk.send(smalltalk.send(aNode, "_parameters", []), "_do_separatedBy_", [(function(each){smalltalk.send(self['@tempVariables'], "_add_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29%7B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29")]);
 return self;}
 }),
-smalltalk.BlockNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_inlined_'),
+unescape('_visitBlockSequenceNode_'),
 smalltalk.method({
-selector: unescape('inlined%3A'),
-fn: function (aBoolean){
+selector: unescape('visitBlockSequenceNode%3A'),
+fn: function (aNode){
 var self=this;
-(self['@inlined']=aBoolean);
+var index=nil;
+(self['@nestedBlocks']=((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
+((($receiver = smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("return%20nil%3B")]);})() : (function(){smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
+(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);(index=(0));return smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("return%20nil%3B")]);}), (function(){smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
+(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);(index=(0));return smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);})]));
+(self['@nestedBlocks']=((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])));
 return self;}
 }),
-smalltalk.BlockNode);
-
-
+smalltalk.Compiler);
 
-smalltalk.addClass('CascadeNode', smalltalk.Node, ['receiver'], 'Compiler');
 smalltalk.addMethod(
-unescape('_receiver'),
+unescape('_visitCascadeNode_'),
 smalltalk.method({
-selector: unescape('receiver'),
-fn: function (){
+selector: unescape('visitCascadeNode%3A'),
+fn: function (aNode){
 var self=this;
-return self['@receiver'];
+var index=nil;
+(index=(0));
+((($receiver = smalltalk.send(self['@tempVariables'], "_includes_", ["$rec"])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@tempVariables'], "_add_", ["$rec"]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@tempVariables'], "_add_", ["$rec"]);})]));
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28function%28%24rec%29%7B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(each, "_receiver_", [smalltalk.send(smalltalk.send((smalltalk.VariableNode || VariableNode), "_new", []), "_value_", ["$rec"])]);smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29%28")]);
+smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_receiver", [])]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29")]);
 return self;}
 }),
-smalltalk.CascadeNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_receiver_'),
+unescape('_visitClassReferenceNode_'),
 smalltalk.method({
-selector: unescape('receiver%3A'),
+selector: unescape('visitClassReferenceNode%3A'),
 fn: function (aNode){
 var self=this;
-(self['@receiver']=aNode);
+((($receiver = smalltalk.send(self['@referencedClasses'], "_includes_", [smalltalk.send(aNode, "_value", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@referencedClasses'], "_add_", [smalltalk.send(aNode, "_value", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@referencedClasses'], "_add_", [smalltalk.send(aNode, "_value", [])]);})]));
+smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28smalltalk."), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%20%7C%7C%20")]), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%29")])]);
 return self;}
 }),
-smalltalk.CascadeNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_visitDynamicArrayNode_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('visitDynamicArrayNode%3A'),
+fn: function (aNode){
 var self=this;
-smalltalk.send(aVisitor, "_visitCascadeNode_", [self]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D")]);
 return self;}
 }),
-smalltalk.CascadeNode);
+smalltalk.Compiler);
 
+smalltalk.addMethod(
+unescape('_visitDynamicDictionaryNode_'),
+smalltalk.method({
+selector: unescape('visitDynamicDictionaryNode%3A'),
+fn: function (aNode){
+var self=this;
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("smalltalk.HashedCollection._fromPairs_%28%5B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D%29")]);
+return self;}
+}),
+smalltalk.Compiler);
 
+smalltalk.addMethod(
+unescape('_visitFailure_'),
+smalltalk.method({
+selector: unescape('visitFailure%3A'),
+fn: function (aFailure){
+var self=this;
+smalltalk.send(self, "_error_", [smalltalk.send(aFailure, "_asString", [])]);
+return self;}
+}),
+smalltalk.Compiler);
 
-smalltalk.addClass('MethodNode', smalltalk.Node, ['selector', 'arguments', 'source'], 'Compiler');
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_visitJSStatementNode_'),
 smalltalk.method({
-selector: unescape('selector'),
-fn: function (){
+selector: unescape('visitJSStatementNode%3A'),
+fn: function (aNode){
 var self=this;
-return self['@selector'];
+smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(aNode, "_source", []), "_replace_with_", [unescape("%3E%3E"), unescape("%3E")])]);
 return self;}
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_selector_'),
+unescape('_visitMethodNode_'),
 smalltalk.method({
-selector: unescape('selector%3A'),
-fn: function (aString){
+selector: unescape('visitMethodNode%3A'),
+fn: function (aNode){
 var self=this;
-(self['@selector']=aString);
+var str=nil;
+var currentSelector=nil;
+(self['@currentSelector']=smalltalk.send(smalltalk.send(aNode, "_selector", []), "_asSelector", []));
+(self['@nestedBlocks']=(0));
+(self['@earlyReturn']=false);
+(self['@messageSends']=[]);
+(self['@referencedClasses']=[]);
+(self['@unknownVariables']=[]);
+(self['@tempVariables']=[]);
+(self['@argVariables']=[]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20%22"), "__comma", [smalltalk.send(aNode, "_selector", [])]), "__comma", [unescape("%22%2C")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("source%3A%20unescape%28%22"), "__comma", [smalltalk.send(smalltalk.send(self, "_source", []), "_escaped", [])]), "__comma", [unescape("%22%29%2C")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("fn%3A%20function%28")]);
+smalltalk.send(smalltalk.send(aNode, "_arguments", []), "_do_separatedBy_", [(function(each){smalltalk.send(self['@argVariables'], "_add_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%29%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("var%20self%3Dthis%3B")]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
+(str=self['@stream']);
+(self['@stream']=smalltalk.send("", "_writeStream", []));
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
+((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(str, "_nextPutAll_", [unescape("try%7B")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(str, "_nextPutAll_", [unescape("try%7B")]);})]));
+smalltalk.send(str, "_nextPutAll_", [smalltalk.send(self['@stream'], "_contents", [])]);
+(self['@stream']=str);
+(function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("return%20self%3B")]);})(self['@stream']);
+((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27stReturn%27%20%26%26%20e.selector%20%3D%3D%3D%20"), "__comma", [smalltalk.send(self['@currentSelector'], "_printString", [])]), "__comma", [unescape("%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D")])]);})(self['@stream']);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27stReturn%27%20%26%26%20e.selector%20%3D%3D%3D%20"), "__comma", [smalltalk.send(self['@currentSelector'], "_printString", [])]), "__comma", [unescape("%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D")])]);})(self['@stream']);})]));
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D")]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%2C"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])]), "__comma", ["messageSends: "])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@messageSends'], "_asJavascript", []), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("args: ", "__comma", [smalltalk.send(self['@argVariables'], "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("referencedClasses%3A%20%5B")]);})(self['@stream']);
+smalltalk.send(self['@referencedClasses'], "_do_separatedBy_", [(function(each){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(each, "_printString", [])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D")]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29")]);
 return self;}
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_arguments'),
+unescape('_visitReturnNode_'),
 smalltalk.method({
-selector: unescape('arguments'),
-fn: function (){
+selector: unescape('visitReturnNode%3A'),
+fn: function (aNode){
 var self=this;
-return (($receiver = self['@arguments']) == nil || $receiver == undefined) ? (function(){return [];})() : $receiver;
+((($receiver = ((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver >(0) : smalltalk.send($receiver, "__gt", [(0)]))).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (self['@earlyReturn']=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (self['@earlyReturn']=true);})]));
+((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%28function%28%29%7Bthrow%28")]);smalltalk.send($rec, "_nextPutAll_", [unescape("%7Bname%3A%20%27stReturn%27%2C%20selector%3A%20")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@currentSelector'], "_printString", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20fn%3A%20function%28%29%7Breturn%20")]);})(self['@stream']);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%28function%28%29%7Bthrow%28")]);smalltalk.send($rec, "_nextPutAll_", [unescape("%7Bname%3A%20%27stReturn%27%2C%20selector%3A%20")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@currentSelector'], "_printString", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20fn%3A%20function%28%29%7Breturn%20")]);})(self['@stream']);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
+((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%7D%29%7D%29%28%29")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%7D%29%7D%29%28%29")]);})]));
 return self;}
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_arguments_'),
+unescape('_visitSendNode_'),
 smalltalk.method({
-selector: unescape('arguments%3A'),
-fn: function (aCollection){
+selector: unescape('visitSendNode%3A'),
+fn: function (aNode){
 var self=this;
-(self['@arguments']=aCollection);
+var str=nil;
+var receiver=nil;
+var superSend=nil;
+var inlined=nil;
+(str=self['@stream']);
+((($receiver = smalltalk.send(self['@messageSends'], "_includes_", [smalltalk.send(aNode, "_selector", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@messageSends'], "_add_", [smalltalk.send(aNode, "_selector", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@messageSends'], "_add_", [smalltalk.send(aNode, "_selector", [])]);})]));
+(self['@stream']=smalltalk.send("", "_writeStream", []));
+smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_receiver", [])]);
+(superSend=smalltalk.send(smalltalk.send(self['@stream'], "_contents", []), "__eq", ["super"]));
+(receiver=((($receiver = superSend).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "self";})() : (function(){return smalltalk.send(self['@stream'], "_contents", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "self";}), (function(){return smalltalk.send(self['@stream'], "_contents", []);})])));
+(self['@stream']=str);
+((($receiver = smalltalk.send(self, "_performOptimizations", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inlineLiteral_receiverNode_argumentNodes_", [smalltalk.send(aNode, "_selector", []), smalltalk.send(aNode, "_receiver", []), smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})]));})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inlineLiteral_receiverNode_argumentNodes_", [smalltalk.send(aNode, "_selector", []), smalltalk.send(aNode, "_receiver", []), smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})]));}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));
 return self;}
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_visitSequenceNode_'),
 smalltalk.method({
-selector: unescape('source'),
-fn: function (){
+selector: unescape('visitSequenceNode%3A'),
+fn: function (aNode){
 var self=this;
-return self['@source'];
+smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
+(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);}), (function(){return smalltalk.send(self['@stream'], "_lf", []);})]);
 return self;}
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_source_'),
+unescape('_visitValueNode_'),
 smalltalk.method({
-selector: unescape('source%3A'),
-fn: function (aString){
+selector: unescape('visitValueNode%3A'),
+fn: function (aNode){
 var self=this;
-(self['@source']=aString);
+smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(aNode, "_value", []), "_asJavascript", [])]);
 return self;}
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_visitVariableNode_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-fn: function (aVisitor){
+selector: unescape('visitVariableNode%3A'),
+fn: function (aNode){
 var self=this;
-smalltalk.send(aVisitor, "_visitMethodNode_", [self]);
+var varName=nil;
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_currentClass", []), "_allInstanceVariableNames", []), "_includes_", [smalltalk.send(aNode, "_value", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("self%5B%27@"), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%27%5D")])]);})() : (function(){(varName=smalltalk.send(self, "_safeVariableNameFor_", [smalltalk.send(aNode, "_value", [])]));return ((($receiver = smalltalk.send(smalltalk.send(self, "_knownVariables", []), "_includes_", [varName])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("self%5B%27@"), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%27%5D")])]);}), (function(){(varName=smalltalk.send(self, "_safeVariableNameFor_", [smalltalk.send(aNode, "_value", [])]));return ((($receiver = smalltalk.send(smalltalk.send(self, "_knownVariables", []), "_includes_", [varName])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})]));})]));
 return self;}
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 
+smalltalk.Compiler.klass.iVarNames = ['performOptimizations'];
+smalltalk.addMethod(
+unescape('_performOptimizations'),
+smalltalk.method({
+selector: unescape('performOptimizations'),
+fn: function (){
+var self=this;
+return (($receiver = self['@performOptimizations']) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver;
+return self;}
+}),
+smalltalk.Compiler.klass);
 
-smalltalk.addClass('StrippedExporter', smalltalk.Exporter, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_exportDefinitionOf_on_'),
+unescape('_performOptimizations_'),
 smalltalk.method({
-selector: unescape('exportDefinitionOf%3Aon%3A'),
-fn: function (aClass, aStream){
+selector: unescape('performOptimizations%3A'),
+fn: function (aBoolean){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addClass%28")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%27%2C%20")])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20%5B")]);})(aStream);
-smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C%20")]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%5D%2C%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(aClass, "_category", []), "__comma", [unescape("%27")])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);})(aStream);
-smalltalk.send(aStream, "_lf", []);
+(self['@performOptimizations']=aBoolean);
 return self;}
 }),
-smalltalk.StrippedExporter);
+smalltalk.Compiler.klass);
 
 smalltalk.addMethod(
-unescape('_exportMethod_of_on_'),
+unescape('_recompile_'),
 smalltalk.method({
-selector: unescape('exportMethod%3Aof%3Aon%3A'),
-fn: function (aMethod, aClass, aStream){
+selector: unescape('recompile%3A'),
+fn: function (aClass){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addMethod%28")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_asSelector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("fn: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_fn", []), "_compiledSource", [])])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%2C")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
+smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_do_", [(function(each){var method=nil;
+(method=smalltalk.send(smalltalk.send(self, "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), aClass]));smalltalk.send(method, "_category_", [smalltalk.send(each, "_category", [])]);return smalltalk.send(aClass, "_addCompiledMethod_", [method]);})]);
+((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})]));
 return self;}
 }),
-smalltalk.StrippedExporter);
+smalltalk.Compiler.klass);
 
+smalltalk.addMethod(
+unescape('_recompileAll'),
+smalltalk.method({
+selector: unescape('recompileAll'),
+fn: function (){
+var self=this;
+smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){return smalltalk.send(self, "_recompile_", [each]);})]);
+return self;}
+}),
+smalltalk.Compiler.klass);
 
 
diff --git a/amber/src/js/Compiler.js b/amber/src/js/Compiler.js
index add94f1d653..7958604e834 100755
--- a/amber/src/js/Compiler.js
+++ b/amber/src/js/Compiler.js
@@ -1,550 +1,474 @@
 smalltalk.addPackage('Compiler', {});
-smalltalk.addClass('NodeVisitor', smalltalk.Object, [], 'Compiler');
+smalltalk.addClass('ChunkParser', smalltalk.Object, ['stream'], 'Compiler');
 smalltalk.addMethod(
-unescape('_visit_'),
+unescape('_nextChunk'),
 smalltalk.method({
-selector: unescape('visit%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('nextChunk'),
+category: 'reading',
+fn: function (){
 var self=this;
-smalltalk.send(aNode, "_accept_", [self]);
-return self;},
-args: ["aNode"],
-source: unescape('visit%3A%20aNode%0A%09aNode%20accept%3A%20self'),
-messageSends: ["accept:"],
+try{var char_=nil;
+var result=nil;
+var chunk=nil;
+(result=smalltalk.send("", "_writeStream", []));
+(function(){while((function(){(char_=smalltalk.send(self['@stream'], "_next", []));return smalltalk.send(char_, "_notNil", []);})()) {(function(){((($receiver = smalltalk.send(char_, "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@stream'], "_peek", []), "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_next", []);})() : (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_next", []);}), (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@stream'], "_peek", []), "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_next", []);})() : (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_next", []);}), (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})]));})]));return smalltalk.send(result, "_nextPut_", [char_]);})()}})();
+(function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return nil}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_nextChunk'){return e.fn()} throw(e)}},
+args: [],
+source: unescape('nextChunk%0A%09%22The%20chunk%20format%20%28Smalltalk%20Interchange%20Format%20or%20Fileout%20format%29%0A%09is%20a%20trivial%20format%20but%20can%20be%20a%20bit%20tricky%20to%20understand%3A%0A%09%09-%20Uses%20the%20exclamation%20mark%20as%20delimiter%20of%20chunks.%0A%09%09-%20Inside%20a%20chunk%20a%20normal%20exclamation%20mark%20must%20be%20doubled.%0A%09%09-%20A%20non%20empty%20chunk%20must%20be%20a%20valid%20Smalltalk%20expression.%0A%09%09-%20A%20chunk%20on%20top%20level%20with%20a%20preceding%20empty%20chunk%20is%20an%20instruction%20chunk%3A%0A%09%09%09-%20The%20object%20created%20by%20the%20expression%20then%20takes%20over%20reading%20chunks.%0A%0A%09This%20metod%20returns%20next%20chunk%20as%20a%20String%20%28trimmed%29%2C%20empty%20String%20%28all%20whitespace%29%20or%20nil.%22%0A%0A%09%7C%20char%20result%20chunk%20%7C%0A%09result%20%3A%3D%20%27%27%20writeStream.%0A%20%20%20%20%20%20%20%20%5Bchar%20%3A%3D%20stream%20next.%0A%20%20%20%20%20%20%20%20char%20notNil%5D%20whileTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20char%20%3D%20%27%21%27%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20peek%20%3D%20%27%21%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ifTrue%3A%20%5Bstream%20next%20%22skipping%20the%20escape%20double%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ifFalse%3A%20%5B%5Eresult%20contents%20trimBoth%20%20%22chunk%20end%20marker%20found%22%5D%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20nextPut%3A%20char%5D.%0A%09%5Enil%20%22a%20chunk%20needs%20to%20end%20with%20%21%22'),
+messageSends: ["writeStream", "whileTrue:", "next", "notNil", "ifTrue:", unescape("%3D"), "ifTrue:ifFalse:", "peek", "trimBoth", "contents", "nextPut:"],
 referencedClasses: []
 }),
-smalltalk.NodeVisitor);
+smalltalk.ChunkParser);
 
 smalltalk.addMethod(
-unescape('_visitNode_'),
+unescape('_stream_'),
 smalltalk.method({
-selector: unescape('visitNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('stream%3A'),
+category: 'accessing',
+fn: function (aStream){
 var self=this;
-
+(self['@stream']=aStream);
 return self;},
-args: ["aNode"],
-source: unescape('visitNode%3A%20aNode'),
+args: ["aStream"],
+source: unescape('stream%3A%20aStream%0A%09stream%20%3A%3D%20aStream'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.NodeVisitor);
+smalltalk.ChunkParser);
+
 
 smalltalk.addMethod(
-unescape('_visitMethodNode_'),
+unescape('_on_'),
 smalltalk.method({
-selector: unescape('visitMethodNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('on%3A'),
+category: 'not yet classified',
+fn: function (aStream){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+return smalltalk.send(smalltalk.send(self, "_new", []), "_stream_", [aStream]);
 return self;},
-args: ["aNode"],
-source: unescape('visitMethodNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
-messageSends: ["visitNode:"],
+args: ["aStream"],
+source: unescape('on%3A%20aStream%0A%09%5Eself%20new%20stream%3A%20aStream'),
+messageSends: ["stream:", "new"],
 referencedClasses: []
 }),
-smalltalk.NodeVisitor);
+smalltalk.ChunkParser.klass);
+
 
+smalltalk.addClass('DoIt', smalltalk.Object, [], 'Compiler');
+
+
+smalltalk.addClass('Exporter', smalltalk.Object, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_visitSequenceNode_'),
+unescape('_classNameFor_'),
 smalltalk.method({
-selector: unescape('visitSequenceNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('classNameFor%3A'),
+category: 'private',
+fn: function (aClass){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
 return self;},
-args: ["aNode"],
-source: unescape('visitSequenceNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
-messageSends: ["visitNode:"],
+args: ["aClass"],
+source: unescape('classNameFor%3A%20aClass%0A%09%5EaClass%20isMetaclass%0A%09%20%20%20%20ifTrue%3A%20%5BaClass%20instanceClass%20name%2C%20%27.klass%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09aClass%20isNil%0A%09%09%20%20%20%20ifTrue%3A%20%5B%27nil%27%5D%0A%09%09%20%20%20%20ifFalse%3A%20%5BaClass%20name%5D%5D'),
+messageSends: ["ifTrue:ifFalse:", "isMetaclass", unescape("%2C"), "name", "instanceClass", "isNil"],
 referencedClasses: []
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitBlockSequenceNode_'),
+unescape('_exportAll'),
 smalltalk.method({
-selector: unescape('visitBlockSequenceNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('exportAll'),
+category: 'fileOut',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_visitSequenceNode_", [aNode]);
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){return smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_packages", []), "_do_", [(function(pkg){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self, "_exportPackage_", [smalltalk.send(pkg, "_name", [])])]);})]);})]);
 return self;},
-args: ["aNode"],
-source: unescape('visitBlockSequenceNode%3A%20aNode%0A%09self%20visitSequenceNode%3A%20aNode'),
-messageSends: ["visitSequenceNode:"],
-referencedClasses: []
+args: [],
+source: unescape('exportAll%0A%20%20%20%20%22Export%20all%20packages%20in%20the%20system.%22%0A%0A%20%20%20%20%5EString%20streamContents%3A%20%5B%3Astream%20%7C%0A%20%20%20%20%09Smalltalk%20current%20packages%20do%3A%20%5B%3Apkg%20%7C%0A%09%09stream%20nextPutAll%3A%20%28self%20exportPackage%3A%20pkg%20name%29%5D%5D'),
+messageSends: ["streamContents:", "do:", "packages", "current", "nextPutAll:", "exportPackage:", "name"],
+referencedClasses: ["String", "Smalltalk"]
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitBlockNode_'),
+unescape('_exportClass_'),
 smalltalk.method({
-selector: unescape('visitBlockNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('exportClass%3A'),
+category: 'fileOut',
+fn: function (aClass){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){smalltalk.send(self, "_exportDefinitionOf_on_", [aClass, stream]);smalltalk.send(self, "_exportMethodsOf_on_", [aClass, stream]);smalltalk.send(self, "_exportMetaDefinitionOf_on_", [aClass, stream]);return smalltalk.send(self, "_exportMethodsOf_on_", [smalltalk.send(aClass, "_class", []), stream]);})]);
 return self;},
-args: ["aNode"],
-source: unescape('visitBlockNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
-messageSends: ["visitNode:"],
-referencedClasses: []
+args: ["aClass"],
+source: unescape('exportClass%3A%20aClass%0A%09%22Export%20a%20single%20class.%20Subclasses%20override%20these%20methods.%22%0A%0A%09%5EString%20streamContents%3A%20%5B%3Astream%20%7C%0A%09%09self%20exportDefinitionOf%3A%20aClass%20on%3A%20stream.%0A%09%09self%20exportMethodsOf%3A%20aClass%20on%3A%20stream.%0A%09%09self%20exportMetaDefinitionOf%3A%20aClass%20on%3A%20stream.%0A%09%09self%20exportMethodsOf%3A%20aClass%20class%20on%3A%20stream%5D'),
+messageSends: ["streamContents:", "exportDefinitionOf:on:", "exportMethodsOf:on:", "exportMetaDefinitionOf:on:", "class"],
+referencedClasses: ["String"]
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitReturnNode_'),
+unescape('_exportDefinitionOf_on_'),
 smalltalk.method({
-selector: unescape('visitReturnNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('exportDefinitionOf%3Aon%3A'),
+category: 'private',
+fn: function (aClass, aStream){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addClass%28")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%27%2C%20")])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20%5B")]);})(aStream);
+smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C%20")]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%5D%2C%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(aClass, "_category", []), "__comma", [unescape("%27")])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);})(aStream);
+((($receiver = smalltalk.send(smalltalk.send(aClass, "_comment", []), "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [aClass])]);smalltalk.send($rec, "_nextPutAll_", [unescape(".comment%3D")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aClass, "_comment", []), "_escaped", [])]), "__comma", [unescape("%27%29")])]);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [aClass])]);smalltalk.send($rec, "_nextPutAll_", [unescape(".comment%3D")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aClass, "_comment", []), "_escaped", [])]), "__comma", [unescape("%27%29")])]);})(aStream);})]));
+smalltalk.send(aStream, "_lf", []);
 return self;},
-args: ["aNode"],
-source: unescape('visitReturnNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
-messageSends: ["visitNode:"],
+args: ["aClass", "aStream"],
+source: unescape('exportDefinitionOf%3A%20aClass%20on%3A%20aStream%0A%09aStream%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.addClass%28%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%2C%20%28self%20classNameFor%3A%20aClass%29%2C%20%27%27%27%2C%20%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.%27%2C%20%28self%20classNameFor%3A%20aClass%20superclass%29%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%2C%20%5B%27.%0A%09aClass%20instanceVariableNames%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20aStream%20nextPutAll%3A%20%27%27%27%27%2C%20each%2C%20%27%27%27%27%5D%0A%09%20%20%20%20separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09aStream%09%0A%09%20%20%20%20nextPutAll%3A%20%27%5D%2C%20%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aClass%20category%2C%20%27%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%29%3B%27.%0A%09aClass%20comment%20notEmpty%20ifTrue%3A%20%5B%0A%09%20%20%20%20aStream%20%0A%09%20%20%20%20%09lf%3B%0A%09%09nextPutAll%3A%20%27smalltalk.%27%3B%0A%09%09nextPutAll%3A%20%28self%20classNameFor%3A%20aClass%29%3B%0A%09%09nextPutAll%3A%20%27.comment%3D%27%3B%0A%09%09nextPutAll%3A%20%27unescape%28%27%27%27%2C%20aClass%20comment%20escaped%2C%20%27%27%27%29%27%5D.%0A%09aStream%20lf'),
+messageSends: ["nextPutAll:", unescape("%2C"), "classNameFor:", "superclass", "do:separatedBy:", "instanceVariableNames", "category", "ifTrue:", "notEmpty", "comment", "lf", "escaped"],
 referencedClasses: []
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitSendNode_'),
+unescape('_exportMetaDefinitionOf_on_'),
 smalltalk.method({
-selector: unescape('visitSendNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('exportMetaDefinitionOf%3Aon%3A'),
+category: 'private',
+fn: function (aClass, aStream){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape(".iVarNames%20%3D%20%5B")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(unescape("%5D%3B"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape(".iVarNames%20%3D%20%5B")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(unescape("%5D%3B"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])])]);})]));
 return self;},
-args: ["aNode"],
-source: unescape('visitSendNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
-messageSends: ["visitNode:"],
-referencedClasses: []
+args: ["aClass", "aStream"],
+source: unescape('exportMetaDefinitionOf%3A%20aClass%20on%3A%20aStream%0A%09aClass%20class%20instanceVariableNames%20isEmpty%20ifFalse%3A%20%5B%0A%09%20%20%20%20aStream%20%0A%09%09nextPutAll%3A%20%27smalltalk.%27%2C%20%28self%20classNameFor%3A%20aClass%20class%29%3B%0A%09%09nextPutAll%3A%20%27.iVarNames%20%3D%20%5B%27.%0A%09%20%20%20%20aClass%20class%20instanceVariableNames%0A%09%09do%3A%20%5B%3Aeach%20%7C%20aStream%20nextPutAll%3A%20%27%27%27%27%2C%20each%2C%20%27%27%27%27%5D%0A%09%09separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09%20%20%20%20aStream%20nextPutAll%3A%20%27%5D%3B%27%2C%20String%20lf%5D'),
+messageSends: ["ifFalse:", "isEmpty", "instanceVariableNames", "class", "nextPutAll:", unescape("%2C"), "classNameFor:", "do:separatedBy:", "lf"],
+referencedClasses: ["String"]
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitCascadeNode_'),
+unescape('_exportMethod_of_on_'),
 smalltalk.method({
-selector: unescape('visitCascadeNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('exportMethod%3Aof%3Aon%3A'),
+category: 'private',
+fn: function (aMethod, aClass, aStream){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addMethod%28")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_asSelector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("category%3A%20%27"), "__comma", [smalltalk.send(aMethod, "_category", [])]), "__comma", [unescape("%27%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("fn: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_fn", []), "_compiledSource", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("args: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_arguments", []), "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("source%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_source", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("messageSends: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_messageSends", []), "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("referencedClasses: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_referencedClasses", []), "_asJavascript", [])])]);})(aStream);
+(function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%2C")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
 return self;},
-args: ["aNode"],
-source: unescape('visitCascadeNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
-messageSends: ["visitNode:"],
+args: ["aMethod", "aClass", "aStream"],
+source: unescape('exportMethod%3A%20aMethod%20of%3A%20aClass%20on%3A%20aStream%0A%09aStream%20%0A%09%09nextPutAll%3A%20%27smalltalk.addMethod%28%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27unescape%28%27%27%27%2C%20aMethod%20selector%20asSelector%20escaped%2C%20%27%27%27%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27smalltalk.method%28%7B%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27selector%3A%20unescape%28%27%27%27%2C%20aMethod%20selector%20escaped%2C%20%27%27%27%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27category%3A%20%27%27%27%2C%20aMethod%20category%2C%20%27%27%27%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27fn%3A%20%27%2C%20aMethod%20fn%20compiledSource%2C%20%27%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27args%3A%20%27%2C%20aMethod%20arguments%20asJavascript%2C%20%27%2C%27%3B%20lf%3B%0A%09%09nextPutAll%3A%20%27source%3A%20unescape%28%27%27%27%2C%20aMethod%20source%20escaped%2C%20%27%27%27%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27messageSends%3A%20%27%2C%20aMethod%20messageSends%20asJavascript%2C%20%27%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27referencedClasses%3A%20%27%2C%20aMethod%20referencedClasses%20asJavascript.%0A%09aStream%0A%09%09lf%3B%0A%09%09nextPutAll%3A%20%27%7D%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27smalltalk.%27%2C%20%28self%20classNameFor%3A%20aClass%29%3B%0A%09%09nextPutAll%3A%20%27%29%3B%27%3Blf%3Blf'),
+messageSends: ["nextPutAll:", "lf", unescape("%2C"), "escaped", "asSelector", "selector", "category", "compiledSource", "fn", "asJavascript", "arguments", "source", "messageSends", "referencedClasses", "classNameFor:"],
 referencedClasses: []
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitValueNode_'),
+unescape('_exportMethodsOf_on_'),
 smalltalk.method({
-selector: unescape('visitValueNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('exportMethodsOf%3Aon%3A'),
+category: 'private',
+fn: function (aClass, aStream){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_selector", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(b, "_selector", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(b, "_selector", [])]));})]), "_do_", [(function(each){return ((($receiver = smalltalk.send(smalltalk.send(each, "_category", []), "_match_", [unescape("%5E%5C*")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})]));})]);
+smalltalk.send(aStream, "_lf", []);
 return self;},
-args: ["aNode"],
-source: unescape('visitValueNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
-messageSends: ["visitNode:"],
+args: ["aClass", "aStream"],
+source: unescape('exportMethodsOf%3A%20aClass%20on%3A%20aStream%0A%09%22Issue%20%23143%3A%20sort%20methods%20alphabetically%22%0A%0A%09%28%28aClass%20methodDictionary%20values%29%20sorted%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20selector%20%3C%3D%20b%20selector%5D%29%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%28each%20category%20match%3A%20%27%5E%5C*%27%29%20ifFalse%3A%20%5B%0A%09%09%09self%20exportMethod%3A%20each%20of%3A%20aClass%20on%3A%20aStream%5D%5D.%0A%09aStream%20lf'),
+messageSends: ["do:", "sorted:", "values", "methodDictionary", unescape("%3C%3D"), "selector", "ifFalse:", "match:", "category", "exportMethod:of:on:", "lf"],
 referencedClasses: []
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitVariableNode_'),
+unescape('_exportPackage_'),
 smalltalk.method({
-selector: unescape('visitVariableNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('exportPackage%3A'),
+category: 'fileOut',
+fn: function (packageName){
 var self=this;
-
+var package=nil;
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){(package=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_packageAt_", [packageName]));smalltalk.send(self, "_exportPackageDefinitionOf_on_", [package, stream]);smalltalk.send(smalltalk.send(package, "_sortedClasses", []), "_do_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self, "_exportClass_", [each])]);})]);return smalltalk.send(self, "_exportPackageExtensionsOf_on_", [package, stream]);})]);
 return self;},
-args: ["aNode"],
-source: unescape('visitVariableNode%3A%20aNode'),
-messageSends: [],
-referencedClasses: []
+args: ["packageName"],
+source: unescape('exportPackage%3A%20packageName%0A%09%22Export%20a%20given%20package%20by%20name.%22%0A%0A%09%7C%20package%20%7C%0A%09%5EString%20streamContents%3A%20%5B%3Astream%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20package%20%3A%3D%20Smalltalk%20current%20packageAt%3A%20packageName.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20exportPackageDefinitionOf%3A%20package%20on%3A%20stream.%0A%09%09%22Export%20classes%20in%20dependency%20order%22%0A%09%20%20%20%20%09package%20sortedClasses%20do%3A%20%5B%3Aeach%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%28self%20exportClass%3A%20each%29%5D.%0A%09%09self%20exportPackageExtensionsOf%3A%20package%20on%3A%20stream%5D'),
+messageSends: ["streamContents:", "packageAt:", "current", "exportPackageDefinitionOf:on:", "do:", "sortedClasses", "nextPutAll:", "exportClass:", "exportPackageExtensionsOf:on:"],
+referencedClasses: ["String", "Smalltalk"]
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitAssignmentNode_'),
+unescape('_exportPackageDefinitionOf_on_'),
 smalltalk.method({
-selector: unescape('visitAssignmentNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('exportPackageDefinitionOf%3Aon%3A'),
+category: 'private',
+fn: function (package, aStream){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addPackage%28")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(package, "_name", [])]), "__comma", [unescape("%27%2C%20")]), "__comma", [smalltalk.send(package, "_propertiesAsJSON", [])]), "__comma", [unescape("%29%3B")])]);})(aStream);
+smalltalk.send(aStream, "_lf", []);
 return self;},
-args: ["aNode"],
-source: unescape('visitAssignmentNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
-messageSends: ["visitNode:"],
+args: ["package", "aStream"],
+source: unescape('exportPackageDefinitionOf%3A%20package%20on%3A%20aStream%0A%09aStream%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.addPackage%28%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%2C%20package%20name%2C%20%27%27%27%2C%20%27%2C%20package%20propertiesAsJSON%20%2C%20%27%29%3B%27.%0A%09aStream%20lf'),
+messageSends: ["nextPutAll:", unescape("%2C"), "name", "propertiesAsJSON", "lf"],
 referencedClasses: []
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
 smalltalk.addMethod(
-unescape('_visitClassReferenceNode_'),
+unescape('_exportPackageExtensionsOf_on_'),
 smalltalk.method({
-selector: unescape('visitClassReferenceNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('exportPackageExtensionsOf%3Aon%3A'),
+category: 'private',
+fn: function (package, aStream){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(aNode, "_value", [])]);})(self);
+var name=nil;
+(name=smalltalk.send(package, "_name", []));
+smalltalk.send(smalltalk.send((smalltalk.Package || Package), "_sortedClasses_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", [])]), "_do_", [(function(each){return smalltalk.send([each,smalltalk.send(each, "_class", [])], "_do_", [(function(aClass){return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_selector", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(b, "_selector", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(b, "_selector", [])]));})]), "_do_", [(function(method){return ((($receiver = smalltalk.send(smalltalk.send(method, "_category", []), "_match_", [smalltalk.send(unescape("%5E%5C*"), "__comma", [name])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_exportMethod_of_on_", [method, each, aStream]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self, "_exportMethod_of_on_", [method, each, aStream]);})]));})]);})]);})]);
 return self;},
-args: ["aNode"],
-source: unescape('visitClassReferenceNode%3A%20aNode%0A%09self%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aNode%20value'),
-messageSends: ["nextPutAll:", "value"],
-referencedClasses: []
+args: ["package", "aStream"],
+source: unescape('exportPackageExtensionsOf%3A%20package%20on%3A%20aStream%0A%09%22Issue%20%23143%3A%20sort%20classes%20and%20methods%20alphabetically%22%0A%0A%09%7C%20name%20%7C%0A%09name%20%3A%3D%20package%20name.%0A%09%28Package%20sortedClasses%3A%20Smalltalk%20current%20classes%29%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%7Beach.%20each%20class%7D%20do%3A%20%5B%3AaClass%20%7C%20%0A%09%09%09%28%28aClass%20methodDictionary%20values%29%20sorted%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20selector%20%3C%3D%20b%20selector%5D%29%20do%3A%20%5B%3Amethod%20%7C%0A%09%09%09%09%28method%20category%20match%3A%20%27%5E%5C*%27%2C%20name%29%20ifTrue%3A%20%5B%0A%09%09%09%09%09self%20exportMethod%3A%20method%20of%3A%20each%20on%3A%20aStream%20%5D%5D%5D%5D%0A'),
+messageSends: ["name", "do:", "sortedClasses:", "classes", "current", "class", "sorted:", "values", "methodDictionary", unescape("%3C%3D"), "selector", "ifTrue:", "match:", "category", unescape("%2C"), "exportMethod:of:on:"],
+referencedClasses: ["Package", "Smalltalk"]
 }),
-smalltalk.NodeVisitor);
+smalltalk.Exporter);
 
-smalltalk.addMethod(
-unescape('_visitJSStatementNode_'),
-smalltalk.method({
-selector: unescape('visitJSStatementNode%3A'),
-category: 'visiting',
-fn: function (aNode){
-var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("function%28%29%7B")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(aNode, "_source", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%28%29")]);})(self);
-return self;},
-args: ["aNode"],
-source: unescape('visitJSStatementNode%3A%20aNode%0A%09self%20%0A%09%20%20%20%20nextPutAll%3A%20%27function%28%29%7B%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aNode%20source%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%7D%29%28%29%27'),
-messageSends: ["nextPutAll:", "source"],
-referencedClasses: []
-}),
-smalltalk.NodeVisitor);
 
-smalltalk.addMethod(
-unescape('_visitDynamicArrayNode_'),
-smalltalk.method({
-selector: unescape('visitDynamicArrayNode%3A'),
-category: 'visiting',
-fn: function (aNode){
-var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
-return self;},
-args: ["aNode"],
-source: unescape('visitDynamicArrayNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
-messageSends: ["visitNode:"],
-referencedClasses: []
-}),
-smalltalk.NodeVisitor);
 
+smalltalk.addClass('ChunkExporter', smalltalk.Exporter, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_visitDynamicDictionaryNode_'),
+unescape('_chunkEscape_'),
 smalltalk.method({
-selector: unescape('visitDynamicDictionaryNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('chunkEscape%3A'),
+category: 'not yet classified',
+fn: function (aString){
 var self=this;
-smalltalk.send(self, "_visitNode_", [aNode]);
+return smalltalk.send(smalltalk.send(aString, "_replace_with_", [unescape("%21"), unescape("%21%21")]), "_trimBoth", []);
 return self;},
-args: ["aNode"],
-source: unescape('visitDynamicDictionaryNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
-messageSends: ["visitNode:"],
+args: ["aString"],
+source: unescape('chunkEscape%3A%20aString%0A%09%22Replace%20all%20occurrences%20of%20%21%20with%20%21%21%20and%20trim%20at%20both%20ends.%22%0A%0A%09%5E%28aString%20replace%3A%20%27%21%27%20with%3A%20%27%21%21%27%29%20trimBoth'),
+messageSends: ["trimBoth", "replace:with:"],
 referencedClasses: []
 }),
-smalltalk.NodeVisitor);
-
-
-
-smalltalk.addClass('DoIt', smalltalk.Object, [], 'Compiler');
-
+smalltalk.ChunkExporter);
 
-smalltalk.addClass('Importer', smalltalk.Object, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_import_'),
+unescape('_classNameFor_'),
 smalltalk.method({
-selector: unescape('import%3A'),
-category: 'fileIn',
-fn: function (aStream){
+selector: unescape('classNameFor%3A'),
+category: 'not yet classified',
+fn: function (aClass){
 var self=this;
-var chunk=nil;
-var result=nil;
-var parser=nil;
-var lastEmpty=nil;
-(parser=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_on_", [aStream]));
-(lastEmpty=false);
-(function(){while(!(function(){(chunk=smalltalk.send(parser, "_nextChunk", []));return smalltalk.send(chunk, "_isNil", []);})()) {(function(){return ((($receiver = smalltalk.send(chunk, "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (lastEmpty=true);})() : (function(){(result=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [chunk]));return ((($receiver = lastEmpty).klass === smalltalk.Boolean) ? ($receiver ? (function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (lastEmpty=true);}), (function(){(result=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [chunk]));return ((($receiver = lastEmpty).klass === smalltalk.Boolean) ? ($receiver ? (function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})]));})]));})()}})();
+return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [" class"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [" class"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
 return self;},
-args: ["aStream"],
-source: unescape('import%3A%20aStream%0A%20%20%20%20%7C%20chunk%20result%20parser%20lastEmpty%20%7C%0A%20%20%20%20parser%20%3A%3D%20ChunkParser%20on%3A%20aStream.%0A%20%20%20%20lastEmpty%20%3A%3D%20false.%0A%20%20%20%20%5Bchunk%20%3A%3D%20parser%20nextChunk.%0A%20%20%20%20%20chunk%20isNil%5D%20whileFalse%3A%20%5B%0A%20%20%20%20%20%20%20%20chunk%20isEmpty%0A%20%20%20%20%20%20%20%09%09ifTrue%3A%20%5BlastEmpty%20%3A%3D%20true%5D%0A%20%20%20%20%20%20%20%09%09ifFalse%3A%20%5B%0A%20%20%20%20%20%20%20%20%09%09result%20%3A%3D%20Compiler%20new%20loadExpression%3A%20chunk.%0A%20%20%20%20%20%20%20%20%09%09lastEmpty%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09lastEmpty%20%3A%3D%20false.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09result%20scanFrom%3A%20parser%5D%5D%5D'),
-messageSends: ["on:", "whileFalse:", "nextChunk", "isNil", "ifTrue:ifFalse:", "isEmpty", "loadExpression:", "new", "ifTrue:", "scanFrom:"],
-referencedClasses: ["ChunkParser", "Compiler"]
+args: ["aClass"],
+source: unescape('classNameFor%3A%20aClass%0A%09%5EaClass%20isMetaclass%0A%09%20%20%20%20ifTrue%3A%20%5BaClass%20instanceClass%20name%2C%20%27%20class%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09aClass%20isNil%0A%09%09%20%20%20%20ifTrue%3A%20%5B%27nil%27%5D%0A%09%09%20%20%20%20ifFalse%3A%20%5BaClass%20name%5D%5D'),
+messageSends: ["ifTrue:ifFalse:", "isMetaclass", unescape("%2C"), "name", "instanceClass", "isNil"],
+referencedClasses: []
 }),
-smalltalk.Importer);
-
-
+smalltalk.ChunkExporter);
 
-smalltalk.addClass('Exporter', smalltalk.Object, [], 'Compiler');
 smalltalk.addMethod(
 unescape('_exportDefinitionOf_on_'),
 smalltalk.method({
 selector: unescape('exportDefinitionOf%3Aon%3A'),
-category: 'private',
+category: 'not yet classified',
 fn: function (aClass, aStream){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addClass%28")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%27%2C%20")])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20%5B")]);})(aStream);
-smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C%20")]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%5D%2C%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(aClass, "_category", []), "__comma", [unescape("%27")])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);})(aStream);
-((($receiver = smalltalk.send(smalltalk.send(aClass, "_comment", []), "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [aClass])]);smalltalk.send($rec, "_nextPutAll_", [unescape(".comment%3D")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aClass, "_comment", []), "_escaped", [])]), "__comma", [unescape("%27%29")])]);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [aClass])]);smalltalk.send($rec, "_nextPutAll_", [unescape(".comment%3D")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aClass, "_comment", []), "_escaped", [])]), "__comma", [unescape("%27%29")])]);})(aStream);})]));
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(unescape("%20subclass%3A%20%23"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("%09instanceVariableNames%3A%20%27")]);})(aStream);
+smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%09package%3A%20%27"), "__comma", [smalltalk.send(aClass, "_category", [])]), "__comma", [unescape("%27%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);
+((($receiver = smalltalk.send(smalltalk.send(aClass, "_comment", []), "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%20commentStamp%21")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aClass, "_comment", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%20commentStamp%21")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aClass, "_comment", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);})]));
 smalltalk.send(aStream, "_lf", []);
 return self;},
 args: ["aClass", "aStream"],
-source: unescape('exportDefinitionOf%3A%20aClass%20on%3A%20aStream%0A%09aStream%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.addClass%28%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%2C%20%28self%20classNameFor%3A%20aClass%29%2C%20%27%27%27%2C%20%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.%27%2C%20%28self%20classNameFor%3A%20aClass%20superclass%29%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%2C%20%5B%27.%0A%09aClass%20instanceVariableNames%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20aStream%20nextPutAll%3A%20%27%27%27%27%2C%20each%2C%20%27%27%27%27%5D%0A%09%20%20%20%20separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09aStream%09%0A%09%20%20%20%20nextPutAll%3A%20%27%5D%2C%20%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aClass%20category%2C%20%27%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%29%3B%27.%0A%09aClass%20comment%20notEmpty%20ifTrue%3A%20%5B%0A%09%20%20%20%20aStream%20%0A%09%20%20%20%20%09lf%3B%0A%09%09nextPutAll%3A%20%27smalltalk.%27%3B%0A%09%09nextPutAll%3A%20%28self%20classNameFor%3A%20aClass%29%3B%0A%09%09nextPutAll%3A%20%27.comment%3D%27%3B%0A%09%09nextPutAll%3A%20%27unescape%28%27%27%27%2C%20aClass%20comment%20escaped%2C%20%27%27%27%29%27%5D.%0A%09aStream%20lf'),
-messageSends: ["nextPutAll:", unescape("%2C"), "classNameFor:", "superclass", "do:separatedBy:", "instanceVariableNames", "category", "ifTrue:", "notEmpty", "comment", "lf", "escaped"],
+source: unescape('exportDefinitionOf%3A%20aClass%20on%3A%20aStream%0A%20%20%20%20%22Chunk%20format.%22%0A%0A%20%20%20%20aStream%20%0A%20%20%20%20%20%20%20%20nextPutAll%3A%20%28self%20classNameFor%3A%20aClass%20superclass%29%3B%0A%20%20%20%20%20%20%20%20nextPutAll%3A%20%27%20subclass%3A%20%23%27%2C%20%28self%20classNameFor%3A%20aClass%29%3B%20lf%3B%0A%20%20%20%20%20%20%20%20nextPutAll%3A%20%27%09instanceVariableNames%3A%20%27%27%27.%0A%20%20%20%20aClass%20instanceVariableNames%20%0A%20%20%20%20%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20aStream%20nextPutAll%3A%20each%5D%0A%20%20%20%20%20%20%20%20separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%20%27%5D.%0A%20%20%20%20aStream%20%0A%20%20%20%20%20%20%20%20nextPutAll%3A%20%27%27%27%27%3B%20lf%3B%0A%20%20%20%20%20%20%20%20nextPutAll%3A%20%27%09package%3A%20%27%27%27%2C%20aClass%20category%2C%20%27%27%27%21%27%3B%20lf.%0A%20%20%20%20aClass%20comment%20notEmpty%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20aStream%20%0A%20%20%20%20%20%20%20%20nextPutAll%3A%20%27%21%27%2C%20%28self%20classNameFor%3A%20aClass%29%2C%20%27%20commentStamp%21%27%3Blf%3B%0A%20%20%20%20%20%20%20%20nextPutAll%3A%20%28self%20chunkEscape%3A%20aClass%20comment%29%2C%20%27%21%27%3Blf%5D.%0A%20%20%20%20aStream%20lf'),
+messageSends: ["nextPutAll:", "classNameFor:", "superclass", unescape("%2C"), "lf", "do:separatedBy:", "instanceVariableNames", "category", "ifTrue:", "notEmpty", "comment", "chunkEscape:"],
 referencedClasses: []
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
 unescape('_exportMetaDefinitionOf_on_'),
 smalltalk.method({
 selector: unescape('exportMetaDefinitionOf%3Aon%3A'),
-category: 'private',
-fn: function (aClass, aStream){
-var self=this;
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape(".iVarNames%20%3D%20%5B")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(unescape("%5D%3B"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape(".iVarNames%20%3D%20%5B")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(unescape("%5D%3B"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])])]);})]));
-return self;},
-args: ["aClass", "aStream"],
-source: unescape('exportMetaDefinitionOf%3A%20aClass%20on%3A%20aStream%0A%09aClass%20class%20instanceVariableNames%20isEmpty%20ifFalse%3A%20%5B%0A%09%20%20%20%20aStream%20%0A%09%09nextPutAll%3A%20%27smalltalk.%27%2C%20%28self%20classNameFor%3A%20aClass%20class%29%3B%0A%09%09nextPutAll%3A%20%27.iVarNames%20%3D%20%5B%27.%0A%09%20%20%20%20aClass%20class%20instanceVariableNames%0A%09%09do%3A%20%5B%3Aeach%20%7C%20aStream%20nextPutAll%3A%20%27%27%27%27%2C%20each%2C%20%27%27%27%27%5D%0A%09%09separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09%20%20%20%20aStream%20nextPutAll%3A%20%27%5D%3B%27%2C%20String%20lf%5D'),
-messageSends: ["ifFalse:", "isEmpty", "instanceVariableNames", "class", "nextPutAll:", unescape("%2C"), "classNameFor:", "do:separatedBy:", "lf"],
-referencedClasses: ["String"]
-}),
-smalltalk.Exporter);
-
-smalltalk.addMethod(
-unescape('_exportMethodsOf_on_'),
-smalltalk.method({
-selector: unescape('exportMethodsOf%3Aon%3A'),
-category: 'private',
+category: 'not yet classified',
 fn: function (aClass, aStream){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(smalltalk.send(each, "_category", []), "_match_", [unescape("%5E%5C*")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})]));})]);
-smalltalk.send(aStream, "_lf", []);
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%20instanceVariableNames%3A%20%27")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%20instanceVariableNames%3A%20%27")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);})]));
 return self;},
 args: ["aClass", "aStream"],
-source: unescape('exportMethodsOf%3A%20aClass%20on%3A%20aStream%0A%09aClass%20methodDictionary%20values%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%28each%20category%20match%3A%20%27%5E%5C*%27%29%20ifFalse%3A%20%5B%0A%09%09%09self%20exportMethod%3A%20each%20of%3A%20aClass%20on%3A%20aStream%5D%5D.%0A%09aStream%20lf'),
-messageSends: ["do:", "values", "methodDictionary", "ifFalse:", "match:", "category", "exportMethod:of:on:", "lf"],
-referencedClasses: []
-}),
-smalltalk.Exporter);
-
-smalltalk.addMethod(
-unescape('_classNameFor_'),
-smalltalk.method({
-selector: unescape('classNameFor%3A'),
-category: 'private',
-fn: function (aClass){
-var self=this;
-return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
-return self;},
-args: ["aClass"],
-source: unescape('classNameFor%3A%20aClass%0A%09%5EaClass%20isMetaclass%0A%09%20%20%20%20ifTrue%3A%20%5BaClass%20instanceClass%20name%2C%20%27.klass%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09aClass%20isNil%0A%09%09%20%20%20%20ifTrue%3A%20%5B%27nil%27%5D%0A%09%09%20%20%20%20ifFalse%3A%20%5BaClass%20name%5D%5D'),
-messageSends: ["ifTrue:ifFalse:", "isMetaclass", unescape("%2C"), "name", "instanceClass", "isNil"],
+source: unescape('exportMetaDefinitionOf%3A%20aClass%20on%3A%20aStream%0A%0A%09aClass%20class%20instanceVariableNames%20isEmpty%20ifFalse%3A%20%5B%0A%09%09aStream%20%0A%09%09%20%20%20%20nextPutAll%3A%20%28self%20classNameFor%3A%20aClass%20class%29%3B%0A%09%09%20%20%20%20nextPutAll%3A%20%27%20instanceVariableNames%3A%20%27%27%27.%0A%09%09aClass%20class%20instanceVariableNames%20%0A%09%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20aStream%20nextPutAll%3A%20each%5D%0A%09%09%20%20%20%20separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%20%27%5D.%0A%09%09aStream%09%0A%09%09%20%20%20%20nextPutAll%3A%20%27%27%27%21%27%3B%20lf%3B%20lf%5D'),
+messageSends: ["ifFalse:", "isEmpty", "instanceVariableNames", "class", "nextPutAll:", "classNameFor:", "do:separatedBy:", "lf"],
 referencedClasses: []
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
 unescape('_exportMethod_of_on_'),
 smalltalk.method({
 selector: unescape('exportMethod%3Aof%3Aon%3A'),
-category: 'private',
+category: 'not yet classified',
 fn: function (aMethod, aClass, aStream){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addMethod%28")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_asSelector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("category%3A%20%27"), "__comma", [smalltalk.send(aMethod, "_category", [])]), "__comma", [unescape("%27%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("fn: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_fn", []), "_compiledSource", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("args: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_arguments", []), "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("source%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_source", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("messageSends: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_messageSends", []), "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("referencedClasses: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_referencedClasses", []), "_asJavascript", [])])]);})(aStream);
-(function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%2C")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
+(function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aMethod, "_source", [])])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("%21")]);})(aStream);
 return self;},
 args: ["aMethod", "aClass", "aStream"],
-source: unescape('exportMethod%3A%20aMethod%20of%3A%20aClass%20on%3A%20aStream%0A%09aStream%20%0A%09%09nextPutAll%3A%20%27smalltalk.addMethod%28%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27unescape%28%27%27%27%2C%20aMethod%20selector%20asSelector%20escaped%2C%20%27%27%27%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27smalltalk.method%28%7B%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27selector%3A%20unescape%28%27%27%27%2C%20aMethod%20selector%20escaped%2C%20%27%27%27%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27category%3A%20%27%27%27%2C%20aMethod%20category%2C%20%27%27%27%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27fn%3A%20%27%2C%20aMethod%20fn%20compiledSource%2C%20%27%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27args%3A%20%27%2C%20aMethod%20arguments%20asJavascript%2C%20%27%2C%27%3B%20lf%3B%0A%09%09nextPutAll%3A%20%27source%3A%20unescape%28%27%27%27%2C%20aMethod%20source%20escaped%2C%20%27%27%27%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27messageSends%3A%20%27%2C%20aMethod%20messageSends%20asJavascript%2C%20%27%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27referencedClasses%3A%20%27%2C%20aMethod%20referencedClasses%20asJavascript.%0A%09aStream%0A%09%09lf%3B%0A%09%09nextPutAll%3A%20%27%7D%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27smalltalk.%27%2C%20%28self%20classNameFor%3A%20aClass%29%3B%0A%09%09nextPutAll%3A%20%27%29%3B%27%3Blf%3Blf'),
-messageSends: ["nextPutAll:", "lf", unescape("%2C"), "escaped", "asSelector", "selector", "category", "compiledSource", "fn", "asJavascript", "arguments", "source", "messageSends", "referencedClasses", "classNameFor:"],
+source: unescape('exportMethod%3A%20aMethod%20of%3A%20aClass%20on%3A%20aStream%0A%09aStream%20%0A%09%09lf%3B%20lf%3B%20nextPutAll%3A%20%28self%20chunkEscape%3A%20aMethod%20source%29%3B%20lf%3B%0A%09%09nextPutAll%3A%20%27%21%27'),
+messageSends: ["lf", "nextPutAll:", "chunkEscape:", "source"],
 referencedClasses: []
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
-unescape('_exportPackage_'),
+unescape('_exportMethods_category_of_on_'),
 smalltalk.method({
-selector: unescape('exportPackage%3A'),
-category: 'fileOut',
-fn: function (packageName){
+selector: unescape('exportMethods%3Acategory%3Aof%3Aon%3A'),
+category: 'not yet classified',
+fn: function (methods, category, aClass, aStream){
 var self=this;
-var package=nil;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){(package=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_packageAt_", [packageName]));smalltalk.send(self, "_exportPackageDefinitionOf_on_", [package, stream]);smalltalk.send(smalltalk.send(package, "_sortedClasses", []), "_do_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self, "_exportClass_", [each])]);})]);return smalltalk.send(self, "_exportPackageExtensionsOf_on_", [package, stream]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%20methodsFor%3A%20%27"), "__comma", [category]), "__comma", [unescape("%27%21")])]);})(aStream);
+smalltalk.send(smalltalk.send(methods, "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_selector", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(b, "_selector", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(b, "_selector", [])]));})]), "_do_", [(function(each){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%20%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
 return self;},
-args: ["packageName"],
-source: unescape('exportPackage%3A%20packageName%0A%09%22Export%20a%20given%20package%20by%20name.%22%0A%0A%09%7C%20package%20%7C%0A%09%5EString%20streamContents%3A%20%5B%3Astream%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20package%20%3A%3D%20Smalltalk%20current%20packageAt%3A%20packageName.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20exportPackageDefinitionOf%3A%20package%20on%3A%20stream.%0A%09%09%22Export%20classes%20in%20dependency%20order%22%0A%09%20%20%20%20%09package%20sortedClasses%20do%3A%20%5B%3Aeach%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%28self%20exportClass%3A%20each%29%5D.%0A%09%09self%20exportPackageExtensionsOf%3A%20package%20on%3A%20stream%5D'),
-messageSends: ["streamContents:", "packageAt:", "current", "exportPackageDefinitionOf:on:", "do:", "sortedClasses", "nextPutAll:", "exportClass:", "exportPackageExtensionsOf:on:"],
-referencedClasses: ["String", "Smalltalk"]
+args: ["methods", "category", "aClass", "aStream"],
+source: unescape('exportMethods%3A%20methods%20category%3A%20category%20of%3A%20aClass%20on%3A%20aStream%0A%09%22Issue%20%23143%3A%20sort%20methods%20alphabetically%22%0A%0A%09aStream%0A%09%09nextPutAll%3A%20%27%21%27%2C%20%28self%20classNameFor%3A%20aClass%29%3B%0A%09%09nextPutAll%3A%20%27%20methodsFor%3A%20%27%27%27%2C%20category%2C%20%27%27%27%21%27.%0A%09%09%28methods%20sorted%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20selector%20%3C%3D%20b%20selector%5D%29%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%09%09self%20exportMethod%3A%20each%20of%3A%20aClass%20on%3A%20aStream%5D.%0A%09aStream%20nextPutAll%3A%20%27%20%21%27%3B%20lf%3B%20lf'),
+messageSends: ["nextPutAll:", unescape("%2C"), "classNameFor:", "do:", "sorted:", unescape("%3C%3D"), "selector", "exportMethod:of:on:", "lf"],
+referencedClasses: []
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
-unescape('_exportAll'),
+unescape('_exportMethodsOf_on_'),
 smalltalk.method({
-selector: unescape('exportAll'),
-category: 'fileOut',
-fn: function (){
+selector: unescape('exportMethodsOf%3Aon%3A'),
+category: 'not yet classified',
+fn: function (aClass, aStream){
 var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){return smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_packages", []), "_do_", [(function(pkg){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self, "_exportPackage_", [smalltalk.send(pkg, "_name", [])])]);})]);})]);
+var map=nil;
+(map=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(aClass, "_protocolsDo_", [(function(category, methods){return ((($receiver = smalltalk.send(category, "_match_", [unescape("%5E%5C*")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(map, "_at_put_", [category, methods]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(map, "_at_put_", [category, methods]);})]));})]);
+smalltalk.send(smalltalk.send(smalltalk.send(map, "_keys", []), "_sorted_", [(function(a, b){return ((($receiver = a).klass === smalltalk.Number) ? $receiver <=b : smalltalk.send($receiver, "__lt_eq", [b]));})]), "_do_", [(function(category){var methods=nil;
+(methods=smalltalk.send(map, "_at_", [category]));return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, aClass, aStream]);})]);
 return self;},
-args: [],
-source: unescape('exportAll%0A%20%20%20%20%22Export%20all%20packages%20in%20the%20system.%22%0A%0A%20%20%20%20%5EString%20streamContents%3A%20%5B%3Astream%20%7C%0A%20%20%20%20%09Smalltalk%20current%20packages%20do%3A%20%5B%3Apkg%20%7C%0A%09%09stream%20nextPutAll%3A%20%28self%20exportPackage%3A%20pkg%20name%29%5D%5D'),
-messageSends: ["streamContents:", "do:", "packages", "current", "nextPutAll:", "exportPackage:", "name"],
-referencedClasses: ["String", "Smalltalk"]
+args: ["aClass", "aStream"],
+source: unescape('exportMethodsOf%3A%20aClass%20on%3A%20aStream%0A%09%22Issue%20%23143%3A%20sort%20protocol%20alphabetically%22%0A%0A%09%7C%20map%20%7C%0A%09map%20%3A%3D%20Dictionary%20new.%0A%09aClass%20protocolsDo%3A%20%5B%3Acategory%20%3Amethods%20%7C%20%0A%09%09%28category%20match%3A%20%27%5E%5C*%27%29%20ifFalse%3A%20%5B%20map%20at%3A%20category%20put%3A%20methods%20%5D%5D.%0A%09%28map%20keys%20sorted%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20%3C%3D%20b%20%5D%29%20do%3A%20%5B%3Acategory%20%7C%20%7C%20methods%20%7C%0A%09%09methods%20%3A%3D%20map%20at%3A%20category.%0A%09%09self%0A%09%09%09exportMethods%3A%20methods%0A%09%09%09category%3A%20category%0A%09%09%09of%3A%20aClass%0A%09%09%09on%3A%20aStream%20%5D'),
+messageSends: ["new", "protocolsDo:", "ifFalse:", "match:", "at:put:", "do:", "sorted:", "keys", unescape("%3C%3D"), "at:", "exportMethods:category:of:on:"],
+referencedClasses: ["Dictionary"]
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
-unescape('_exportClass_'),
+unescape('_exportPackageDefinitionOf_on_'),
 smalltalk.method({
-selector: unescape('exportClass%3A'),
-category: 'fileOut',
-fn: function (aClass){
+selector: unescape('exportPackageDefinitionOf%3Aon%3A'),
+category: 'not yet classified',
+fn: function (package, aStream){
 var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){smalltalk.send(self, "_exportDefinitionOf_on_", [aClass, stream]);smalltalk.send(self, "_exportMethodsOf_on_", [aClass, stream]);smalltalk.send(self, "_exportMetaDefinitionOf_on_", [aClass, stream]);return smalltalk.send(self, "_exportMethodsOf_on_", [smalltalk.send(aClass, "_class", []), stream]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("Smalltalk%20current%20createPackage%3A%20%27"), "__comma", [smalltalk.send(package, "_name", [])]), "__comma", [unescape("%27%20properties%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(package, "_properties", []), "_storeString", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);
 return self;},
-args: ["aClass"],
-source: unescape('exportClass%3A%20aClass%0A%09%22Export%20a%20single%20class.%20Subclasses%20override%20these%20methods.%22%0A%0A%09%5EString%20streamContents%3A%20%5B%3Astream%20%7C%0A%09%09self%20exportDefinitionOf%3A%20aClass%20on%3A%20stream.%0A%09%09self%20exportMethodsOf%3A%20aClass%20on%3A%20stream.%0A%09%09self%20exportMetaDefinitionOf%3A%20aClass%20on%3A%20stream.%0A%09%09self%20exportMethodsOf%3A%20aClass%20class%20on%3A%20stream%5D'),
-messageSends: ["streamContents:", "exportDefinitionOf:on:", "exportMethodsOf:on:", "exportMetaDefinitionOf:on:", "class"],
-referencedClasses: ["String"]
+args: ["package", "aStream"],
+source: unescape('exportPackageDefinitionOf%3A%20package%20on%3A%20aStream%0A%09%22Chunk%20format.%22%0A%0A%09aStream%20%0A%09%20%20%20%20nextPutAll%3A%20%27Smalltalk%20current%20createPackage%3A%20%27%27%27%2C%20package%20name%2C%0A%09%09%27%27%27%20properties%3A%20%27%2C%20package%20properties%20storeString%2C%20%27%21%27%3B%20lf.'),
+messageSends: ["nextPutAll:", unescape("%2C"), "name", "storeString", "properties", "lf"],
+referencedClasses: []
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
 
 smalltalk.addMethod(
 unescape('_exportPackageExtensionsOf_on_'),
 smalltalk.method({
 selector: unescape('exportPackageExtensionsOf%3Aon%3A'),
-category: 'private',
+category: 'not yet classified',
 fn: function (package, aStream){
 var self=this;
 var name=nil;
+var map=nil;
 (name=smalltalk.send(package, "_name", []));
-smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_collect_", [(function(each){return smalltalk.send(each, "_class", []);})])]), "_do_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_values", []), "_do_", [(function(method){return ((($receiver = smalltalk.send(smalltalk.send(method, "_category", []), "__eq", [smalltalk.send(unescape("*"), "__comma", [name])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_exportMethod_of_on_", [method, each, aStream]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self, "_exportMethod_of_on_", [method, each, aStream]);})]));})]);})]);
+smalltalk.send(smalltalk.send((smalltalk.Package || Package), "_sortedClasses_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", [])]), "_do_", [(function(each){return smalltalk.send([each,smalltalk.send(each, "_class", [])], "_do_", [(function(aClass){(map=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));smalltalk.send(aClass, "_protocolsDo_", [(function(category, methods){return ((($receiver = smalltalk.send(category, "_match_", [smalltalk.send(unescape("%5E%5C*"), "__comma", [name])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(map, "_at_put_", [category, methods]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(map, "_at_put_", [category, methods]);})]));})]);return smalltalk.send(smalltalk.send(smalltalk.send(map, "_keys", []), "_sorted_", [(function(a, b){return ((($receiver = a).klass === smalltalk.Number) ? $receiver <=b : smalltalk.send($receiver, "__lt_eq", [b]));})]), "_do_", [(function(category){var methods=nil;
+(methods=smalltalk.send(map, "_at_", [category]));return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, each, aStream]);})]);})]);})]);
 return self;},
 args: ["package", "aStream"],
-source: unescape('exportPackageExtensionsOf%3A%20package%20on%3A%20aStream%0A%09%7C%20name%20%7C%0A%09name%20%3A%3D%20package%20name.%0A%09Smalltalk%20current%20classes%2C%20%28Smalltalk%20current%20classes%20collect%3A%20%5B%3Aeach%20%7C%20each%20class%5D%29%20do%3A%20%5B%3Aeach%20%7C%0A%09%09each%20methodDictionary%20values%20do%3A%20%5B%3Amethod%20%7C%0A%09%09%09method%20category%20%3D%20%28%27*%27%2C%20name%29%20ifTrue%3A%20%5B%0A%09%09%09%09self%20exportMethod%3A%20method%20of%3A%20each%20on%3A%20aStream%5D%5D%5D'),
-messageSends: ["name", "do:", unescape("%2C"), "classes", "current", "collect:", "class", "values", "methodDictionary", "ifTrue:", unescape("%3D"), "category", "exportMethod:of:on:"],
-referencedClasses: ["Smalltalk"]
+source: unescape('exportPackageExtensionsOf%3A%20package%20on%3A%20aStream%0A%09%22We%20need%20to%20override%20this%20one%20too%20since%20we%20need%20to%20group%0A%09all%20methods%20in%20a%20given%20protocol%20under%20a%20leading%20methodsFor%3A%20chunk%0A%09for%20that%20class.%22%0A%0A%09%22Issue%20%23143%3A%20sort%20protocol%20alphabetically%22%0A%0A%09%7C%20name%20map%20%7C%0A%09name%20%3A%3D%20package%20name.%0A%09%28Package%20sortedClasses%3A%20Smalltalk%20current%20classes%29%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%7Beach.%20each%20class%7D%20do%3A%20%5B%3AaClass%20%7C%0A%09%09%09map%20%3A%3D%20Dictionary%20new.%0A%09%09%09aClass%20protocolsDo%3A%20%5B%3Acategory%20%3Amethods%20%7C%20%0A%09%09%09%09%28category%20match%3A%20%27%5E%5C*%27%2C%20name%29%20ifTrue%3A%20%5B%20map%20at%3A%20category%20put%3A%20methods%20%5D%5D.%0A%09%09%09%28map%20keys%20sorted%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20%3C%3D%20b%20%5D%29%20do%3A%20%5B%3Acategory%20%7C%20%7C%20methods%20%7C%0A%09%09%09%09methods%20%3A%3D%20map%20at%3A%20category.%09%0A%09%09%09%09self%20exportMethods%3A%20methods%20category%3A%20category%20of%3A%20each%20on%3A%20aStream%20%5D%5D%5D'),
+messageSends: ["name", "do:", "sortedClasses:", "classes", "current", "class", "new", "protocolsDo:", "ifTrue:", "match:", unescape("%2C"), "at:put:", "sorted:", "keys", unescape("%3C%3D"), "at:", "exportMethods:category:of:on:"],
+referencedClasses: ["Package", "Smalltalk", "Dictionary"]
 }),
-smalltalk.Exporter);
+smalltalk.ChunkExporter);
+
 
+
+smalltalk.addClass('StrippedExporter', smalltalk.Exporter, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_exportPackageDefinitionOf_on_'),
+unescape('_exportDefinitionOf_on_'),
 smalltalk.method({
-selector: unescape('exportPackageDefinitionOf%3Aon%3A'),
+selector: unescape('exportDefinitionOf%3Aon%3A'),
 category: 'private',
-fn: function (package, aStream){
+fn: function (aClass, aStream){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addPackage%28")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(package, "_name", [])]), "__comma", [unescape("%27%2C%20")]), "__comma", [smalltalk.send(package, "_propertiesAsJSON", [])]), "__comma", [unescape("%29%3B")])]);})(aStream);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addClass%28")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%27%2C%20")])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20%5B")]);})(aStream);
+smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C%20")]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%5D%2C%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(aClass, "_category", []), "__comma", [unescape("%27")])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);})(aStream);
 smalltalk.send(aStream, "_lf", []);
 return self;},
-args: ["package", "aStream"],
-source: unescape('exportPackageDefinitionOf%3A%20package%20on%3A%20aStream%0A%09aStream%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.addPackage%28%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%2C%20package%20name%2C%20%27%27%27%2C%20%27%2C%20package%20propertiesAsJSON%20%2C%20%27%29%3B%27.%0A%09aStream%20lf'),
-messageSends: ["nextPutAll:", unescape("%2C"), "name", "propertiesAsJSON", "lf"],
+args: ["aClass", "aStream"],
+source: unescape('exportDefinitionOf%3A%20aClass%20on%3A%20aStream%0A%09aStream%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.addClass%28%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%2C%20%28self%20classNameFor%3A%20aClass%29%2C%20%27%27%27%2C%20%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.%27%2C%20%28self%20classNameFor%3A%20aClass%20superclass%29%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%2C%20%5B%27.%0A%09aClass%20instanceVariableNames%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20aStream%20nextPutAll%3A%20%27%27%27%27%2C%20each%2C%20%27%27%27%27%5D%0A%09%20%20%20%20separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09aStream%09%0A%09%20%20%20%20nextPutAll%3A%20%27%5D%2C%20%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aClass%20category%2C%20%27%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%29%3B%27.%0A%09aStream%20lf'),
+messageSends: ["nextPutAll:", unescape("%2C"), "classNameFor:", "superclass", "do:separatedBy:", "instanceVariableNames", "category", "lf"],
 referencedClasses: []
 }),
-smalltalk.Exporter);
-
-
+smalltalk.StrippedExporter);
 
-smalltalk.addClass('ChunkParser', smalltalk.Object, ['stream'], 'Compiler');
 smalltalk.addMethod(
-unescape('_stream_'),
+unescape('_exportMethod_of_on_'),
 smalltalk.method({
-selector: unescape('stream%3A'),
-category: 'accessing',
-fn: function (aStream){
+selector: unescape('exportMethod%3Aof%3Aon%3A'),
+category: 'private',
+fn: function (aMethod, aClass, aStream){
 var self=this;
-(self['@stream']=aStream);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addMethod%28")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_asSelector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("fn: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_fn", []), "_compiledSource", [])])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%2C")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
 return self;},
-args: ["aStream"],
-source: unescape('stream%3A%20aStream%0A%09stream%20%3A%3D%20aStream'),
-messageSends: [],
+args: ["aMethod", "aClass", "aStream"],
+source: unescape('exportMethod%3A%20aMethod%20of%3A%20aClass%20on%3A%20aStream%0A%09aStream%20%0A%09%09nextPutAll%3A%20%27smalltalk.addMethod%28%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27unescape%28%27%27%27%2C%20aMethod%20selector%20asSelector%20escaped%2C%20%27%27%27%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27smalltalk.method%28%7B%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27selector%3A%20unescape%28%27%27%27%2C%20aMethod%20selector%20escaped%2C%20%27%27%27%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27fn%3A%20%27%2C%20aMethod%20fn%20compiledSource%3Blf%3B%0A%09%09nextPutAll%3A%20%27%7D%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27smalltalk.%27%2C%20%28self%20classNameFor%3A%20aClass%29%3B%0A%09%09nextPutAll%3A%20%27%29%3B%27%3Blf%3Blf'),
+messageSends: ["nextPutAll:", "lf", unescape("%2C"), "escaped", "asSelector", "selector", "compiledSource", "fn", "classNameFor:"],
 referencedClasses: []
 }),
-smalltalk.ChunkParser);
+smalltalk.StrippedExporter);
 
-smalltalk.addMethod(
-unescape('_nextChunk'),
-smalltalk.method({
-selector: unescape('nextChunk'),
-category: 'reading',
-fn: function (){
-var self=this;
-try{var char_=nil;
-var result=nil;
-var chunk=nil;
-(result=smalltalk.send("", "_writeStream", []));
-(function(){while((function(){(char_=smalltalk.send(self['@stream'], "_next", []));return smalltalk.send(char_, "_notNil", []);})()) {(function(){((($receiver = smalltalk.send(char_, "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@stream'], "_peek", []), "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_next", []);})() : (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_next", []);}), (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@stream'], "_peek", []), "__eq", [unescape("%21")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_next", []);})() : (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_next", []);}), (function(){return (function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return smalltalk.send(smalltalk.send(result, "_contents", []), "_trimBoth", [])}})})();})]));})]));return smalltalk.send(result, "_nextPut_", [char_]);})()}})();
-(function(){throw({name: 'stReturn', selector: '_nextChunk', fn: function(){return nil}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_nextChunk'){return e.fn()} throw(e)}},
-args: [],
-source: unescape('nextChunk%0A%09%22The%20chunk%20format%20%28Smalltalk%20Interchange%20Format%20or%20Fileout%20format%29%0A%09is%20a%20trivial%20format%20but%20can%20be%20a%20bit%20tricky%20to%20understand%3A%0A%09%09-%20Uses%20the%20exclamation%20mark%20as%20delimiter%20of%20chunks.%0A%09%09-%20Inside%20a%20chunk%20a%20normal%20exclamation%20mark%20must%20be%20doubled.%0A%09%09-%20A%20non%20empty%20chunk%20must%20be%20a%20valid%20Smalltalk%20expression.%0A%09%09-%20A%20chunk%20on%20top%20level%20with%20a%20preceding%20empty%20chunk%20is%20an%20instruction%20chunk%3A%0A%09%09%09-%20The%20object%20created%20by%20the%20expression%20then%20takes%20over%20reading%20chunks.%0A%0A%09This%20metod%20returns%20next%20chunk%20as%20a%20String%20%28trimmed%29%2C%20empty%20String%20%28all%20whitespace%29%20or%20nil.%22%0A%0A%09%7C%20char%20result%20chunk%20%7C%0A%09result%20%3A%3D%20%27%27%20writeStream.%0A%20%20%20%20%20%20%20%20%5Bchar%20%3A%3D%20stream%20next.%0A%20%20%20%20%20%20%20%20char%20notNil%5D%20whileTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20char%20%3D%20%27%21%27%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20peek%20%3D%20%27%21%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ifTrue%3A%20%5Bstream%20next%20%22skipping%20the%20escape%20double%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ifFalse%3A%20%5B%5Eresult%20contents%20trimBoth%20%20%22chunk%20end%20marker%20found%22%5D%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20nextPut%3A%20char%5D.%0A%09%5Enil%20%22a%20chunk%20needs%20to%20end%20with%20%21%22'),
-messageSends: ["writeStream", "whileTrue:", "next", "notNil", "ifTrue:", unescape("%3D"), "ifTrue:ifFalse:", "peek", "trimBoth", "contents", "nextPut:"],
-referencedClasses: []
-}),
-smalltalk.ChunkParser);
 
 
+smalltalk.addClass('Importer', smalltalk.Object, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_on_'),
+unescape('_import_'),
 smalltalk.method({
-selector: unescape('on%3A'),
-category: 'not yet classified',
+selector: unescape('import%3A'),
+category: 'fileIn',
 fn: function (aStream){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_new", []), "_stream_", [aStream]);
+var chunk=nil;
+var result=nil;
+var parser=nil;
+var lastEmpty=nil;
+(parser=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_on_", [aStream]));
+(lastEmpty=false);
+(function(){while(!(function(){(chunk=smalltalk.send(parser, "_nextChunk", []));return smalltalk.send(chunk, "_isNil", []);})()) {(function(){return ((($receiver = smalltalk.send(chunk, "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (lastEmpty=true);})() : (function(){(result=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [chunk]));return ((($receiver = lastEmpty).klass === smalltalk.Boolean) ? ($receiver ? (function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (lastEmpty=true);}), (function(){(result=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [chunk]));return ((($receiver = lastEmpty).klass === smalltalk.Boolean) ? ($receiver ? (function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(lastEmpty=false);return smalltalk.send(result, "_scanFrom_", [parser]);})]));})]));})()}})();
 return self;},
 args: ["aStream"],
-source: unescape('on%3A%20aStream%0A%09%5Eself%20new%20stream%3A%20aStream'),
-messageSends: ["stream:", "new"],
-referencedClasses: []
+source: unescape('import%3A%20aStream%0A%20%20%20%20%7C%20chunk%20result%20parser%20lastEmpty%20%7C%0A%20%20%20%20parser%20%3A%3D%20ChunkParser%20on%3A%20aStream.%0A%20%20%20%20lastEmpty%20%3A%3D%20false.%0A%20%20%20%20%5Bchunk%20%3A%3D%20parser%20nextChunk.%0A%20%20%20%20%20chunk%20isNil%5D%20whileFalse%3A%20%5B%0A%20%20%20%20%20%20%20%20chunk%20isEmpty%0A%20%20%20%20%20%20%20%09%09ifTrue%3A%20%5BlastEmpty%20%3A%3D%20true%5D%0A%20%20%20%20%20%20%20%09%09ifFalse%3A%20%5B%0A%20%20%20%20%20%20%20%20%09%09result%20%3A%3D%20Compiler%20new%20loadExpression%3A%20chunk.%0A%20%20%20%20%20%20%20%20%09%09lastEmpty%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09lastEmpty%20%3A%3D%20false.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09result%20scanFrom%3A%20parser%5D%5D%5D'),
+messageSends: ["on:", "whileFalse:", "nextChunk", "isNil", "ifTrue:ifFalse:", "isEmpty", "loadExpression:", "new", "ifTrue:", "scanFrom:"],
+referencedClasses: ["ChunkParser", "Compiler"]
 }),
-smalltalk.ChunkParser.klass);
+smalltalk.Importer);
 
 
-smalltalk.addClass('Node', smalltalk.Object, ['nodes'], 'Compiler');
-smalltalk.addMethod(
-unescape('_nodes'),
-smalltalk.method({
-selector: unescape('nodes'),
-category: 'accessing',
-fn: function (){
-var self=this;
-return (($receiver = self['@nodes']) == nil || $receiver == undefined) ? (function(){return (self['@nodes']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
-return self;},
-args: [],
-source: unescape('nodes%0A%09%5Enodes%20ifNil%3A%20%5Bnodes%20%3A%3D%20Array%20new%5D'),
-messageSends: ["ifNil:", "new"],
-referencedClasses: ["Array"]
-}),
-smalltalk.Node);
 
+smalltalk.addClass('Node', smalltalk.Object, ['nodes'], 'Compiler');
 smalltalk.addMethod(
-unescape('_nodes_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('nodes%3A'),
-category: 'building',
-fn: function (aCollection){
+selector: unescape('accept%3A'),
+category: 'visiting',
+fn: function (aVisitor){
 var self=this;
-(self['@nodes']=aCollection);
+smalltalk.send(aVisitor, "_visitNode_", [self]);
 return self;},
-args: ["aCollection"],
-source: unescape('nodes%3A%20aCollection%0A%09nodes%20%3A%3D%20aCollection'),
-messageSends: [],
+args: ["aVisitor"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitNode%3A%20self'),
+messageSends: ["visitNode:"],
 referencedClasses: []
 }),
 smalltalk.Node);
@@ -566,120 +490,88 @@ referencedClasses: []
 smalltalk.Node);
 
 smalltalk.addMethod(
-unescape('_accept_'),
-smalltalk.method({
-selector: unescape('accept%3A'),
-category: 'visiting',
-fn: function (aVisitor){
-var self=this;
-smalltalk.send(aVisitor, "_visitNode_", [self]);
-return self;},
-args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitNode%3A%20self'),
-messageSends: ["visitNode:"],
-referencedClasses: []
-}),
-smalltalk.Node);
-
-smalltalk.addMethod(
-unescape('_isValueNode'),
+unescape('_isBlockNode'),
 smalltalk.method({
-selector: unescape('isValueNode'),
+selector: unescape('isBlockNode'),
 category: 'testing',
 fn: function (){
 var self=this;
 return false;
 return self;},
 args: [],
-source: unescape('isValueNode%0A%09%5Efalse'),
+source: unescape('isBlockNode%0A%09%5Efalse'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Node);
 
 smalltalk.addMethod(
-unescape('_isBlockNode'),
+unescape('_isBlockSequenceNode'),
 smalltalk.method({
-selector: unescape('isBlockNode'),
+selector: unescape('isBlockSequenceNode'),
 category: 'testing',
 fn: function (){
 var self=this;
 return false;
 return self;},
 args: [],
-source: unescape('isBlockNode%0A%09%5Efalse'),
+source: unescape('isBlockSequenceNode%0A%09%5Efalse'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Node);
 
 smalltalk.addMethod(
-unescape('_isBlockSequenceNode'),
+unescape('_isValueNode'),
 smalltalk.method({
-selector: unescape('isBlockSequenceNode'),
+selector: unescape('isValueNode'),
 category: 'testing',
 fn: function (){
 var self=this;
 return false;
 return self;},
 args: [],
-source: unescape('isBlockSequenceNode%0A%09%5Efalse'),
+source: unescape('isValueNode%0A%09%5Efalse'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Node);
 
-
-
-smalltalk.addClass('SequenceNode', smalltalk.Node, ['temps'], 'Compiler');
 smalltalk.addMethod(
-unescape('_temps'),
+unescape('_nodes'),
 smalltalk.method({
-selector: unescape('temps'),
+selector: unescape('nodes'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return (($receiver = self['@temps']) == nil || $receiver == undefined) ? (function(){return [];})() : $receiver;
+return (($receiver = self['@nodes']) == nil || $receiver == undefined) ? (function(){return (self['@nodes']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;},
 args: [],
-source: unescape('temps%0A%09%5Etemps%20ifNil%3A%20%5B%23%28%29%5D'),
-messageSends: ["ifNil:"],
-referencedClasses: []
+source: unescape('nodes%0A%09%5Enodes%20ifNil%3A%20%5Bnodes%20%3A%3D%20Array%20new%5D'),
+messageSends: ["ifNil:", "new"],
+referencedClasses: ["Array"]
 }),
-smalltalk.SequenceNode);
+smalltalk.Node);
 
 smalltalk.addMethod(
-unescape('_temps_'),
+unescape('_nodes_'),
 smalltalk.method({
-selector: unescape('temps%3A'),
-category: 'accessing',
+selector: unescape('nodes%3A'),
+category: 'building',
 fn: function (aCollection){
 var self=this;
-(self['@temps']=aCollection);
+(self['@nodes']=aCollection);
 return self;},
 args: ["aCollection"],
-source: unescape('temps%3A%20aCollection%0A%09temps%20%3A%3D%20aCollection'),
+source: unescape('nodes%3A%20aCollection%0A%09nodes%20%3A%3D%20aCollection'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.SequenceNode);
+smalltalk.Node);
 
-smalltalk.addMethod(
-unescape('_asBlockSequenceNode'),
-smalltalk.method({
-selector: unescape('asBlockSequenceNode'),
-category: 'testing',
-fn: function (){
-var self=this;
-return (function($rec){smalltalk.send($rec, "_nodes_", [smalltalk.send(self, "_nodes", [])]);smalltalk.send($rec, "_temps_", [smalltalk.send(self, "_temps", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.BlockSequenceNode || BlockSequenceNode), "_new", []));
-return self;},
-args: [],
-source: unescape('asBlockSequenceNode%0A%09%5EBlockSequenceNode%20new%0A%09%20%20%20%20nodes%3A%20self%20nodes%3B%0A%09%20%20%20%20temps%3A%20self%20temps%3B%0A%09%20%20%20%20yourself'),
-messageSends: ["nodes:", "nodes", "temps:", "temps", "yourself", "new"],
-referencedClasses: ["BlockSequenceNode"]
-}),
-smalltalk.SequenceNode);
 
+
+smalltalk.addClass('AssignmentNode', smalltalk.Node, ['left', 'right'], 'Compiler');
 smalltalk.addMethod(
 unescape('_accept_'),
 smalltalk.method({
@@ -687,88 +579,83 @@ selector: unescape('accept%3A'),
 category: 'visiting',
 fn: function (aVisitor){
 var self=this;
-smalltalk.send(aVisitor, "_visitSequenceNode_", [self]);
+smalltalk.send(aVisitor, "_visitAssignmentNode_", [self]);
 return self;},
 args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitSequenceNode%3A%20self'),
-messageSends: ["visitSequenceNode:"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitAssignmentNode%3A%20self'),
+messageSends: ["visitAssignmentNode:"],
 referencedClasses: []
 }),
-smalltalk.SequenceNode);
-
-
+smalltalk.AssignmentNode);
 
-smalltalk.addClass('DynamicDictionaryNode', smalltalk.Node, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_left'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-category: 'visiting',
-fn: function (aVisitor){
+selector: unescape('left'),
+category: 'accessing',
+fn: function (){
 var self=this;
-smalltalk.send(aVisitor, "_visitDynamicDictionaryNode_", [self]);
+return self['@left'];
 return self;},
-args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitDynamicDictionaryNode%3A%20self'),
-messageSends: ["visitDynamicDictionaryNode:"],
+args: [],
+source: unescape('left%0A%09%5Eleft'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.DynamicDictionaryNode);
-
-
+smalltalk.AssignmentNode);
 
-smalltalk.addClass('ReturnNode', smalltalk.Node, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_left_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-category: 'visiting',
-fn: function (aVisitor){
+selector: unescape('left%3A'),
+category: 'accessing',
+fn: function (aNode){
 var self=this;
-smalltalk.send(aVisitor, "_visitReturnNode_", [self]);
+(self['@left']=aNode);
+smalltalk.send(self['@left'], "_assigned_", [true]);
 return self;},
-args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitReturnNode%3A%20self'),
-messageSends: ["visitReturnNode:"],
+args: ["aNode"],
+source: unescape('left%3A%20aNode%0A%09left%20%3A%3D%20aNode.%0A%09left%20assigned%3A%20true'),
+messageSends: ["assigned:"],
 referencedClasses: []
 }),
-smalltalk.ReturnNode);
-
-
+smalltalk.AssignmentNode);
 
-smalltalk.addClass('ValueNode', smalltalk.Node, ['value'], 'Compiler');
 smalltalk.addMethod(
-unescape('_value'),
+unescape('_right'),
 smalltalk.method({
-selector: unescape('value'),
+selector: unescape('right'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@value'];
+return self['@right'];
 return self;},
 args: [],
-source: unescape('value%0A%09%5Evalue'),
+source: unescape('right%0A%09%5Eright'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ValueNode);
+smalltalk.AssignmentNode);
 
 smalltalk.addMethod(
-unescape('_value_'),
+unescape('_right_'),
 smalltalk.method({
-selector: unescape('value%3A'),
+selector: unescape('right%3A'),
 category: 'accessing',
-fn: function (anObject){
+fn: function (aNode){
 var self=this;
-(self['@value']=anObject);
+(self['@right']=aNode);
 return self;},
-args: ["anObject"],
-source: unescape('value%3A%20anObject%0A%09value%20%3A%3D%20anObject'),
+args: ["aNode"],
+source: unescape('right%3A%20aNode%0A%09right%20%3A%3D%20aNode'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ValueNode);
+smalltalk.AssignmentNode);
 
+
+
+smalltalk.addClass('BlockNode', smalltalk.Node, ['parameters', 'inlined'], 'Compiler');
 smalltalk.addMethod(
 unescape('_accept_'),
 smalltalk.method({
@@ -776,240 +663,238 @@ selector: unescape('accept%3A'),
 category: 'visiting',
 fn: function (aVisitor){
 var self=this;
-smalltalk.send(aVisitor, "_visitValueNode_", [self]);
+smalltalk.send(aVisitor, "_visitBlockNode_", [self]);
 return self;},
 args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitValueNode%3A%20self'),
-messageSends: ["visitValueNode:"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitBlockNode%3A%20self'),
+messageSends: ["visitBlockNode:"],
 referencedClasses: []
 }),
-smalltalk.ValueNode);
+smalltalk.BlockNode);
 
 smalltalk.addMethod(
-unescape('_isValueNode'),
+unescape('_inlined'),
 smalltalk.method({
-selector: unescape('isValueNode'),
-category: 'testing',
+selector: unescape('inlined'),
+category: 'accessing',
 fn: function (){
 var self=this;
-return true;
+return (($receiver = self['@inlined']) == nil || $receiver == undefined) ? (function(){return false;})() : $receiver;
 return self;},
 args: [],
-source: unescape('isValueNode%0A%09%5Etrue'),
-messageSends: [],
+source: unescape('inlined%0A%09%5Einlined%20ifNil%3A%20%5Bfalse%5D'),
+messageSends: ["ifNil:"],
 referencedClasses: []
 }),
-smalltalk.ValueNode);
-
-
+smalltalk.BlockNode);
 
-smalltalk.addClass('VariableNode', smalltalk.ValueNode, ['assigned'], 'Compiler');
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_inlined_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-category: 'visiting',
-fn: function (aVisitor){
+selector: unescape('inlined%3A'),
+category: 'accessing',
+fn: function (aBoolean){
 var self=this;
-smalltalk.send(aVisitor, "_visitVariableNode_", [self]);
+(self['@inlined']=aBoolean);
 return self;},
-args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitVariableNode%3A%20self'),
-messageSends: ["visitVariableNode:"],
+args: ["aBoolean"],
+source: unescape('inlined%3A%20aBoolean%0A%09inlined%20%3A%3D%20aBoolean'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.VariableNode);
+smalltalk.BlockNode);
 
 smalltalk.addMethod(
-unescape('_assigned'),
+unescape('_isBlockNode'),
 smalltalk.method({
-selector: unescape('assigned'),
-category: 'accessing',
+selector: unescape('isBlockNode'),
+category: 'testing',
 fn: function (){
 var self=this;
-return (($receiver = self['@assigned']) == nil || $receiver == undefined) ? (function(){return false;})() : $receiver;
+return true;
 return self;},
 args: [],
-source: unescape('assigned%0A%09%5Eassigned%20ifNil%3A%20%5Bfalse%5D'),
-messageSends: ["ifNil:"],
+source: unescape('isBlockNode%0A%09%5Etrue'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.VariableNode);
+smalltalk.BlockNode);
 
 smalltalk.addMethod(
-unescape('_assigned_'),
+unescape('_parameters'),
 smalltalk.method({
-selector: unescape('assigned%3A'),
+selector: unescape('parameters'),
 category: 'accessing',
-fn: function (aBoolean){
+fn: function (){
 var self=this;
-(self['@assigned']=aBoolean);
+return (($receiver = self['@parameters']) == nil || $receiver == undefined) ? (function(){return (self['@parameters']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;},
-args: ["aBoolean"],
-source: unescape('assigned%3A%20aBoolean%0A%09assigned%20%3A%3D%20aBoolean'),
-messageSends: [],
-referencedClasses: []
+args: [],
+source: unescape('parameters%0A%09%5Eparameters%20ifNil%3A%20%5Bparameters%20%3A%3D%20Array%20new%5D'),
+messageSends: ["ifNil:", "new"],
+referencedClasses: ["Array"]
 }),
-smalltalk.VariableNode);
-
-
+smalltalk.BlockNode);
 
-smalltalk.addClass('ChunkExporter', smalltalk.Exporter, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_exportDefinitionOf_on_'),
+unescape('_parameters_'),
 smalltalk.method({
-selector: unescape('exportDefinitionOf%3Aon%3A'),
-category: 'not yet classified',
-fn: function (aClass, aStream){
+selector: unescape('parameters%3A'),
+category: 'accessing',
+fn: function (aCollection){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(unescape("%20subclass%3A%20%23"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("%09instanceVariableNames%3A%20%27")]);})(aStream);
-smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%09category%3A%20%27"), "__comma", [smalltalk.send(aClass, "_category", [])]), "__comma", [unescape("%27%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);
-((($receiver = smalltalk.send(smalltalk.send(aClass, "_comment", []), "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%20commentStamp%21")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aClass, "_comment", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%20commentStamp%21")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aClass, "_comment", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);})]));
-smalltalk.send(aStream, "_lf", []);
+(self['@parameters']=aCollection);
 return self;},
-args: ["aClass", "aStream"],
-source: unescape('exportDefinitionOf%3A%20aClass%20on%3A%20aStream%0A%09%22Chunk%20format.%22%0A%0A%09aStream%20%0A%09%20%20%20%20nextPutAll%3A%20%28self%20classNameFor%3A%20aClass%20superclass%29%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%20subclass%3A%20%23%27%2C%20%28self%20classNameFor%3A%20aClass%29%3B%20lf%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%09instanceVariableNames%3A%20%27%27%27.%0A%09aClass%20instanceVariableNames%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20aStream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%20%27%5D.%0A%09aStream%09%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%3B%20lf%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%09category%3A%20%27%27%27%2C%20aClass%20category%2C%20%27%27%27%21%27%3B%20lf.%0A%20%09aClass%20comment%20notEmpty%20ifTrue%3A%20%5B%0A%09%20%20%20%20aStream%20%0A%09%09nextPutAll%3A%20%27%21%27%2C%20%28self%20classNameFor%3A%20aClass%29%2C%20%27%20commentStamp%21%27%3Blf%3B%0A%09%09nextPutAll%3A%20%28self%20chunkEscape%3A%20aClass%20comment%29%2C%20%27%21%27%3Blf%5D.%0A%09aStream%20lf'),
-messageSends: ["nextPutAll:", "classNameFor:", "superclass", unescape("%2C"), "lf", "do:separatedBy:", "instanceVariableNames", "category", "ifTrue:", "notEmpty", "comment", "chunkEscape:"],
+args: ["aCollection"],
+source: unescape('parameters%3A%20aCollection%0A%09parameters%20%3A%3D%20aCollection'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ChunkExporter);
+smalltalk.BlockNode);
+
 
+
+smalltalk.addClass('CascadeNode', smalltalk.Node, ['receiver'], 'Compiler');
 smalltalk.addMethod(
-unescape('_exportMethod_of_on_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('exportMethod%3Aof%3Aon%3A'),
-category: 'not yet classified',
-fn: function (aMethod, aClass, aStream){
+selector: unescape('accept%3A'),
+category: 'visiting',
+fn: function (aVisitor){
 var self=this;
-(function($rec){smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_chunkEscape_", [smalltalk.send(aMethod, "_source", [])])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("%21")]);})(aStream);
+smalltalk.send(aVisitor, "_visitCascadeNode_", [self]);
 return self;},
-args: ["aMethod", "aClass", "aStream"],
-source: unescape('exportMethod%3A%20aMethod%20of%3A%20aClass%20on%3A%20aStream%0A%09aStream%20%0A%09%09lf%3B%20lf%3B%20nextPutAll%3A%20%28self%20chunkEscape%3A%20aMethod%20source%29%3B%20lf%3B%0A%09%09nextPutAll%3A%20%27%21%27'),
-messageSends: ["lf", "nextPutAll:", "chunkEscape:", "source"],
+args: ["aVisitor"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitCascadeNode%3A%20self'),
+messageSends: ["visitCascadeNode:"],
 referencedClasses: []
 }),
-smalltalk.ChunkExporter);
+smalltalk.CascadeNode);
 
 smalltalk.addMethod(
-unescape('_exportMethodsOf_on_'),
+unescape('_receiver'),
 smalltalk.method({
-selector: unescape('exportMethodsOf%3Aon%3A'),
-category: 'not yet classified',
-fn: function (aClass, aStream){
+selector: unescape('receiver'),
+category: 'accessing',
+fn: function (){
 var self=this;
-smalltalk.send(aClass, "_protocolsDo_", [(function(category, methods){return ((($receiver = smalltalk.send(category, "_match_", [unescape("%5E%5C*")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, aClass, aStream]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, aClass, aStream]);})]));})]);
+return self['@receiver'];
 return self;},
-args: ["aClass", "aStream"],
-source: unescape('exportMethodsOf%3A%20aClass%20on%3A%20aStream%0A%0A%20%20%20aClass%20protocolsDo%3A%20%5B%3Acategory%20%3Amethods%20%7C%0A%09%28category%20match%3A%20%27%5E%5C*%27%29%20ifFalse%3A%20%5B%20%0A%09%09self%0A%09%09%09exportMethods%3A%20methods%0A%09%09%09category%3A%20category%0A%09%09%09of%3A%20aClass%0A%09%09%09on%3A%20aStream%5D%5D'),
-messageSends: ["protocolsDo:", "ifFalse:", "match:", "exportMethods:category:of:on:"],
+args: [],
+source: unescape('receiver%0A%09%5Ereceiver'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ChunkExporter);
+smalltalk.CascadeNode);
 
 smalltalk.addMethod(
-unescape('_exportMetaDefinitionOf_on_'),
+unescape('_receiver_'),
 smalltalk.method({
-selector: unescape('exportMetaDefinitionOf%3Aon%3A'),
-category: 'not yet classified',
-fn: function (aClass, aStream){
+selector: unescape('receiver%3A'),
+category: 'accessing',
+fn: function (aNode){
 var self=this;
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%20instanceVariableNames%3A%20%27")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_class", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%20instanceVariableNames%3A%20%27")]);})(aStream);smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [" "]);})]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%27%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);})]));
+(self['@receiver']=aNode);
 return self;},
-args: ["aClass", "aStream"],
-source: unescape('exportMetaDefinitionOf%3A%20aClass%20on%3A%20aStream%0A%0A%09aClass%20class%20instanceVariableNames%20isEmpty%20ifFalse%3A%20%5B%0A%09%09aStream%20%0A%09%09%20%20%20%20nextPutAll%3A%20%28self%20classNameFor%3A%20aClass%20class%29%3B%0A%09%09%20%20%20%20nextPutAll%3A%20%27%20instanceVariableNames%3A%20%27%27%27.%0A%09%09aClass%20class%20instanceVariableNames%20%0A%09%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20aStream%20nextPutAll%3A%20each%5D%0A%09%09%20%20%20%20separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%20%27%5D.%0A%09%09aStream%09%0A%09%09%20%20%20%20nextPutAll%3A%20%27%27%27%21%27%3B%20lf%3B%20lf%5D'),
-messageSends: ["ifFalse:", "isEmpty", "instanceVariableNames", "class", "nextPutAll:", "classNameFor:", "do:separatedBy:", "lf"],
+args: ["aNode"],
+source: unescape('receiver%3A%20aNode%0A%09receiver%20%3A%3D%20aNode'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ChunkExporter);
+smalltalk.CascadeNode);
+
 
+
+smalltalk.addClass('DynamicArrayNode', smalltalk.Node, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_classNameFor_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('classNameFor%3A'),
-category: 'not yet classified',
-fn: function (aClass){
+selector: unescape('accept%3A'),
+category: 'visiting',
+fn: function (aVisitor){
 var self=this;
-return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [" class"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [" class"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
+smalltalk.send(aVisitor, "_visitDynamicArrayNode_", [self]);
 return self;},
-args: ["aClass"],
-source: unescape('classNameFor%3A%20aClass%0A%09%5EaClass%20isMetaclass%0A%09%20%20%20%20ifTrue%3A%20%5BaClass%20instanceClass%20name%2C%20%27%20class%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09aClass%20isNil%0A%09%09%20%20%20%20ifTrue%3A%20%5B%27nil%27%5D%0A%09%09%20%20%20%20ifFalse%3A%20%5BaClass%20name%5D%5D'),
-messageSends: ["ifTrue:ifFalse:", "isMetaclass", unescape("%2C"), "name", "instanceClass", "isNil"],
+args: ["aVisitor"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitDynamicArrayNode%3A%20self'),
+messageSends: ["visitDynamicArrayNode:"],
 referencedClasses: []
 }),
-smalltalk.ChunkExporter);
+smalltalk.DynamicArrayNode);
 
+
+
+smalltalk.addClass('DynamicDictionaryNode', smalltalk.Node, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_chunkEscape_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('chunkEscape%3A'),
-category: 'not yet classified',
-fn: function (aString){
+selector: unescape('accept%3A'),
+category: 'visiting',
+fn: function (aVisitor){
 var self=this;
-return smalltalk.send(smalltalk.send(aString, "_replace_with_", [unescape("%21"), unescape("%21%21")]), "_trimBoth", []);
+smalltalk.send(aVisitor, "_visitDynamicDictionaryNode_", [self]);
 return self;},
-args: ["aString"],
-source: unescape('chunkEscape%3A%20aString%0A%09%22Replace%20all%20occurrences%20of%20%21%20with%20%21%21%20and%20trim%20at%20both%20ends.%22%0A%0A%09%5E%28aString%20replace%3A%20%27%21%27%20with%3A%20%27%21%21%27%29%20trimBoth'),
-messageSends: ["trimBoth", "replace:with:"],
+args: ["aVisitor"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitDynamicDictionaryNode%3A%20self'),
+messageSends: ["visitDynamicDictionaryNode:"],
 referencedClasses: []
 }),
-smalltalk.ChunkExporter);
+smalltalk.DynamicDictionaryNode);
+
 
+
+smalltalk.addClass('JSStatementNode', smalltalk.Node, ['source'], 'Compiler');
 smalltalk.addMethod(
-unescape('_exportMethods_category_of_on_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('exportMethods%3Acategory%3Aof%3Aon%3A'),
-category: 'not yet classified',
-fn: function (methods, category, aClass, aStream){
+selector: unescape('accept%3A'),
+category: 'visiting',
+fn: function (aVisitor){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(unescape("%21"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%20methodsFor%3A%20%27"), "__comma", [category]), "__comma", [unescape("%27%21")])]);})(aStream);
-smalltalk.send(methods, "_do_", [(function(each){return smalltalk.send(self, "_exportMethod_of_on_", [each, aClass, aStream]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%20%21")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
+smalltalk.send(aVisitor, "_visitJSStatementNode_", [self]);
 return self;},
-args: ["methods", "category", "aClass", "aStream"],
-source: unescape('exportMethods%3A%20methods%20category%3A%20category%20of%3A%20aClass%20on%3A%20aStream%0A%0A%09aStream%0A%09%09nextPutAll%3A%20%27%21%27%2C%20%28self%20classNameFor%3A%20aClass%29%3B%0A%09%09nextPutAll%3A%20%27%20methodsFor%3A%20%27%27%27%2C%20category%2C%20%27%27%27%21%27.%0A%20%20%20%20%09methods%20do%3A%20%5B%3Aeach%20%7C%0A%09%09self%20exportMethod%3A%20each%20of%3A%20aClass%20on%3A%20aStream%5D.%0A%09aStream%20nextPutAll%3A%20%27%20%21%27%3B%20lf%3B%20lf'),
-messageSends: ["nextPutAll:", unescape("%2C"), "classNameFor:", "do:", "exportMethod:of:on:", "lf"],
+args: ["aVisitor"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitJSStatementNode%3A%20self'),
+messageSends: ["visitJSStatementNode:"],
 referencedClasses: []
 }),
-smalltalk.ChunkExporter);
+smalltalk.JSStatementNode);
 
 smalltalk.addMethod(
-unescape('_exportPackageExtensionsOf_on_'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('exportPackageExtensionsOf%3Aon%3A'),
-category: 'not yet classified',
-fn: function (package, aStream){
+selector: unescape('source'),
+category: 'accessing',
+fn: function (){
 var self=this;
-var name=nil;
-(name=smalltalk.send(package, "_name", []));
-smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_collect_", [(function(each){return smalltalk.send(each, "_class", []);})])]), "_do_", [(function(each){return smalltalk.send(each, "_protocolsDo_", [(function(category, methods){return ((($receiver = smalltalk.send(category, "__eq", [smalltalk.send(unescape("*"), "__comma", [name])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, each, aStream]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self, "_exportMethods_category_of_on_", [methods, category, each, aStream]);})]));})]);})]);
+return (($receiver = self['@source']) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
 return self;},
-args: ["package", "aStream"],
-source: unescape('exportPackageExtensionsOf%3A%20package%20on%3A%20aStream%0A%09%22We%20need%20to%20override%20this%20one%20too%20since%20we%20need%20to%20group%0A%09all%20methods%20in%20a%20given%20protocol%20under%20a%20leading%20methodsFor%3A%20chunk%0A%09for%20that%20class.%22%0A%0A%09%7C%20name%20%7C%0A%09name%20%3A%3D%20package%20name.%0A%09Smalltalk%20current%20classes%2C%20%28Smalltalk%20current%20classes%20collect%3A%20%5B%3Aeach%20%7C%20each%20class%5D%29%20do%3A%20%5B%3Aeach%20%7C%0A%09%09each%20protocolsDo%3A%20%5B%3Acategory%20%3Amethods%20%7C%0A%09%09%09category%20%3D%20%28%27*%27%2C%20name%29%20ifTrue%3A%20%5B%0A%09%09%09%09self%20exportMethods%3A%20methods%20category%3A%20category%20of%3A%20each%20on%3A%20aStream%5D%5D%5D'),
-messageSends: ["name", "do:", unescape("%2C"), "classes", "current", "collect:", "class", "protocolsDo:", "ifTrue:", unescape("%3D"), "exportMethods:category:of:on:"],
-referencedClasses: ["Smalltalk"]
+args: [],
+source: unescape('source%0A%09%5Esource%20ifNil%3A%20%5B%27%27%5D'),
+messageSends: ["ifNil:"],
+referencedClasses: []
 }),
-smalltalk.ChunkExporter);
+smalltalk.JSStatementNode);
 
 smalltalk.addMethod(
-unescape('_exportPackageDefinitionOf_on_'),
+unescape('_source_'),
 smalltalk.method({
-selector: unescape('exportPackageDefinitionOf%3Aon%3A'),
-category: 'not yet classified',
-fn: function (package, aStream){
+selector: unescape('source%3A'),
+category: 'accessing',
+fn: function (aString){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("Smalltalk%20current%20createPackage%3A%20%27"), "__comma", [smalltalk.send(package, "_name", [])]), "__comma", [unescape("%27%20properties%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(package, "_properties", []), "_storeString", [])]), "__comma", [unescape("%21")])]);return smalltalk.send($rec, "_lf", []);})(aStream);
+(self['@source']=aString);
 return self;},
-args: ["package", "aStream"],
-source: unescape('exportPackageDefinitionOf%3A%20package%20on%3A%20aStream%0A%09%22Chunk%20format.%22%0A%0A%09aStream%20%0A%09%20%20%20%20nextPutAll%3A%20%27Smalltalk%20current%20createPackage%3A%20%27%27%27%2C%20package%20name%2C%0A%09%09%27%27%27%20properties%3A%20%27%2C%20package%20properties%20storeString%2C%20%27%21%27%3B%20lf.'),
-messageSends: ["nextPutAll:", unescape("%2C"), "name", "storeString", "properties", "lf"],
+args: ["aString"],
+source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ChunkExporter);
+smalltalk.JSStatementNode);
 
 
 
-smalltalk.addClass('ClassReferenceNode', smalltalk.VariableNode, [], 'Compiler');
+smalltalk.addClass('MethodNode', smalltalk.Node, ['selector', 'arguments', 'source'], 'Compiler');
 smalltalk.addMethod(
 unescape('_accept_'),
 smalltalk.method({
@@ -1017,148 +902,133 @@ selector: unescape('accept%3A'),
 category: 'visiting',
 fn: function (aVisitor){
 var self=this;
-smalltalk.send(aVisitor, "_visitClassReferenceNode_", [self]);
+smalltalk.send(aVisitor, "_visitMethodNode_", [self]);
 return self;},
 args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitClassReferenceNode%3A%20self'),
-messageSends: ["visitClassReferenceNode:"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitMethodNode%3A%20self'),
+messageSends: ["visitMethodNode:"],
 referencedClasses: []
 }),
-smalltalk.ClassReferenceNode);
-
-
+smalltalk.MethodNode);
 
-smalltalk.addClass('SendNode', smalltalk.Node, ['selector', 'arguments', 'receiver'], 'Compiler');
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('selector'),
+selector: unescape('arguments'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@selector'];
+return (($receiver = self['@arguments']) == nil || $receiver == undefined) ? (function(){return [];})() : $receiver;
 return self;},
 args: [],
-source: unescape('selector%0A%09%5Eselector'),
-messageSends: [],
-referencedClasses: []
+source: unescape('arguments%0A%09%5Earguments%20ifNil%3A%20%5B%23%28%29%5D'),
+messageSends: ["ifNil:"],
+referencedClasses: []
 }),
-smalltalk.SendNode);
+smalltalk.MethodNode);
 
 smalltalk.addMethod(
-unescape('_selector_'),
+unescape('_arguments_'),
 smalltalk.method({
-selector: unescape('selector%3A'),
+selector: unescape('arguments%3A'),
 category: 'accessing',
-fn: function (aString){
+fn: function (aCollection){
 var self=this;
-(self['@selector']=aString);
+(self['@arguments']=aCollection);
 return self;},
-args: ["aString"],
-source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString'),
+args: ["aCollection"],
+source: unescape('arguments%3A%20aCollection%0A%09arguments%20%3A%3D%20aCollection'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.SendNode);
+smalltalk.MethodNode);
 
 smalltalk.addMethod(
-unescape('_arguments'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('arguments'),
+selector: unescape('selector'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return (($receiver = self['@arguments']) == nil || $receiver == undefined) ? (function(){return (self['@arguments']=[]);})() : $receiver;
+return self['@selector'];
 return self;},
 args: [],
-source: unescape('arguments%0A%09%5Earguments%20ifNil%3A%20%5Barguments%20%3A%3D%20%23%28%29%5D'),
-messageSends: ["ifNil:"],
+source: unescape('selector%0A%09%5Eselector'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.SendNode);
+smalltalk.MethodNode);
 
 smalltalk.addMethod(
-unescape('_arguments_'),
+unescape('_selector_'),
 smalltalk.method({
-selector: unescape('arguments%3A'),
+selector: unescape('selector%3A'),
 category: 'accessing',
-fn: function (aCollection){
+fn: function (aString){
 var self=this;
-(self['@arguments']=aCollection);
+(self['@selector']=aString);
 return self;},
-args: ["aCollection"],
-source: unescape('arguments%3A%20aCollection%0A%09arguments%20%3A%3D%20aCollection'),
+args: ["aString"],
+source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.SendNode);
+smalltalk.MethodNode);
 
 smalltalk.addMethod(
-unescape('_receiver'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('receiver'),
+selector: unescape('source'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@receiver'];
+return self['@source'];
 return self;},
 args: [],
-source: unescape('receiver%0A%09%5Ereceiver'),
+source: unescape('source%0A%09%5Esource'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.SendNode);
+smalltalk.MethodNode);
 
 smalltalk.addMethod(
-unescape('_receiver_'),
+unescape('_source_'),
 smalltalk.method({
-selector: unescape('receiver%3A'),
+selector: unescape('source%3A'),
 category: 'accessing',
-fn: function (aNode){
+fn: function (aString){
 var self=this;
-(self['@receiver']=aNode);
+(self['@source']=aString);
 return self;},
-args: ["aNode"],
-source: unescape('receiver%3A%20aNode%0A%09receiver%20%3A%3D%20aNode'),
+args: ["aString"],
+source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.SendNode);
+smalltalk.MethodNode);
 
-smalltalk.addMethod(
-unescape('_valueForReceiver_'),
-smalltalk.method({
-selector: unescape('valueForReceiver%3A'),
-category: 'accessing',
-fn: function (anObject){
-var self=this;
-return (function($rec){smalltalk.send($rec, "_receiver_", [(($receiver = smalltalk.send(self, "_receiver", [])) == nil || $receiver == undefined) ? (function(){return anObject;})() : (function(){return smalltalk.send(smalltalk.send(self, "_receiver", []), "_valueForReceiver_", [anObject]);})()]);smalltalk.send($rec, "_selector_", [smalltalk.send(self, "_selector", [])]);smalltalk.send($rec, "_arguments_", [smalltalk.send(self, "_arguments", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SendNode || SendNode), "_new", []));
-return self;},
-args: ["anObject"],
-source: unescape('valueForReceiver%3A%20anObject%0A%09%5ESendNode%20new%0A%09%20%20%20%20receiver%3A%20%28self%20receiver%20%0A%09%09ifNil%3A%20%5BanObject%5D%0A%09%09ifNotNil%3A%20%5Bself%20receiver%20valueForReceiver%3A%20anObject%5D%29%3B%0A%09%20%20%20%20selector%3A%20self%20selector%3B%0A%09%20%20%20%20arguments%3A%20self%20arguments%3B%0A%09%20%20%20%20yourself'),
-messageSends: ["receiver:", "ifNil:ifNotNil:", "receiver", "valueForReceiver:", "selector:", "selector", "arguments:", "arguments", "yourself", "new"],
-referencedClasses: ["SendNode"]
-}),
-smalltalk.SendNode);
 
+
+smalltalk.addClass('ReturnNode', smalltalk.Node, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_cascadeNodeWithMessages_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('cascadeNodeWithMessages%3A'),
-category: 'accessing',
-fn: function (aCollection){
+selector: unescape('accept%3A'),
+category: 'visiting',
+fn: function (aVisitor){
 var self=this;
-var first=nil;
-(first=(function($rec){smalltalk.send($rec, "_selector_", [smalltalk.send(self, "_selector", [])]);smalltalk.send($rec, "_arguments_", [smalltalk.send(self, "_arguments", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SendNode || SendNode), "_new", [])));
-return (function($rec){smalltalk.send($rec, "_receiver_", [smalltalk.send(self, "_receiver", [])]);smalltalk.send($rec, "_nodes_", [smalltalk.send(smalltalk.send((smalltalk.Array || Array), "_with_", [first]), "__comma", [aCollection])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.CascadeNode || CascadeNode), "_new", []));
+smalltalk.send(aVisitor, "_visitReturnNode_", [self]);
 return self;},
-args: ["aCollection"],
-source: unescape('cascadeNodeWithMessages%3A%20aCollection%0A%09%7C%20first%20%7C%0A%09first%20%3A%3D%20SendNode%20new%0A%09%20%20%20%20selector%3A%20self%20selector%3B%0A%09%20%20%20%20arguments%3A%20self%20arguments%3B%0A%09%20%20%20%20yourself.%0A%09%5ECascadeNode%20new%0A%09%20%20%20%20receiver%3A%20self%20receiver%3B%0A%09%20%20%20%20nodes%3A%20%28Array%20with%3A%20first%29%2C%20aCollection%3B%0A%09%20%20%20%20yourself'),
-messageSends: ["selector:", "selector", "arguments:", "arguments", "yourself", "new", "receiver:", "receiver", "nodes:", unescape("%2C"), "with:"],
-referencedClasses: ["SendNode", "Array", "CascadeNode"]
+args: ["aVisitor"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitReturnNode%3A%20self'),
+messageSends: ["visitReturnNode:"],
+referencedClasses: []
 }),
-smalltalk.SendNode);
+smalltalk.ReturnNode);
 
+
+
+smalltalk.addClass('SendNode', smalltalk.Node, ['selector', 'arguments', 'receiver'], 'Compiler');
 smalltalk.addMethod(
 unescape('_accept_'),
 smalltalk.method({
@@ -1175,144 +1045,139 @@ referencedClasses: []
 }),
 smalltalk.SendNode);
 
-
-
-smalltalk.addClass('JSStatementNode', smalltalk.Node, ['source'], 'Compiler');
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('source'),
+selector: unescape('arguments'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return (($receiver = self['@source']) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
+return (($receiver = self['@arguments']) == nil || $receiver == undefined) ? (function(){return (self['@arguments']=[]);})() : $receiver;
 return self;},
 args: [],
-source: unescape('source%0A%09%5Esource%20ifNil%3A%20%5B%27%27%5D'),
+source: unescape('arguments%0A%09%5Earguments%20ifNil%3A%20%5Barguments%20%3A%3D%20%23%28%29%5D'),
 messageSends: ["ifNil:"],
 referencedClasses: []
 }),
-smalltalk.JSStatementNode);
+smalltalk.SendNode);
 
 smalltalk.addMethod(
-unescape('_source_'),
+unescape('_arguments_'),
 smalltalk.method({
-selector: unescape('source%3A'),
+selector: unescape('arguments%3A'),
 category: 'accessing',
-fn: function (aString){
+fn: function (aCollection){
 var self=this;
-(self['@source']=aString);
+(self['@arguments']=aCollection);
 return self;},
-args: ["aString"],
-source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString'),
+args: ["aCollection"],
+source: unescape('arguments%3A%20aCollection%0A%09arguments%20%3A%3D%20aCollection'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.JSStatementNode);
+smalltalk.SendNode);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_cascadeNodeWithMessages_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-category: 'visiting',
-fn: function (aVisitor){
+selector: unescape('cascadeNodeWithMessages%3A'),
+category: 'accessing',
+fn: function (aCollection){
 var self=this;
-smalltalk.send(aVisitor, "_visitJSStatementNode_", [self]);
+var first=nil;
+(first=(function($rec){smalltalk.send($rec, "_selector_", [smalltalk.send(self, "_selector", [])]);smalltalk.send($rec, "_arguments_", [smalltalk.send(self, "_arguments", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SendNode || SendNode), "_new", [])));
+return (function($rec){smalltalk.send($rec, "_receiver_", [smalltalk.send(self, "_receiver", [])]);smalltalk.send($rec, "_nodes_", [smalltalk.send(smalltalk.send((smalltalk.Array || Array), "_with_", [first]), "__comma", [aCollection])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.CascadeNode || CascadeNode), "_new", []));
 return self;},
-args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitJSStatementNode%3A%20self'),
-messageSends: ["visitJSStatementNode:"],
-referencedClasses: []
+args: ["aCollection"],
+source: unescape('cascadeNodeWithMessages%3A%20aCollection%0A%09%7C%20first%20%7C%0A%09first%20%3A%3D%20SendNode%20new%0A%09%20%20%20%20selector%3A%20self%20selector%3B%0A%09%20%20%20%20arguments%3A%20self%20arguments%3B%0A%09%20%20%20%20yourself.%0A%09%5ECascadeNode%20new%0A%09%20%20%20%20receiver%3A%20self%20receiver%3B%0A%09%20%20%20%20nodes%3A%20%28Array%20with%3A%20first%29%2C%20aCollection%3B%0A%09%20%20%20%20yourself'),
+messageSends: ["selector:", "selector", "arguments:", "arguments", "yourself", "new", "receiver:", "receiver", "nodes:", unescape("%2C"), "with:"],
+referencedClasses: ["SendNode", "Array", "CascadeNode"]
 }),
-smalltalk.JSStatementNode);
-
-
+smalltalk.SendNode);
 
-smalltalk.addClass('AssignmentNode', smalltalk.Node, ['left', 'right'], 'Compiler');
 smalltalk.addMethod(
-unescape('_left'),
+unescape('_receiver'),
 smalltalk.method({
-selector: unescape('left'),
+selector: unescape('receiver'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@left'];
+return self['@receiver'];
 return self;},
 args: [],
-source: unescape('left%0A%09%5Eleft'),
+source: unescape('receiver%0A%09%5Ereceiver'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.AssignmentNode);
+smalltalk.SendNode);
 
 smalltalk.addMethod(
-unescape('_left_'),
+unescape('_receiver_'),
 smalltalk.method({
-selector: unescape('left%3A'),
+selector: unescape('receiver%3A'),
 category: 'accessing',
 fn: function (aNode){
 var self=this;
-(self['@left']=aNode);
-smalltalk.send(self['@left'], "_assigned_", [true]);
+(self['@receiver']=aNode);
 return self;},
 args: ["aNode"],
-source: unescape('left%3A%20aNode%0A%09left%20%3A%3D%20aNode.%0A%09left%20assigned%3A%20true'),
-messageSends: ["assigned:"],
+source: unescape('receiver%3A%20aNode%0A%09receiver%20%3A%3D%20aNode'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.AssignmentNode);
+smalltalk.SendNode);
 
 smalltalk.addMethod(
-unescape('_right'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('right'),
+selector: unescape('selector'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@right'];
+return self['@selector'];
 return self;},
 args: [],
-source: unescape('right%0A%09%5Eright'),
+source: unescape('selector%0A%09%5Eselector'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.AssignmentNode);
+smalltalk.SendNode);
 
 smalltalk.addMethod(
-unescape('_right_'),
+unescape('_selector_'),
 smalltalk.method({
-selector: unescape('right%3A'),
+selector: unescape('selector%3A'),
 category: 'accessing',
-fn: function (aNode){
+fn: function (aString){
 var self=this;
-(self['@right']=aNode);
+(self['@selector']=aString);
 return self;},
-args: ["aNode"],
-source: unescape('right%3A%20aNode%0A%09right%20%3A%3D%20aNode'),
+args: ["aString"],
+source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.AssignmentNode);
+smalltalk.SendNode);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_valueForReceiver_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-category: 'visiting',
-fn: function (aVisitor){
+selector: unescape('valueForReceiver%3A'),
+category: 'accessing',
+fn: function (anObject){
 var self=this;
-smalltalk.send(aVisitor, "_visitAssignmentNode_", [self]);
+return (function($rec){smalltalk.send($rec, "_receiver_", [(($receiver = smalltalk.send(self, "_receiver", [])) == nil || $receiver == undefined) ? (function(){return anObject;})() : (function(){return smalltalk.send(smalltalk.send(self, "_receiver", []), "_valueForReceiver_", [anObject]);})()]);smalltalk.send($rec, "_selector_", [smalltalk.send(self, "_selector", [])]);smalltalk.send($rec, "_arguments_", [smalltalk.send(self, "_arguments", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SendNode || SendNode), "_new", []));
 return self;},
-args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitAssignmentNode%3A%20self'),
-messageSends: ["visitAssignmentNode:"],
-referencedClasses: []
+args: ["anObject"],
+source: unescape('valueForReceiver%3A%20anObject%0A%09%5ESendNode%20new%0A%09%20%20%20%20receiver%3A%20%28self%20receiver%20%0A%09%09ifNil%3A%20%5BanObject%5D%0A%09%09ifNotNil%3A%20%5Bself%20receiver%20valueForReceiver%3A%20anObject%5D%29%3B%0A%09%20%20%20%20selector%3A%20self%20selector%3B%0A%09%20%20%20%20arguments%3A%20self%20arguments%3B%0A%09%20%20%20%20yourself'),
+messageSends: ["receiver:", "ifNil:ifNotNil:", "receiver", "valueForReceiver:", "selector:", "selector", "arguments:", "arguments", "yourself", "new"],
+referencedClasses: ["SendNode"]
 }),
-smalltalk.AssignmentNode);
+smalltalk.SendNode);
 
 
 
-smalltalk.addClass('DynamicArrayNode', smalltalk.Node, [], 'Compiler');
+smalltalk.addClass('SequenceNode', smalltalk.Node, ['temps'], 'Compiler');
 smalltalk.addMethod(
 unescape('_accept_'),
 smalltalk.method({
@@ -1320,213 +1185,238 @@ selector: unescape('accept%3A'),
 category: 'visiting',
 fn: function (aVisitor){
 var self=this;
-smalltalk.send(aVisitor, "_visitDynamicArrayNode_", [self]);
+smalltalk.send(aVisitor, "_visitSequenceNode_", [self]);
 return self;},
 args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitDynamicArrayNode%3A%20self'),
-messageSends: ["visitDynamicArrayNode:"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitSequenceNode%3A%20self'),
+messageSends: ["visitSequenceNode:"],
 referencedClasses: []
 }),
-smalltalk.DynamicArrayNode);
-
-
+smalltalk.SequenceNode);
 
-smalltalk.addClass('Compiler', smalltalk.NodeVisitor, ['stream', 'nestedBlocks', 'earlyReturn', 'currentClass', 'currentSelector', 'unknownVariables', 'tempVariables', 'messageSends', 'referencedClasses', 'classReferenced', 'source', 'argVariables'], 'Compiler');
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_asBlockSequenceNode'),
 smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
+selector: unescape('asBlockSequenceNode'),
+category: 'testing',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.NodeVisitor);
-(self['@stream']=smalltalk.send("", "_writeStream", []));
-(self['@unknownVariables']=[]);
-(self['@tempVariables']=[]);
-(self['@argVariables']=[]);
-(self['@messageSends']=[]);
-(self['@classReferenced']=[]);
+return (function($rec){smalltalk.send($rec, "_nodes_", [smalltalk.send(self, "_nodes", [])]);smalltalk.send($rec, "_temps_", [smalltalk.send(self, "_temps", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.BlockSequenceNode || BlockSequenceNode), "_new", []));
 return self;},
 args: [],
-source: unescape('initialize%0A%09super%20initialize.%0A%09stream%20%3A%3D%20%27%27%20writeStream.%20%0A%09unknownVariables%20%3A%3D%20%23%28%29.%0A%09tempVariables%20%3A%3D%20%23%28%29.%0A%09argVariables%20%3A%3D%20%23%28%29.%0A%09messageSends%20%3A%3D%20%23%28%29.%0A%09classReferenced%20%3A%3D%20%23%28%29'),
-messageSends: ["initialize", "writeStream"],
-referencedClasses: []
+source: unescape('asBlockSequenceNode%0A%09%5EBlockSequenceNode%20new%0A%09%20%20%20%20nodes%3A%20self%20nodes%3B%0A%09%20%20%20%20temps%3A%20self%20temps%3B%0A%09%20%20%20%20yourself'),
+messageSends: ["nodes:", "nodes", "temps:", "temps", "yourself", "new"],
+referencedClasses: ["BlockSequenceNode"]
 }),
-smalltalk.Compiler);
+smalltalk.SequenceNode);
 
 smalltalk.addMethod(
-unescape('_parser'),
+unescape('_temps'),
 smalltalk.method({
-selector: unescape('parser'),
+selector: unescape('temps'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.send((smalltalk.SmalltalkParser || SmalltalkParser), "_new", []);
+return (($receiver = self['@temps']) == nil || $receiver == undefined) ? (function(){return [];})() : $receiver;
 return self;},
 args: [],
-source: unescape('parser%0A%09%5ESmalltalkParser%20new'),
-messageSends: ["new"],
-referencedClasses: ["SmalltalkParser"]
+source: unescape('temps%0A%09%5Etemps%20ifNil%3A%20%5B%23%28%29%5D'),
+messageSends: ["ifNil:"],
+referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.SequenceNode);
 
 smalltalk.addMethod(
-unescape('_currentClass'),
+unescape('_temps_'),
 smalltalk.method({
-selector: unescape('currentClass'),
+selector: unescape('temps%3A'),
 category: 'accessing',
+fn: function (aCollection){
+var self=this;
+(self['@temps']=aCollection);
+return self;},
+args: ["aCollection"],
+source: unescape('temps%3A%20aCollection%0A%09temps%20%3A%3D%20aCollection'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.SequenceNode);
+
+
+
+smalltalk.addClass('BlockSequenceNode', smalltalk.SequenceNode, [], 'Compiler');
+smalltalk.addMethod(
+unescape('_accept_'),
+smalltalk.method({
+selector: unescape('accept%3A'),
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+smalltalk.send(aVisitor, "_visitBlockSequenceNode_", [self]);
+return self;},
+args: ["aVisitor"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitBlockSequenceNode%3A%20self'),
+messageSends: ["visitBlockSequenceNode:"],
+referencedClasses: []
+}),
+smalltalk.BlockSequenceNode);
+
+smalltalk.addMethod(
+unescape('_isBlockSequenceNode'),
+smalltalk.method({
+selector: unescape('isBlockSequenceNode'),
+category: 'testing',
 fn: function (){
 var self=this;
-return self['@currentClass'];
+return true;
 return self;},
 args: [],
-source: unescape('currentClass%0A%09%5EcurrentClass'),
+source: unescape('isBlockSequenceNode%0A%09%5Etrue'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.BlockSequenceNode);
 
+
+
+smalltalk.addClass('ValueNode', smalltalk.Node, ['value'], 'Compiler');
 smalltalk.addMethod(
-unescape('_currentClass_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('currentClass%3A'),
-category: 'accessing',
-fn: function (aClass){
+selector: unescape('accept%3A'),
+category: 'visiting',
+fn: function (aVisitor){
 var self=this;
-(self['@currentClass']=aClass);
+smalltalk.send(aVisitor, "_visitValueNode_", [self]);
 return self;},
-args: ["aClass"],
-source: unescape('currentClass%3A%20aClass%0A%09currentClass%20%3A%3D%20aClass'),
-messageSends: [],
+args: ["aVisitor"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitValueNode%3A%20self'),
+messageSends: ["visitValueNode:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.ValueNode);
 
 smalltalk.addMethod(
-unescape('_loadExpression_'),
+unescape('_isValueNode'),
 smalltalk.method({
-selector: unescape('loadExpression%3A'),
-category: 'compiling',
-fn: function (aString){
+selector: unescape('isValueNode'),
+category: 'testing',
+fn: function (){
 var self=this;
-var result=nil;
-smalltalk.send((smalltalk.DoIt || DoIt), "_addCompiledMethod_", [smalltalk.send(self, "_eval_", [smalltalk.send(self, "_compileExpression_", [aString])])]);
-(result=smalltalk.send(smalltalk.send((smalltalk.DoIt || DoIt), "_new", []), "_doIt", []));
-smalltalk.send((smalltalk.DoIt || DoIt), "_removeCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.DoIt || DoIt), "_methodDictionary", []), "_at_", ["doIt"])]);
-return result;
+return true;
 return self;},
-args: ["aString"],
-source: unescape('loadExpression%3A%20aString%0A%09%7C%20result%20%7C%0A%09DoIt%20addCompiledMethod%3A%20%28self%20eval%3A%20%28self%20compileExpression%3A%20aString%29%29.%0A%09result%20%3A%3D%20DoIt%20new%20doIt.%0A%09DoIt%20removeCompiledMethod%3A%20%28DoIt%20methodDictionary%20at%3A%20%27doIt%27%29.%0A%09%5Eresult'),
-messageSends: ["addCompiledMethod:", "eval:", "compileExpression:", "doIt", "new", "removeCompiledMethod:", "at:", "methodDictionary"],
-referencedClasses: ["DoIt"]
+args: [],
+source: unescape('isValueNode%0A%09%5Etrue'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.ValueNode);
 
 smalltalk.addMethod(
-unescape('_load_forClass_'),
+unescape('_value'),
 smalltalk.method({
-selector: unescape('load%3AforClass%3A'),
-category: 'compiling',
-fn: function (aString, aClass){
+selector: unescape('value'),
+category: 'accessing',
+fn: function (){
 var self=this;
-var compiled=nil;
-(compiled=smalltalk.send(self, "_eval_", [smalltalk.send(self, "_compile_forClass_", [aString, aClass])]));
-smalltalk.send(self, "_setupClass_", [aClass]);
-return compiled;
+return self['@value'];
 return self;},
-args: ["aString", "aClass"],
-source: unescape('load%3A%20aString%20forClass%3A%20aClass%0A%09%7C%20compiled%20%7C%0A%09compiled%20%3A%3D%20self%20eval%3A%20%28self%20compile%3A%20aString%20forClass%3A%20aClass%29.%0A%09self%20setupClass%3A%20aClass.%0A%09%5Ecompiled'),
-messageSends: ["eval:", "compile:forClass:", "setupClass:"],
+args: [],
+source: unescape('value%0A%09%5Evalue'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.ValueNode);
 
 smalltalk.addMethod(
-unescape('_compile_forClass_'),
+unescape('_value_'),
 smalltalk.method({
-selector: unescape('compile%3AforClass%3A'),
-category: 'compiling',
-fn: function (aString, aClass){
+selector: unescape('value%3A'),
+category: 'accessing',
+fn: function (anObject){
 var self=this;
-smalltalk.send(self, "_currentClass_", [aClass]);
-smalltalk.send(self, "_source_", [aString]);
-return smalltalk.send(self, "_compile_", [aString]);
+(self['@value']=anObject);
 return self;},
-args: ["aString", "aClass"],
-source: unescape('compile%3A%20aString%20forClass%3A%20aClass%0A%09self%20currentClass%3A%20aClass.%0A%09self%20source%3A%20aString.%0A%09%5Eself%20compile%3A%20aString'),
-messageSends: ["currentClass:", "source:", "compile:"],
+args: ["anObject"],
+source: unescape('value%3A%20anObject%0A%09value%20%3A%3D%20anObject'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.ValueNode);
+
+
 
+smalltalk.addClass('VariableNode', smalltalk.ValueNode, ['assigned'], 'Compiler');
 smalltalk.addMethod(
-unescape('_compileExpression_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('compileExpression%3A'),
-category: 'compiling',
-fn: function (aString){
+selector: unescape('accept%3A'),
+category: 'visiting',
+fn: function (aVisitor){
 var self=this;
-smalltalk.send(self, "_currentClass_", [(smalltalk.DoIt || DoIt)]);
-smalltalk.send(self, "_source_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")])]);
-return smalltalk.send(self, "_compileNode_", [smalltalk.send(self, "_parse_", [smalltalk.send(self, "_source", [])])]);
+smalltalk.send(aVisitor, "_visitVariableNode_", [self]);
 return self;},
-args: ["aString"],
-source: unescape('compileExpression%3A%20aString%0A%09self%20currentClass%3A%20DoIt.%0A%09self%20source%3A%20%27doIt%20%5E%5B%27%2C%20aString%2C%20%27%5D%20value%27.%0A%09%5Eself%20compileNode%3A%20%28self%20parse%3A%20self%20source%29'),
-messageSends: ["currentClass:", "source:", unescape("%2C"), "compileNode:", "parse:", "source"],
-referencedClasses: ["DoIt"]
+args: ["aVisitor"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitVariableNode%3A%20self'),
+messageSends: ["visitVariableNode:"],
+referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.VariableNode);
 
 smalltalk.addMethod(
-unescape('_eval_'),
+unescape('_assigned'),
 smalltalk.method({
-selector: unescape('eval%3A'),
-category: 'compiling',
-fn: function (aString){
+selector: unescape('assigned'),
+category: 'accessing',
+fn: function (){
 var self=this;
-return eval(aString);
+return (($receiver = self['@assigned']) == nil || $receiver == undefined) ? (function(){return false;})() : $receiver;
 return self;},
-args: ["aString"],
-source: unescape('eval%3A%20aString%0A%09%3Creturn%20eval%28aString%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('assigned%0A%09%5Eassigned%20ifNil%3A%20%5Bfalse%5D'),
+messageSends: ["ifNil:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.VariableNode);
 
 smalltalk.addMethod(
-unescape('_compile_'),
+unescape('_assigned_'),
 smalltalk.method({
-selector: unescape('compile%3A'),
-category: 'compiling',
-fn: function (aString){
+selector: unescape('assigned%3A'),
+category: 'accessing',
+fn: function (aBoolean){
 var self=this;
-return smalltalk.send(self, "_compileNode_", [smalltalk.send(self, "_parse_", [aString])]);
+(self['@assigned']=aBoolean);
 return self;},
-args: ["aString"],
-source: unescape('compile%3A%20aString%0A%09%5Eself%20compileNode%3A%20%28self%20parse%3A%20aString%29'),
-messageSends: ["compileNode:", "parse:"],
+args: ["aBoolean"],
+source: unescape('assigned%3A%20aBoolean%0A%09assigned%20%3A%3D%20aBoolean'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.VariableNode);
+
 
+
+smalltalk.addClass('ClassReferenceNode', smalltalk.VariableNode, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_compileNode_'),
+unescape('_accept_'),
 smalltalk.method({
-selector: unescape('compileNode%3A'),
-category: 'compiling',
-fn: function (aNode){
+selector: unescape('accept%3A'),
+category: 'visiting',
+fn: function (aVisitor){
 var self=this;
-(self['@stream']=smalltalk.send("", "_writeStream", []));
-smalltalk.send(self, "_visit_", [aNode]);
-return smalltalk.send(self['@stream'], "_contents", []);
+smalltalk.send(aVisitor, "_visitClassReferenceNode_", [self]);
 return self;},
-args: ["aNode"],
-source: unescape('compileNode%3A%20aNode%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09self%20visit%3A%20aNode.%0A%09%5Estream%20contents'),
-messageSends: ["writeStream", "visit:", "contents"],
+args: ["aVisitor"],
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitClassReferenceNode%3A%20self'),
+messageSends: ["visitClassReferenceNode:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.ClassReferenceNode);
+
+
 
+smalltalk.addClass('NodeVisitor', smalltalk.Object, [], 'Compiler');
 smalltalk.addMethod(
 unescape('_visit_'),
 smalltalk.method({
@@ -1541,50 +1431,23 @@ source: unescape('visit%3A%20aNode%0A%09aNode%20accept%3A%20self'),
 messageSends: ["accept:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitMethodNode_'),
+unescape('_visitAssignmentNode_'),
 smalltalk.method({
-selector: unescape('visitMethodNode%3A'),
+selector: unescape('visitAssignmentNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-var str=nil;
-var currentSelector=nil;
-(self['@currentSelector']=smalltalk.send(smalltalk.send(aNode, "_selector", []), "_asSelector", []));
-(self['@nestedBlocks']=(0));
-(self['@earlyReturn']=false);
-(self['@messageSends']=[]);
-(self['@referencedClasses']=[]);
-(self['@unknownVariables']=[]);
-(self['@tempVariables']=[]);
-(self['@argVariables']=[]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20%22"), "__comma", [smalltalk.send(aNode, "_selector", [])]), "__comma", [unescape("%22%2C")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("source%3A%20unescape%28%22"), "__comma", [smalltalk.send(smalltalk.send(self, "_source", []), "_escaped", [])]), "__comma", [unescape("%22%29%2C")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("fn%3A%20function%28")]);
-smalltalk.send(smalltalk.send(aNode, "_arguments", []), "_do_separatedBy_", [(function(each){smalltalk.send(self['@argVariables'], "_add_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%29%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("var%20self%3Dthis%3B")]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
-(str=self['@stream']);
-(self['@stream']=smalltalk.send("", "_writeStream", []));
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
-((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(str, "_nextPutAll_", [unescape("try%7B")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(str, "_nextPutAll_", [unescape("try%7B")]);})]));
-smalltalk.send(str, "_nextPutAll_", [smalltalk.send(self['@stream'], "_contents", [])]);
-(self['@stream']=str);
-(function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("return%20self%3B")]);})(self['@stream']);
-((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27stReturn%27%20%26%26%20e.selector%20%3D%3D%3D%20"), "__comma", [smalltalk.send(self['@currentSelector'], "_printString", [])]), "__comma", [unescape("%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D")])]);})(self['@stream']);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27stReturn%27%20%26%26%20e.selector%20%3D%3D%3D%20"), "__comma", [smalltalk.send(self['@currentSelector'], "_printString", [])]), "__comma", [unescape("%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D")])]);})(self['@stream']);})]));
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D")]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%2C"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])]), "__comma", ["messageSends: "])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@messageSends'], "_asJavascript", []), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("args: ", "__comma", [smalltalk.send(self['@argVariables'], "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("referencedClasses%3A%20%5B")]);})(self['@stream']);
-smalltalk.send(self['@referencedClasses'], "_do_separatedBy_", [(function(each){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(each, "_printString", [])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D")]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29")]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
 args: ["aNode"],
-source: unescape('visitMethodNode%3A%20aNode%0A%09%7C%20str%20currentSelector%20%7C%20%0A%09currentSelector%20%3A%3D%20aNode%20selector%20asSelector.%0A%09nestedBlocks%20%3A%3D%200.%0A%09earlyReturn%20%3A%3D%20false.%0A%09messageSends%20%3A%3D%20%23%28%29.%0A%09referencedClasses%20%3A%3D%20%23%28%29.%0A%09unknownVariables%20%3A%3D%20%23%28%29.%0A%09tempVariables%20%3A%3D%20%23%28%29.%0A%09argVariables%20%3A%3D%20%23%28%29.%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.method%28%7B%27%3B%20lf%3B%0A%09%20%20%20%20nextPutAll%3A%20%27selector%3A%20%22%27%2C%20aNode%20selector%2C%20%27%22%2C%27%3B%20lf.%0A%09stream%20nextPutAll%3A%20%27source%3A%20unescape%28%22%27%2C%20self%20source%20escaped%2C%20%27%22%29%2C%27%3Blf.%0A%09stream%20nextPutAll%3A%20%27fn%3A%20function%28%27.%0A%09aNode%20arguments%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09argVariables%20add%3A%20each.%0A%09%09stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20%27%29%7B%27%3B%20lf%3B%0A%09%20%20%20%20nextPutAll%3A%20%27var%20self%3Dthis%3B%27%3B%20lf.%0A%09str%20%3A%3D%20stream.%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20visit%3A%20each%5D.%0A%09earlyReturn%20ifTrue%3A%20%5B%0A%09%20%20%20%20str%20nextPutAll%3A%20%27try%7B%27%5D.%0A%09str%20nextPutAll%3A%20stream%20contents.%0A%09stream%20%3A%3D%20str.%0A%09stream%20%0A%09%20%20%20%20lf%3B%20%0A%09%20%20%20%20nextPutAll%3A%20%27return%20self%3B%27.%0A%09earlyReturn%20ifTrue%3A%20%5B%0A%09%20%20%20%20stream%20lf%3B%20nextPutAll%3A%20%27%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27%27stReturn%27%27%20%26%26%20e.selector%20%3D%3D%3D%20%27%2C%20currentSelector%20printString%2C%20%27%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D%27%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%27.%0A%09stream%20%0A%09%09nextPutAll%3A%20%27%2C%27%2C%20String%20lf%2C%20%27messageSends%3A%20%27%3B%0A%09%09nextPutAll%3A%20messageSends%20asJavascript%2C%20%27%2C%27%3B%20lf%3B%0A%20%20%20%20%20%20%20%20%20%20%09nextPutAll%3A%20%27args%3A%20%27%2C%20argVariables%20asJavascript%2C%20%27%2C%27%3B%20lf%3B%0A%09%09nextPutAll%3A%20%27referencedClasses%3A%20%5B%27.%0A%09referencedClasses%20%0A%09%09do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%20printString%5D%0A%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09stream%20nextPutAll%3A%20%27%5D%27.%0A%09stream%20nextPutAll%3A%20%27%7D%29%27'),
-messageSends: ["asSelector", "selector", "nextPutAll:", "lf", unescape("%2C"), "escaped", "source", "do:separatedBy:", "arguments", "add:", "writeStream", "do:", "nodes", "visit:", "ifTrue:", "contents", "printString", "asJavascript"],
-referencedClasses: ["String"]
+source: unescape('visitAssignmentNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
+referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
 unescape('_visitBlockNode_'),
@@ -1593,420 +1456,440 @@ selector: unescape('visitBlockNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28function%28")]);
-smalltalk.send(smalltalk.send(aNode, "_parameters", []), "_do_separatedBy_", [(function(each){smalltalk.send(self['@tempVariables'], "_add_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29%7B")]);
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29")]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
 args: ["aNode"],
-source: unescape('visitBlockNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27%28function%28%27.%0A%09aNode%20parameters%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%0A%09%09tempVariables%20add%3A%20each.%0A%09%09stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09stream%20nextPutAll%3A%20%27%29%7B%27.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%29%27'),
-messageSends: ["nextPutAll:", "do:separatedBy:", "parameters", "add:", "do:", "nodes", "visit:"],
+source: unescape('visitBlockNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitSequenceNode_'),
+unescape('_visitBlockSequenceNode_'),
 smalltalk.method({
-selector: unescape('visitSequenceNode%3A'),
+selector: unescape('visitBlockSequenceNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
-(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);}), (function(){return smalltalk.send(self['@stream'], "_lf", []);})]);
+smalltalk.send(self, "_visitSequenceNode_", [aNode]);
 return self;},
 args: ["aNode"],
-source: unescape('visitSequenceNode%3A%20aNode%0A%09aNode%20temps%20do%3A%20%5B%3Aeach%20%7C%7C%20temp%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20temp%20%3A%3D%20self%20safeVariableNameFor%3A%20each.%0A%09%20%20%20%20tempVariables%20add%3A%20temp.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27var%20%27%2C%20temp%2C%20%27%3Dnil%3B%27%3B%20lf%5D.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20visit%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20lf%5D'),
-messageSends: ["do:", "temps", "safeVariableNameFor:", "add:", "nextPutAll:", unescape("%2C"), "lf", "do:separatedBy:", "nodes", "visit:"],
+source: unescape('visitBlockSequenceNode%3A%20aNode%0A%09self%20visitSequenceNode%3A%20aNode'),
+messageSends: ["visitSequenceNode:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitBlockSequenceNode_'),
+unescape('_visitCascadeNode_'),
 smalltalk.method({
-selector: unescape('visitBlockSequenceNode%3A'),
+selector: unescape('visitCascadeNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-var index=nil;
-(self['@nestedBlocks']=((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
-((($receiver = smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("return%20nil%3B")]);})() : (function(){smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
-(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);(index=(0));return smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("return%20nil%3B")]);}), (function(){smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
-(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);(index=(0));return smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);})]));
-(self['@nestedBlocks']=((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])));
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
 args: ["aNode"],
-source: unescape('visitBlockSequenceNode%3A%20aNode%0A%09%7C%20index%20%7C%0A%09nestedBlocks%20%3A%3D%20nestedBlocks%20+%201.%0A%09aNode%20nodes%20isEmpty%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09stream%20nextPutAll%3A%20%27return%20nil%3B%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09aNode%20temps%20do%3A%20%5B%3Aeach%20%7C%20%7C%20temp%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20temp%20%3A%3D%20self%20safeVariableNameFor%3A%20each.%0A%09%09%20%20%20%20tempVariables%20add%3A%20temp.%0A%09%09%20%20%20%20stream%20nextPutAll%3A%20%27var%20%27%2C%20temp%2C%20%27%3Dnil%3B%27%3B%20lf%5D.%0A%09%09index%20%3A%3D%200.%0A%09%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%20%20%20%20index%20%3A%3D%20index%20+%201.%0A%09%09%20%20%20%20index%20%3D%20aNode%20nodes%20size%20ifTrue%3A%20%5B%0A%09%09%09stream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09%09%20%20%20%20self%20visit%3A%20each.%0A%09%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D%5D.%0A%09nestedBlocks%20%3A%3D%20nestedBlocks%20-%201'),
-messageSends: [unescape("+"), "ifTrue:ifFalse:", "isEmpty", "nodes", "nextPutAll:", "do:", "temps", "safeVariableNameFor:", "add:", unescape("%2C"), "lf", "ifTrue:", unescape("%3D"), "size", "visit:", unescape("-")],
+source: unescape('visitCascadeNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitReturnNode_'),
+unescape('_visitClassReferenceNode_'),
 smalltalk.method({
-selector: unescape('visitReturnNode%3A'),
+selector: unescape('visitClassReferenceNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-((($receiver = ((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver >(0) : smalltalk.send($receiver, "__gt", [(0)]))).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (self['@earlyReturn']=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (self['@earlyReturn']=true);})]));
-((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%28function%28%29%7Bthrow%28")]);smalltalk.send($rec, "_nextPutAll_", [unescape("%7Bname%3A%20%27stReturn%27%2C%20selector%3A%20")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@currentSelector'], "_printString", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20fn%3A%20function%28%29%7Breturn%20")]);})(self['@stream']);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%28function%28%29%7Bthrow%28")]);smalltalk.send($rec, "_nextPutAll_", [unescape("%7Bname%3A%20%27stReturn%27%2C%20selector%3A%20")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@currentSelector'], "_printString", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20fn%3A%20function%28%29%7Breturn%20")]);})(self['@stream']);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
-((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%7D%29%7D%29%28%29")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%7D%29%7D%29%28%29")]);})]));
+(function($rec){smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(aNode, "_value", [])]);})(self);
 return self;},
 args: ["aNode"],
-source: unescape('visitReturnNode%3A%20aNode%0A%09nestedBlocks%20%3E%200%20ifTrue%3A%20%5B%0A%09%20%20%20%20earlyReturn%20%3A%3D%20true%5D.%0A%09earlyReturn%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09stream%0A%09%09%20%20%20%20nextPutAll%3A%20%27%28function%28%29%7Bthrow%28%27%3B%0A%09%09%20%20%20%20nextPutAll%3A%20%27%7Bname%3A%20%27%27stReturn%27%27%2C%20selector%3A%20%27%3B%0A%09%09%20%20%20%20nextPutAll%3A%20currentSelector%20printString%3B%0A%09%09%20%20%20%20nextPutAll%3A%20%27%2C%20fn%3A%20function%28%29%7Breturn%20%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5Bstream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20visit%3A%20each%5D.%0A%09earlyReturn%20ifTrue%3A%20%5B%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%7D%7D%29%7D%29%28%29%27%5D'),
-messageSends: ["ifTrue:", unescape("%3E"), "ifTrue:ifFalse:", "nextPutAll:", "printString", "do:", "nodes", "visit:"],
+source: unescape('visitClassReferenceNode%3A%20aNode%0A%09self%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aNode%20value'),
+messageSends: ["nextPutAll:", "value"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitSendNode_'),
+unescape('_visitDynamicArrayNode_'),
 smalltalk.method({
-selector: unescape('visitSendNode%3A'),
+selector: unescape('visitDynamicArrayNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-var str=nil;
-var receiver=nil;
-var superSend=nil;
-var inlined=nil;
-(str=self['@stream']);
-((($receiver = smalltalk.send(self['@messageSends'], "_includes_", [smalltalk.send(aNode, "_selector", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@messageSends'], "_add_", [smalltalk.send(aNode, "_selector", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@messageSends'], "_add_", [smalltalk.send(aNode, "_selector", [])]);})]));
-(self['@stream']=smalltalk.send("", "_writeStream", []));
-smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_receiver", [])]);
-(superSend=smalltalk.send(smalltalk.send(self['@stream'], "_contents", []), "__eq", ["super"]));
-(receiver=((($receiver = superSend).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "self";})() : (function(){return smalltalk.send(self['@stream'], "_contents", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "self";}), (function(){return smalltalk.send(self['@stream'], "_contents", []);})])));
-(self['@stream']=str);
-((($receiver = smalltalk.send(self, "_performOptimizations", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inlineLiteral_receiverNode_argumentNodes_", [smalltalk.send(aNode, "_selector", []), smalltalk.send(aNode, "_receiver", []), smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})]));})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inlineLiteral_receiverNode_argumentNodes_", [smalltalk.send(aNode, "_selector", []), smalltalk.send(aNode, "_receiver", []), smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})]));}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
 args: ["aNode"],
-source: unescape('visitSendNode%3A%20aNode%0A%20%20%20%20%20%20%20%20%7C%20str%20receiver%20superSend%20inlined%20%7C%0A%20%20%20%20%20%20%20%20str%20%3A%3D%20stream.%0A%20%20%20%20%20%20%20%20%28messageSends%20includes%3A%20aNode%20selector%29%20ifFalse%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20messageSends%20add%3A%20aNode%20selector%5D.%0A%20%20%20%20%20%20%20%20stream%20%3A%3D%20%27%27%20writeStream.%0A%20%20%20%20%20%20%20%20self%20visit%3A%20aNode%20receiver.%0A%20%20%20%20%20%20%20%20superSend%20%3A%3D%20stream%20contents%20%3D%20%27super%27.%0A%20%20%20%20%20%20%20%20receiver%20%3A%3D%20superSend%20ifTrue%3A%20%5B%27self%27%5D%20ifFalse%3A%20%5Bstream%20contents%5D.%0A%20%20%20%20%20%20%20%20stream%20%3A%3D%20str.%0A%09%0A%09self%20performOptimizations%20%0A%09%09ifTrue%3A%20%5B%0A%09%09%09%28self%20inlineLiteral%3A%20aNode%20selector%20receiverNode%3A%20aNode%20receiver%20argumentNodes%3A%20aNode%20arguments%29%20ifFalse%3A%20%5B%0A%09%09%09%09%28self%20inline%3A%20aNode%20selector%20receiver%3A%20receiver%20argumentNodes%3A%20aNode%20arguments%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09ifTrue%3A%20%5Bstream%20nextPutAll%3A%20%27%20%3A%20%27%2C%20%28self%20send%3A%20aNode%20selector%20to%3A%20%27%24receiver%27%20arguments%3A%20aNode%20arguments%20superSend%3A%20superSend%29%2C%20%27%29%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09ifFalse%3A%20%5Bstream%20nextPutAll%3A%20%28self%20send%3A%20aNode%20selector%20to%3A%20receiver%20arguments%3A%20aNode%20arguments%20superSend%3A%20superSend%29%5D%5D%5D%0A%09%09ifFalse%3A%20%5Bstream%20nextPutAll%3A%20%28self%20send%3A%20aNode%20selector%20to%3A%20receiver%20arguments%3A%20aNode%20arguments%20superSend%3A%20superSend%29%5D'),
-messageSends: ["ifFalse:", "includes:", "selector", "add:", "writeStream", "visit:", "receiver", unescape("%3D"), "contents", "ifTrue:ifFalse:", "performOptimizations", "inlineLiteral:receiverNode:argumentNodes:", "arguments", "inline:receiver:argumentNodes:", "nextPutAll:", unescape("%2C"), "send:to:arguments:superSend:"],
+source: unescape('visitDynamicArrayNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitCascadeNode_'),
+unescape('_visitDynamicDictionaryNode_'),
 smalltalk.method({
-selector: unescape('visitCascadeNode%3A'),
+selector: unescape('visitDynamicDictionaryNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-var index=nil;
-(index=(0));
-((($receiver = smalltalk.send(self['@tempVariables'], "_includes_", ["$rec"])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@tempVariables'], "_add_", ["$rec"]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@tempVariables'], "_add_", ["$rec"]);})]));
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28function%28%24rec%29%7B")]);
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(each, "_receiver_", [smalltalk.send(smalltalk.send((smalltalk.VariableNode || VariableNode), "_new", []), "_value_", ["$rec"])]);smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29%28")]);
-smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_receiver", [])]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29")]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
 args: ["aNode"],
-source: unescape('visitCascadeNode%3A%20aNode%0A%09%7C%20index%20%7C%0A%09index%20%3A%3D%200.%0A%09%28tempVariables%20includes%3A%20%27%24rec%27%29%20ifFalse%3A%20%5B%0A%09%09tempVariables%20add%3A%20%27%24rec%27%5D.%0A%09stream%20nextPutAll%3A%20%27%28function%28%24rec%29%7B%27.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20index%20%3A%3D%20index%20+%201.%0A%09%20%20%20%20index%20%3D%20aNode%20nodes%20size%20ifTrue%3A%20%5B%0A%09%09stream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09%20%20%20%20each%20receiver%3A%20%28VariableNode%20new%20value%3A%20%27%24rec%27%29.%0A%09%20%20%20%20self%20visit%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%29%28%27.%0A%09self%20visit%3A%20aNode%20receiver.%0A%09stream%20nextPutAll%3A%20%27%29%27'),
-messageSends: ["ifFalse:", "includes:", "add:", "nextPutAll:", "do:", "nodes", unescape("+"), "ifTrue:", unescape("%3D"), "size", "receiver:", "value:", "new", "visit:", "receiver"],
-referencedClasses: ["VariableNode"]
+source: unescape('visitDynamicDictionaryNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
+referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitValueNode_'),
+unescape('_visitJSStatementNode_'),
 smalltalk.method({
-selector: unescape('visitValueNode%3A'),
+selector: unescape('visitJSStatementNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(aNode, "_value", []), "_asJavascript", [])]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("function%28%29%7B")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(aNode, "_source", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%28%29")]);})(self);
 return self;},
 args: ["aNode"],
-source: unescape('visitValueNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20aNode%20value%20asJavascript'),
-messageSends: ["nextPutAll:", "asJavascript", "value"],
+source: unescape('visitJSStatementNode%3A%20aNode%0A%09self%20%0A%09%20%20%20%20nextPutAll%3A%20%27function%28%29%7B%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aNode%20source%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%7D%29%28%29%27'),
+messageSends: ["nextPutAll:", "source"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitAssignmentNode_'),
+unescape('_visitMethodNode_'),
 smalltalk.method({
-selector: unescape('visitAssignmentNode%3A'),
+selector: unescape('visitMethodNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28")]);
-smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_left", [])]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3D")]);
-smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_right", [])]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29")]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
 args: ["aNode"],
-source: unescape('visitAssignmentNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27%28%27.%0A%09self%20visit%3A%20aNode%20left.%0A%09stream%20nextPutAll%3A%20%27%3D%27.%0A%09self%20visit%3A%20aNode%20right.%0A%09stream%20nextPutAll%3A%20%27%29%27'),
-messageSends: ["nextPutAll:", "visit:", "left", "right"],
+source: unescape('visitMethodNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitClassReferenceNode_'),
+unescape('_visitNode_'),
 smalltalk.method({
-selector: unescape('visitClassReferenceNode%3A'),
+selector: unescape('visitNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-((($receiver = smalltalk.send(self['@referencedClasses'], "_includes_", [smalltalk.send(aNode, "_value", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@referencedClasses'], "_add_", [smalltalk.send(aNode, "_value", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@referencedClasses'], "_add_", [smalltalk.send(aNode, "_value", [])]);})]));
-smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28smalltalk."), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%20%7C%7C%20")]), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%29")])]);
+
 return self;},
 args: ["aNode"],
-source: unescape('visitClassReferenceNode%3A%20aNode%0A%09%28referencedClasses%20includes%3A%20aNode%20value%29%20ifFalse%3A%20%5B%0A%09%09referencedClasses%20add%3A%20aNode%20value%5D.%0A%09stream%20nextPutAll%3A%20%27%28smalltalk.%27%2C%20aNode%20value%2C%20%27%20%7C%7C%20%27%2C%20aNode%20value%2C%20%27%29%27'),
-messageSends: ["ifFalse:", "includes:", "value", "add:", "nextPutAll:", unescape("%2C")],
+source: unescape('visitNode%3A%20aNode'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitVariableNode_'),
+unescape('_visitReturnNode_'),
 smalltalk.method({
-selector: unescape('visitVariableNode%3A'),
+selector: unescape('visitReturnNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-var varName=nil;
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_currentClass", []), "_allInstanceVariableNames", []), "_includes_", [smalltalk.send(aNode, "_value", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("self%5B%27@"), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%27%5D")])]);})() : (function(){(varName=smalltalk.send(self, "_safeVariableNameFor_", [smalltalk.send(aNode, "_value", [])]));return ((($receiver = smalltalk.send(smalltalk.send(self, "_knownVariables", []), "_includes_", [varName])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("self%5B%27@"), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%27%5D")])]);}), (function(){(varName=smalltalk.send(self, "_safeVariableNameFor_", [smalltalk.send(aNode, "_value", [])]));return ((($receiver = smalltalk.send(smalltalk.send(self, "_knownVariables", []), "_includes_", [varName])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})]));})]));
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
 args: ["aNode"],
-source: unescape('visitVariableNode%3A%20aNode%0A%09%7C%20varName%20%7C%0A%09%28self%20currentClass%20allInstanceVariableNames%20includes%3A%20aNode%20value%29%20%0A%09%09ifTrue%3A%20%5Bstream%20nextPutAll%3A%20%27self%5B%27%27@%27%2C%20aNode%20value%2C%20%27%27%27%5D%27%5D%0A%09%09ifFalse%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09varName%20%3A%3D%20self%20safeVariableNameFor%3A%20aNode%20value.%0A%09%09%09%28self%20knownVariables%20includes%3A%20varName%29%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09ifFalse%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09unknownVariables%20add%3A%20aNode%20value.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09aNode%20assigned%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09ifTrue%3A%20%5Bstream%20nextPutAll%3A%20varName%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09ifFalse%3A%20%5Bstream%20nextPutAll%3A%20%27%28typeof%20%27%2C%20varName%2C%20%27%20%3D%3D%20%27%27undefined%27%27%20%3F%20nil%20%3A%20%27%2C%20varName%2C%20%27%29%27%5D%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09aNode%20value%20%3D%20%27thisContext%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09ifTrue%3A%20%5Bstream%20nextPutAll%3A%20%27%28smalltalk.getThisContext%28%29%29%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09ifFalse%3A%20%5Bstream%20nextPutAll%3A%20varName%5D%5D%5D'),
-messageSends: ["ifTrue:ifFalse:", "includes:", "allInstanceVariableNames", "currentClass", "value", "nextPutAll:", unescape("%2C"), "safeVariableNameFor:", "ifFalse:ifTrue:", "knownVariables", "add:", "assigned", unescape("%3D")],
+source: unescape('visitReturnNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_visitJSStatementNode_'),
+unescape('_visitSendNode_'),
 smalltalk.method({
-selector: unescape('visitJSStatementNode%3A'),
+selector: unescape('visitSendNode%3A'),
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(aNode, "_source", []), "_replace_with_", [unescape("%3E%3E"), unescape("%3E")])]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
 args: ["aNode"],
-source: unescape('visitJSStatementNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%28aNode%20source%20replace%3A%20%27%3E%3E%27%20with%3A%20%27%3E%27%29'),
-messageSends: ["nextPutAll:", "replace:with:", "source"],
+source: unescape('visitSendNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_parse_'),
+unescape('_visitSequenceNode_'),
 smalltalk.method({
-selector: unescape('parse%3A'),
-category: 'compiling',
-fn: function (aString){
+selector: unescape('visitSequenceNode%3A'),
+category: 'visiting',
+fn: function (aNode){
 var self=this;
-return smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_parse_", [aString]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
-args: ["aString"],
-source: unescape('parse%3A%20aString%0A%20%20%20%20%5ESmalltalk%20current%20parse%3A%20aString'),
-messageSends: ["parse:", "current"],
-referencedClasses: ["Smalltalk"]
+args: ["aNode"],
+source: unescape('visitSequenceNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
+referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_parseExpression_'),
+unescape('_visitValueNode_'),
 smalltalk.method({
-selector: unescape('parseExpression%3A'),
-category: 'compiling',
-fn: function (aString){
+selector: unescape('visitValueNode%3A'),
+category: 'visiting',
+fn: function (aNode){
 var self=this;
-return smalltalk.send(self, "_parse_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")])]);
+smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
-args: ["aString"],
-source: unescape('parseExpression%3A%20aString%0A%20%20%20%20%5Eself%20parse%3A%20%27doIt%20%5E%5B%27%2C%20aString%2C%20%27%5D%20value%27'),
-messageSends: ["parse:", unescape("%2C")],
+args: ["aNode"],
+source: unescape('visitValueNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
 smalltalk.addMethod(
-unescape('_unknownVariables'),
+unescape('_visitVariableNode_'),
 smalltalk.method({
-selector: unescape('unknownVariables'),
-category: 'accessing',
-fn: function (){
+selector: unescape('visitVariableNode%3A'),
+category: 'visiting',
+fn: function (aNode){
 var self=this;
-return smalltalk.send(self['@unknownVariables'], "_copy", []);
+
 return self;},
-args: [],
-source: unescape('unknownVariables%0A%09%5EunknownVariables%20copy'),
-messageSends: ["copy"],
+args: ["aNode"],
+source: unescape('visitVariableNode%3A%20aNode'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Compiler);
+smalltalk.NodeVisitor);
 
+
+
+smalltalk.addClass('Compiler', smalltalk.NodeVisitor, ['stream', 'nestedBlocks', 'earlyReturn', 'currentClass', 'currentSelector', 'unknownVariables', 'tempVariables', 'messageSends', 'referencedClasses', 'classReferenced', 'source', 'argVariables'], 'Compiler');
 smalltalk.addMethod(
-unescape('_pseudoVariables'),
+unescape('_argVariables'),
 smalltalk.method({
-selector: unescape('pseudoVariables'),
+selector: unescape('argVariables'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return ["self", "super", "true", "false", "nil", "thisContext"];
+return smalltalk.send(self['@argVariables'], "_copy", []);
 return self;},
 args: [],
-source: unescape('pseudoVariables%0A%09%5E%23%28%27self%27%20%27super%27%20%27true%27%20%27false%27%20%27nil%27%20%27thisContext%27%29'),
-messageSends: [],
+source: unescape('argVariables%0A%09%5EargVariables%20copy'),
+messageSends: ["copy"],
 referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_tempVariables'),
+unescape('_checkClass_for_'),
 smalltalk.method({
-selector: unescape('tempVariables'),
-category: 'accessing',
-fn: function (){
+selector: unescape('checkClass%3Afor%3A'),
+category: 'optimizations',
+fn: function (aClassName, receiver){
 var self=this;
-return smalltalk.send(self['@tempVariables'], "_copy", []);
+smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28%28%28%24receiver%20%3D%20"), "__comma", [receiver]), "__comma", [unescape("%29.klass%20%3D%3D%3D%20smalltalk.")]), "__comma", [aClassName]), "__comma", [unescape("%29%20%3F%20")])]);
 return self;},
-args: [],
-source: unescape('tempVariables%0A%09%5EtempVariables%20copy'),
-messageSends: ["copy"],
+args: ["aClassName", "receiver"],
+source: unescape('checkClass%3A%20aClassName%20for%3A%20receiver%0A%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%28%28%28%24receiver%20%3D%20%27%2C%20receiver%2C%20%27%29.klass%20%3D%3D%3D%20smalltalk.%27%2C%20aClassName%2C%20%27%29%20%3F%20%27'),
+messageSends: ["nextPutAll:", unescape("%2C")],
 referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_knownVariables'),
+unescape('_classNameFor_'),
 smalltalk.method({
-selector: unescape('knownVariables'),
+selector: unescape('classNameFor%3A'),
 category: 'accessing',
-fn: function (){
+fn: function (aClass){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_tempVariables", [])]);smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_argVariables", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_pseudoVariables", []));
+return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
 return self;},
-args: [],
-source: unescape('knownVariables%0A%09%5Eself%20pseudoVariables%20%0A%09%09addAll%3A%20self%20tempVariables%3B%0A%09%09addAll%3A%20self%20argVariables%3B%0A%09%09yourself'),
-messageSends: ["addAll:", "tempVariables", "argVariables", "yourself", "pseudoVariables"],
+args: ["aClass"],
+source: unescape('classNameFor%3A%20aClass%0A%09%5EaClass%20isMetaclass%0A%09%20%20%20%20ifTrue%3A%20%5BaClass%20instanceClass%20name%2C%20%27.klass%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09aClass%20isNil%0A%09%09%20%20%20%20ifTrue%3A%20%5B%27nil%27%5D%0A%09%09%20%20%20%20ifFalse%3A%20%5BaClass%20name%5D%5D'),
+messageSends: ["ifTrue:ifFalse:", "isMetaclass", unescape("%2C"), "name", "instanceClass", "isNil"],
 referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_recompile_'),
+unescape('_compile_'),
 smalltalk.method({
-selector: unescape('recompile%3A'),
+selector: unescape('compile%3A'),
 category: 'compiling',
-fn: function (aClass){
+fn: function (aString){
 var self=this;
-smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_do_", [(function(each){var method=nil;
-(method=smalltalk.send(self, "_load_forClass_", [smalltalk.send(each, "_source", []), aClass]));smalltalk.send(method, "_category_", [smalltalk.send(each, "_category", [])]);return smalltalk.send(aClass, "_addCompiledMethod_", [method]);})]);
-((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})]));
+return smalltalk.send(self, "_compileNode_", [smalltalk.send(self, "_parse_", [aString])]);
 return self;},
-args: ["aClass"],
-source: unescape('recompile%3A%20aClass%0A%09aClass%20methodDictionary%20do%3A%20%5B%3Aeach%20%7C%7C%20method%20%7C%0A%09%09method%20%3A%3D%20self%20load%3A%20each%20source%20forClass%3A%20aClass.%0A%09%09method%20category%3A%20each%20category.%0A%09%09aClass%20addCompiledMethod%3A%20method%5D.%0A%09aClass%20isMetaclass%20ifFalse%3A%20%5Bself%20recompile%3A%20aClass%20class%5D'),
-messageSends: ["do:", "methodDictionary", "load:forClass:", "source", "category:", "category", "addCompiledMethod:", "ifFalse:", "isMetaclass", "recompile:", "class"],
+args: ["aString"],
+source: unescape('compile%3A%20aString%0A%09%5Eself%20compileNode%3A%20%28self%20parse%3A%20aString%29'),
+messageSends: ["compileNode:", "parse:"],
 referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_recompileAll'),
+unescape('_compile_forClass_'),
 smalltalk.method({
-selector: unescape('recompileAll'),
+selector: unescape('compile%3AforClass%3A'),
 category: 'compiling',
-fn: function (){
+fn: function (aString, aClass){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){(function($rec){smalltalk.send($rec, "_show_", [each]);return smalltalk.send($rec, "_cr", []);})((smalltalk.Transcript || Transcript));return smalltalk.send((function(){return smalltalk.send(self, "_recompile_", [each]);}), "_valueWithTimeout_", [(100)]);})]);
+smalltalk.send(self, "_currentClass_", [aClass]);
+smalltalk.send(self, "_source_", [aString]);
+return smalltalk.send(self, "_compile_", [aString]);
 return self;},
-args: [],
-source: unescape('recompileAll%0A%09Smalltalk%20current%20classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09Transcript%20show%3A%20each%3B%20cr.%0A%09%09%5Bself%20recompile%3A%20each%5D%20valueWithTimeout%3A%20100%5D'),
-messageSends: ["do:", "classes", "current", "show:", "cr", "valueWithTimeout:", "recompile:"],
-referencedClasses: ["Smalltalk", "Transcript"]
+args: ["aString", "aClass"],
+source: unescape('compile%3A%20aString%20forClass%3A%20aClass%0A%09self%20currentClass%3A%20aClass.%0A%09self%20source%3A%20aString.%0A%09%5Eself%20compile%3A%20aString'),
+messageSends: ["currentClass:", "source:", "compile:"],
+referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_classNameFor_'),
+unescape('_compileExpression_'),
 smalltalk.method({
-selector: unescape('classNameFor%3A'),
-category: 'accessing',
-fn: function (aClass){
+selector: unescape('compileExpression%3A'),
+category: 'compiling',
+fn: function (aString){
 var self=this;
-return ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);})() : (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_instanceClass", []), "_name", []), "__comma", [".klass"]);}), (function(){return ((($receiver = smalltalk.send(aClass, "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "nil";})() : (function(){return smalltalk.send(aClass, "_name", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "nil";}), (function(){return smalltalk.send(aClass, "_name", []);})]));})]));
+smalltalk.send(self, "_currentClass_", [(smalltalk.DoIt || DoIt)]);
+smalltalk.send(self, "_source_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")])]);
+return smalltalk.send(self, "_compileNode_", [smalltalk.send(self, "_parse_", [smalltalk.send(self, "_source", [])])]);
 return self;},
-args: ["aClass"],
-source: unescape('classNameFor%3A%20aClass%0A%09%5EaClass%20isMetaclass%0A%09%20%20%20%20ifTrue%3A%20%5BaClass%20instanceClass%20name%2C%20%27.klass%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09aClass%20isNil%0A%09%09%20%20%20%20ifTrue%3A%20%5B%27nil%27%5D%0A%09%09%20%20%20%20ifFalse%3A%20%5BaClass%20name%5D%5D'),
-messageSends: ["ifTrue:ifFalse:", "isMetaclass", unescape("%2C"), "name", "instanceClass", "isNil"],
+args: ["aString"],
+source: unescape('compileExpression%3A%20aString%0A%09self%20currentClass%3A%20DoIt.%0A%09self%20source%3A%20%27doIt%20%5E%5B%27%2C%20aString%2C%20%27%5D%20value%27.%0A%09%5Eself%20compileNode%3A%20%28self%20parse%3A%20self%20source%29'),
+messageSends: ["currentClass:", "source:", unescape("%2C"), "compileNode:", "parse:", "source"],
+referencedClasses: ["DoIt"]
+}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+unescape('_compileNode_'),
+smalltalk.method({
+selector: unescape('compileNode%3A'),
+category: 'compiling',
+fn: function (aNode){
+var self=this;
+(self['@stream']=smalltalk.send("", "_writeStream", []));
+smalltalk.send(self, "_visit_", [aNode]);
+return smalltalk.send(self['@stream'], "_contents", []);
+return self;},
+args: ["aNode"],
+source: unescape('compileNode%3A%20aNode%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09self%20visit%3A%20aNode.%0A%09%5Estream%20contents'),
+messageSends: ["writeStream", "visit:", "contents"],
 referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_visitFailure_'),
+unescape('_currentClass'),
 smalltalk.method({
-selector: unescape('visitFailure%3A'),
-category: 'visiting',
-fn: function (aFailure){
+selector: unescape('currentClass'),
+category: 'accessing',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_error_", [smalltalk.send(aFailure, "_asString", [])]);
+return self['@currentClass'];
 return self;},
-args: ["aFailure"],
-source: unescape('visitFailure%3A%20aFailure%0A%09self%20error%3A%20aFailure%20asString'),
-messageSends: ["error:", "asString"],
+args: [],
+source: unescape('currentClass%0A%09%5EcurrentClass'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_setupClass_'),
+unescape('_currentClass_'),
 smalltalk.method({
-selector: unescape('setupClass%3A'),
-category: 'compiling',
+selector: unescape('currentClass%3A'),
+category: 'accessing',
 fn: function (aClass){
 var self=this;
-smalltalk.init(aClass);
+(self['@currentClass']=aClass);
 return self;},
 args: ["aClass"],
-source: unescape('setupClass%3A%20aClass%0A%09%3Csmalltalk.init%28aClass%29%3E'),
+source: unescape('currentClass%3A%20aClass%0A%09currentClass%20%3A%3D%20aClass'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_send_to_arguments_superSend_'),
+unescape('_eval_'),
 smalltalk.method({
-selector: unescape('send%3Ato%3Aarguments%3AsuperSend%3A'),
-category: 'visiting',
-fn: function (aSelector, aReceiver, aCollection, aBoolean){
+selector: unescape('eval%3A'),
+category: 'compiling',
+fn: function (aString){
 var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(str){var tmp=nil;
-(tmp=self['@stream']);smalltalk.send(str, "_nextPutAll_", [unescape("smalltalk.send%28")]);smalltalk.send(str, "_nextPutAll_", [aReceiver]);smalltalk.send(str, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%2C%20%22"), "__comma", [smalltalk.send(aSelector, "_asSelector", [])]), "__comma", [unescape("%22%2C%20%5B")])]);(self['@stream']=str);smalltalk.send(aCollection, "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);(self['@stream']=tmp);smalltalk.send(str, "_nextPutAll_", [unescape("%5D")]);((($receiver = aBoolean).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(str, "_nextPutAll_", [smalltalk.send(unescape("%2C%20smalltalk."), "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(smalltalk.send(self, "_currentClass", []), "_superclass", [])])])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(str, "_nextPutAll_", [smalltalk.send(unescape("%2C%20smalltalk."), "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(smalltalk.send(self, "_currentClass", []), "_superclass", [])])])]);})]));return smalltalk.send(str, "_nextPutAll_", [unescape("%29")]);})]);
+return eval(aString);
 return self;},
-args: ["aSelector", "aReceiver", "aCollection", "aBoolean"],
-source: unescape('send%3A%20aSelector%20to%3A%20aReceiver%20arguments%3A%20aCollection%20superSend%3A%20aBoolean%0A%09%5EString%20streamContents%3A%20%5B%3Astr%20%7C%7C%20tmp%20%7C%0A%20%20%20%20%20%20%20%20%09tmp%20%3A%3D%20stream.%0A%09%09str%20nextPutAll%3A%20%27smalltalk.send%28%27.%0A%09%09str%20nextPutAll%3A%20aReceiver.%0A%09%09str%20nextPutAll%3A%20%27%2C%20%22%27%2C%20aSelector%20asSelector%2C%20%27%22%2C%20%5B%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20%3A%3D%20str.%0A%09%09aCollection%0A%09%20%20%20%20%09%09do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D%0A%09%20%20%20%20%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20%3A%3D%20tmp.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20str%20nextPutAll%3A%20%27%5D%27.%0A%09%09aBoolean%20ifTrue%3A%20%5B%0A%09%09%09str%20nextPutAll%3A%20%27%2C%20smalltalk.%27%2C%20%28self%20classNameFor%3A%20self%20currentClass%20superclass%29%5D.%0A%09%09str%20nextPutAll%3A%20%27%29%27%5D'),
-messageSends: ["streamContents:", "nextPutAll:", unescape("%2C"), "asSelector", "do:separatedBy:", "visit:", "ifTrue:", "classNameFor:", "superclass", "currentClass"],
-referencedClasses: ["String"]
+args: ["aString"],
+source: unescape('eval%3A%20aString%0A%09%3Creturn%20eval%28aString%29%3E'),
+messageSends: [],
+referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_checkClass_for_'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('checkClass%3Afor%3A'),
+selector: unescape('initialize'),
+category: 'initialization',
+fn: function (){
+var self=this;
+smalltalk.send(self, "_initialize", [], smalltalk.NodeVisitor);
+(self['@stream']=smalltalk.send("", "_writeStream", []));
+(self['@unknownVariables']=[]);
+(self['@tempVariables']=[]);
+(self['@argVariables']=[]);
+(self['@messageSends']=[]);
+(self['@classReferenced']=[]);
+return self;},
+args: [],
+source: unescape('initialize%0A%09super%20initialize.%0A%09stream%20%3A%3D%20%27%27%20writeStream.%20%0A%09unknownVariables%20%3A%3D%20%23%28%29.%0A%09tempVariables%20%3A%3D%20%23%28%29.%0A%09argVariables%20%3A%3D%20%23%28%29.%0A%09messageSends%20%3A%3D%20%23%28%29.%0A%09classReferenced%20%3A%3D%20%23%28%29'),
+messageSends: ["initialize", "writeStream"],
+referencedClasses: []
+}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+unescape('_inline_receiver_argumentNodes_'),
+smalltalk.method({
+selector: unescape('inline%3Areceiver%3AargumentNodes%3A'),
 category: 'optimizations',
-fn: function (aClassName, receiver){
+fn: function (aSelector, receiver, aCollection){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28%28%28%24receiver%20%3D%20"), "__comma", [receiver]), "__comma", [unescape("%29.klass%20%3D%3D%3D%20smalltalk.")]), "__comma", [aClassName]), "__comma", [unescape("%29%20%3F%20")])]);
+var inlined=nil;
+(inlined=false);
+((($receiver = smalltalk.send(aSelector, "__eq", ["ifFalse:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})]));
+((($receiver = smalltalk.send(aSelector, "__eq", ["ifTrue:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})]));
+((($receiver = smalltalk.send(aSelector, "__eq", ["ifTrue:ifFalse:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})]));
+((($receiver = smalltalk.send(aSelector, "__eq", ["ifFalse:ifTrue:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3C")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3C%3D")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3E")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3E%3D")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("+")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20+")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20+")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("-")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20-")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20-")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("*")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20*")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20*")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+((($receiver = smalltalk.send(aSelector, "__eq", [unescape("/")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20/")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20/")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
+return inlined;
 return self;},
-args: ["aClassName", "receiver"],
-source: unescape('checkClass%3A%20aClassName%20for%3A%20receiver%0A%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%28%28%28%24receiver%20%3D%20%27%2C%20receiver%2C%20%27%29.klass%20%3D%3D%3D%20smalltalk.%27%2C%20aClassName%2C%20%27%29%20%3F%20%27'),
-messageSends: ["nextPutAll:", unescape("%2C")],
+args: ["aSelector", "receiver", "aCollection"],
+source: unescape('inline%3A%20aSelector%20receiver%3A%20receiver%20argumentNodes%3A%20aCollection%0A%20%20%20%20%20%20%20%20%7C%20inlined%20%7C%0A%20%20%20%20%20%20%20%20inlined%20%3A%3D%20false.%0A%0A%09%22--%20Booleans%20--%22%0A%0A%09%28aSelector%20%3D%20%27ifFalse%3A%27%29%20ifTrue%3A%20%5B%0A%09%09aCollection%20first%20isBlockNode%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20checkClass%3A%20%27Boolean%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09stream%20nextPutAll%3A%20%27%28%21%20%24receiver%20%3F%20%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%20%3A%20nil%29%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09inlined%20%3A%3D%20true%5D%5D.%0A%0A%09%28aSelector%20%3D%20%27ifTrue%3A%27%29%20ifTrue%3A%20%5B%0A%09%09aCollection%20first%20isBlockNode%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20checkClass%3A%20%27Boolean%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09stream%20nextPutAll%3A%20%27%28%24receiver%20%3F%20%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%20%3A%20nil%29%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09inlined%20%3A%3D%20true%5D%5D.%0A%0A%09%28aSelector%20%3D%20%27ifTrue%3AifFalse%3A%27%29%20ifTrue%3A%20%5B%0A%09%09%28aCollection%20first%20isBlockNode%20and%3A%20%5BaCollection%20second%20isBlockNode%5D%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20checkClass%3A%20%27Boolean%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09stream%20nextPutAll%3A%20%27%28%24receiver%20%3F%20%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%20%3A%20%27.%0A%20%20%20%20%20%20%20%20%20%20%09%09self%20visit%3A%20aCollection%20second.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%29%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09inlined%20%3A%3D%20true%5D%5D.%0A%0A%09%28aSelector%20%3D%20%27ifFalse%3AifTrue%3A%27%29%20ifTrue%3A%20%5B%0A%09%09%28aCollection%20first%20isBlockNode%20and%3A%20%5BaCollection%20second%20isBlockNode%5D%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20checkClass%3A%20%27Boolean%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09stream%20nextPutAll%3A%20%27%28%21%20%24receiver%20%3F%20%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%20%3A%20%27.%0A%20%20%20%20%20%20%20%20%20%20%09%09self%20visit%3A%20aCollection%20second.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%29%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09inlined%20%3A%3D%20true%5D%5D.%0A%0A%09%22--%20Numbers%20--%22%0A%0A%09%28aSelector%20%3D%20%27%3C%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20%3C%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%09%28aSelector%20%3D%20%27%3C%3D%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20%3C%3D%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%09%28aSelector%20%3D%20%27%3E%27%29%20ifTrue%3A%20%5B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20%3E%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%09%28aSelector%20%3D%20%27%3E%3D%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20%3E%3D%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%20%20%20%20%20%20%20%20%28aSelector%20%3D%20%27+%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20+%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%20%20%20%20%20%20%20%20%28aSelector%20%3D%20%27-%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20-%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%20%20%20%20%20%20%20%20%28aSelector%20%3D%20%27*%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20*%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%20%20%20%20%20%20%20%20%28aSelector%20%3D%20%27/%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20/%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%20%20%20%20%20%20%20%20%5Einlined'),
+messageSends: ["ifTrue:", unescape("%3D"), "isBlockNode", "first", "checkClass:for:", "nextPutAll:", "visit:", "and:", "second"],
 referencedClasses: []
 }),
 smalltalk.Compiler);
@@ -2062,153 +1945,140 @@ referencedClasses: []
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_inline_receiver_argumentNodes_'),
+unescape('_knownVariables'),
 smalltalk.method({
-selector: unescape('inline%3Areceiver%3AargumentNodes%3A'),
-category: 'optimizations',
-fn: function (aSelector, receiver, aCollection){
+selector: unescape('knownVariables'),
+category: 'accessing',
+fn: function (){
 var self=this;
-var inlined=nil;
-(inlined=false);
-((($receiver = smalltalk.send(aSelector, "__eq", ["ifFalse:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})]));
-((($receiver = smalltalk.send(aSelector, "__eq", ["ifTrue:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20nil%29")]);return (inlined=true);})]));})]));
-((($receiver = smalltalk.send(aSelector, "__eq", ["ifTrue:ifFalse:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})]));
-((($receiver = smalltalk.send(aSelector, "__eq", ["ifFalse:ifTrue:"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(aCollection, "_first", []), "_isBlockNode", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(aCollection, "_second", []), "_isBlockNode", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Boolean", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%21%20%24receiver%20%3F%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%20%3A%20")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_second", [])]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28%29%29")]);return (inlined=true);})]));})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3C")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3C%3D")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3C%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3E")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("%3E%3D")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20%3E%3D")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("+")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20+")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20+")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("-")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20-")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20-")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("*")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20*")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20*")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-((($receiver = smalltalk.send(aSelector, "__eq", [unescape("/")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20/")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_checkClass_for_", ["Number", receiver]);smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%24receiver%20/")]);smalltalk.send(self, "_visit_", [smalltalk.send(aCollection, "_first", [])]);return (inlined=true);})]));
-return inlined;
+return (function($rec){smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_tempVariables", [])]);smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_argVariables", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_pseudoVariables", []));
 return self;},
-args: ["aSelector", "receiver", "aCollection"],
-source: unescape('inline%3A%20aSelector%20receiver%3A%20receiver%20argumentNodes%3A%20aCollection%0A%20%20%20%20%20%20%20%20%7C%20inlined%20%7C%0A%20%20%20%20%20%20%20%20inlined%20%3A%3D%20false.%0A%0A%09%22--%20Booleans%20--%22%0A%0A%09%28aSelector%20%3D%20%27ifFalse%3A%27%29%20ifTrue%3A%20%5B%0A%09%09aCollection%20first%20isBlockNode%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20checkClass%3A%20%27Boolean%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09stream%20nextPutAll%3A%20%27%28%21%20%24receiver%20%3F%20%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%20%3A%20nil%29%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09inlined%20%3A%3D%20true%5D%5D.%0A%0A%09%28aSelector%20%3D%20%27ifTrue%3A%27%29%20ifTrue%3A%20%5B%0A%09%09aCollection%20first%20isBlockNode%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20checkClass%3A%20%27Boolean%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09stream%20nextPutAll%3A%20%27%28%24receiver%20%3F%20%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%20%3A%20nil%29%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09inlined%20%3A%3D%20true%5D%5D.%0A%0A%09%28aSelector%20%3D%20%27ifTrue%3AifFalse%3A%27%29%20ifTrue%3A%20%5B%0A%09%09%28aCollection%20first%20isBlockNode%20and%3A%20%5BaCollection%20second%20isBlockNode%5D%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20checkClass%3A%20%27Boolean%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09stream%20nextPutAll%3A%20%27%28%24receiver%20%3F%20%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%20%3A%20%27.%0A%20%20%20%20%20%20%20%20%20%20%09%09self%20visit%3A%20aCollection%20second.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%29%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09inlined%20%3A%3D%20true%5D%5D.%0A%0A%09%28aSelector%20%3D%20%27ifFalse%3AifTrue%3A%27%29%20ifTrue%3A%20%5B%0A%09%09%28aCollection%20first%20isBlockNode%20and%3A%20%5BaCollection%20second%20isBlockNode%5D%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20checkClass%3A%20%27Boolean%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09stream%20nextPutAll%3A%20%27%28%21%20%24receiver%20%3F%20%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%20%3A%20%27.%0A%20%20%20%20%20%20%20%20%20%20%09%09self%20visit%3A%20aCollection%20second.%0A%20%20%20%20%20%20%20%20%20%20%09%09stream%20nextPutAll%3A%20%27%28%29%29%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09inlined%20%3A%3D%20true%5D%5D.%0A%0A%09%22--%20Numbers%20--%22%0A%0A%09%28aSelector%20%3D%20%27%3C%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20%3C%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%09%28aSelector%20%3D%20%27%3C%3D%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20%3C%3D%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%09%28aSelector%20%3D%20%27%3E%27%29%20ifTrue%3A%20%5B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20%3E%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%09%28aSelector%20%3D%20%27%3E%3D%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20%3E%3D%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%20%20%20%20%20%20%20%20%28aSelector%20%3D%20%27+%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20+%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%20%20%20%20%20%20%20%20%28aSelector%20%3D%20%27-%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20-%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%20%20%20%20%20%20%20%20%28aSelector%20%3D%20%27*%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20*%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%20%20%20%20%20%20%20%20%28aSelector%20%3D%20%27/%27%29%20ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20checkClass%3A%20%27Number%27%20for%3A%20receiver.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20nextPutAll%3A%20%27%24receiver%20/%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20visit%3A%20aCollection%20first.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlined%20%3A%3D%20true%5D.%0A%0A%20%20%20%20%20%20%20%20%5Einlined'),
-messageSends: ["ifTrue:", unescape("%3D"), "isBlockNode", "first", "checkClass:for:", "nextPutAll:", "visit:", "and:", "second"],
+args: [],
+source: unescape('knownVariables%0A%09%5Eself%20pseudoVariables%20%0A%09%09addAll%3A%20self%20tempVariables%3B%0A%09%09addAll%3A%20self%20argVariables%3B%0A%09%09yourself'),
+messageSends: ["addAll:", "tempVariables", "argVariables", "yourself", "pseudoVariables"],
 referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_performOptimizations'),
+unescape('_load_forClass_'),
 smalltalk.method({
-selector: unescape('performOptimizations'),
-category: 'testing',
-fn: function (){
+selector: unescape('load%3AforClass%3A'),
+category: 'compiling',
+fn: function (aString, aClass){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_performOptimizations", []);
+var compiled=nil;
+(compiled=smalltalk.send(self, "_eval_", [smalltalk.send(self, "_compile_forClass_", [aString, aClass])]));
+smalltalk.send(self, "_setupClass_", [aClass]);
+return compiled;
 return self;},
-args: [],
-source: unescape('performOptimizations%0A%09%5Eself%20class%20performOptimizations'),
-messageSends: ["performOptimizations", "class"],
+args: ["aString", "aClass"],
+source: unescape('load%3A%20aString%20forClass%3A%20aClass%0A%09%7C%20compiled%20%7C%0A%09compiled%20%3A%3D%20self%20eval%3A%20%28self%20compile%3A%20aString%20forClass%3A%20aClass%29.%0A%09self%20setupClass%3A%20aClass.%0A%09%5Ecompiled'),
+messageSends: ["eval:", "compile:forClass:", "setupClass:"],
 referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_loadExpression_'),
 smalltalk.method({
-selector: unescape('source'),
-category: 'accessing',
-fn: function (){
+selector: unescape('loadExpression%3A'),
+category: 'compiling',
+fn: function (aString){
 var self=this;
-return (($receiver = self['@source']) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
+var result=nil;
+smalltalk.send((smalltalk.DoIt || DoIt), "_addCompiledMethod_", [smalltalk.send(self, "_eval_", [smalltalk.send(self, "_compileExpression_", [aString])])]);
+(result=smalltalk.send(smalltalk.send((smalltalk.DoIt || DoIt), "_new", []), "_doIt", []));
+smalltalk.send((smalltalk.DoIt || DoIt), "_removeCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.DoIt || DoIt), "_methodDictionary", []), "_at_", ["doIt"])]);
+return result;
 return self;},
-args: [],
-source: unescape('source%0A%09%5Esource%20ifNil%3A%20%5B%27%27%5D'),
-messageSends: ["ifNil:"],
-referencedClasses: []
+args: ["aString"],
+source: unescape('loadExpression%3A%20aString%0A%09%7C%20result%20%7C%0A%09DoIt%20addCompiledMethod%3A%20%28self%20eval%3A%20%28self%20compileExpression%3A%20aString%29%29.%0A%09result%20%3A%3D%20DoIt%20new%20doIt.%0A%09DoIt%20removeCompiledMethod%3A%20%28DoIt%20methodDictionary%20at%3A%20%27doIt%27%29.%0A%09%5Eresult'),
+messageSends: ["addCompiledMethod:", "eval:", "compileExpression:", "doIt", "new", "removeCompiledMethod:", "at:", "methodDictionary"],
+referencedClasses: ["DoIt"]
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_source_'),
+unescape('_parse_'),
 smalltalk.method({
-selector: unescape('source%3A'),
-category: 'accessing',
+selector: unescape('parse%3A'),
+category: 'compiling',
 fn: function (aString){
 var self=this;
-(self['@source']=aString);
+return smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_parse_", [aString]);
 return self;},
 args: ["aString"],
-source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString'),
-messageSends: [],
-referencedClasses: []
+source: unescape('parse%3A%20aString%0A%20%20%20%20%5ESmalltalk%20current%20parse%3A%20aString'),
+messageSends: ["parse:", "current"],
+referencedClasses: ["Smalltalk"]
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_visitDynamicArrayNode_'),
+unescape('_parseExpression_'),
 smalltalk.method({
-selector: unescape('visitDynamicArrayNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('parseExpression%3A'),
+category: 'compiling',
+fn: function (aString){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5B")]);
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D")]);
+return smalltalk.send(self, "_parse_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")])]);
 return self;},
-args: ["aNode"],
-source: unescape('visitDynamicArrayNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27%5B%27.%0A%09aNode%20nodes%20%0A%09%09do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D%0A%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09stream%20nextPutAll%3A%20%27%5D%27'),
-messageSends: ["nextPutAll:", "do:separatedBy:", "nodes", "visit:"],
+args: ["aString"],
+source: unescape('parseExpression%3A%20aString%0A%20%20%20%20%5Eself%20parse%3A%20%27doIt%20%5E%5B%27%2C%20aString%2C%20%27%5D%20value%27'),
+messageSends: ["parse:", unescape("%2C")],
 referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_visitDynamicDictionaryNode_'),
+unescape('_parser'),
 smalltalk.method({
-selector: unescape('visitDynamicDictionaryNode%3A'),
-category: 'visiting',
-fn: function (aNode){
+selector: unescape('parser'),
+category: 'accessing',
+fn: function (){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("smalltalk.HashedCollection._fromPairs_%28%5B")]);
-smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
-smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D%29")]);
+return smalltalk.send((smalltalk.SmalltalkParser || SmalltalkParser), "_new", []);
 return self;},
-args: ["aNode"],
-source: unescape('visitDynamicDictionaryNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27smalltalk.HashedCollection._fromPairs_%28%5B%27.%0A%09%09aNode%20nodes%20%0A%09%09%09do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D%0A%09%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09%09stream%20nextPutAll%3A%20%27%5D%29%27'),
-messageSends: ["nextPutAll:", "do:separatedBy:", "nodes", "visit:"],
-referencedClasses: []
+args: [],
+source: unescape('parser%0A%09%5ESmalltalkParser%20new'),
+messageSends: ["new"],
+referencedClasses: ["SmalltalkParser"]
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_argVariables'),
+unescape('_performOptimizations'),
 smalltalk.method({
-selector: unescape('argVariables'),
-category: 'accessing',
+selector: unescape('performOptimizations'),
+category: 'testing',
 fn: function (){
 var self=this;
-return smalltalk.send(self['@argVariables'], "_copy", []);
+return smalltalk.send(smalltalk.send(self, "_class", []), "_performOptimizations", []);
 return self;},
 args: [],
-source: unescape('argVariables%0A%09%5EargVariables%20copy'),
-messageSends: ["copy"],
+source: unescape('performOptimizations%0A%09%5Eself%20class%20performOptimizations'),
+messageSends: ["performOptimizations", "class"],
 referencedClasses: []
 }),
 smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_safeVariableNameFor_'),
+unescape('_pseudoVariables'),
 smalltalk.method({
-selector: unescape('safeVariableNameFor%3A'),
+selector: unescape('pseudoVariables'),
 category: 'accessing',
-fn: function (aString){
+fn: function (){
 var self=this;
-return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_reservedWords", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(aString, "__comma", ["_"]);})() : (function(){return aString;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(aString, "__comma", ["_"]);}), (function(){return aString;})]));
+return ["self", "super", "true", "false", "nil", "thisContext"];
 return self;},
-args: ["aString"],
-source: unescape('safeVariableNameFor%3A%20aString%0A%09%5E%28Smalltalk%20current%20reservedWords%20includes%3A%20aString%29%0A%09%09ifTrue%3A%20%5BaString%2C%20%27_%27%5D%0A%09%09ifFalse%3A%20%5BaString%5D'),
-messageSends: ["ifTrue:ifFalse:", "includes:", "reservedWords", "current", unescape("%2C")],
-referencedClasses: ["Smalltalk"]
+args: [],
+source: unescape('pseudoVariables%0A%09%5E%23%28%27self%27%20%27super%27%20%27true%27%20%27false%27%20%27nil%27%20%27thisContext%27%29'),
+messageSends: [],
+referencedClasses: []
 }),
 smalltalk.Compiler);
 
-
-smalltalk.Compiler.klass.iVarNames = ['performOptimizations'];
 smalltalk.addMethod(
 unescape('_recompile_'),
 smalltalk.method({
@@ -2217,15 +2087,15 @@ category: 'compiling',
 fn: function (aClass){
 var self=this;
 smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_do_", [(function(each){var method=nil;
-(method=smalltalk.send(smalltalk.send(self, "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), aClass]));smalltalk.send(method, "_category_", [smalltalk.send(each, "_category", [])]);return smalltalk.send(aClass, "_addCompiledMethod_", [method]);})]);
+(method=smalltalk.send(self, "_load_forClass_", [smalltalk.send(each, "_source", []), aClass]));smalltalk.send(method, "_category_", [smalltalk.send(each, "_category", [])]);return smalltalk.send(aClass, "_addCompiledMethod_", [method]);})]);
 ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})]));
 return self;},
 args: ["aClass"],
-source: unescape('recompile%3A%20aClass%0A%09aClass%20methodDictionary%20do%3A%20%5B%3Aeach%20%7C%7C%20method%20%7C%0A%09%09method%20%3A%3D%20self%20new%20load%3A%20each%20source%20forClass%3A%20aClass.%0A%09%09method%20category%3A%20each%20category.%0A%09%09aClass%20addCompiledMethod%3A%20method%5D.%0A%09aClass%20isMetaclass%20ifFalse%3A%20%5Bself%20recompile%3A%20aClass%20class%5D'),
-messageSends: ["do:", "methodDictionary", "load:forClass:", "new", "source", "category:", "category", "addCompiledMethod:", "ifFalse:", "isMetaclass", "recompile:", "class"],
+source: unescape('recompile%3A%20aClass%0A%09aClass%20methodDictionary%20do%3A%20%5B%3Aeach%20%7C%7C%20method%20%7C%0A%09%09method%20%3A%3D%20self%20load%3A%20each%20source%20forClass%3A%20aClass.%0A%09%09method%20category%3A%20each%20category.%0A%09%09aClass%20addCompiledMethod%3A%20method%5D.%0A%09aClass%20isMetaclass%20ifFalse%3A%20%5Bself%20recompile%3A%20aClass%20class%5D'),
+messageSends: ["do:", "methodDictionary", "load:forClass:", "source", "category:", "category", "addCompiledMethod:", "ifFalse:", "isMetaclass", "recompile:", "class"],
 referencedClasses: []
 }),
-smalltalk.Compiler.klass);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
 unescape('_recompileAll'),
@@ -2234,383 +2104,519 @@ selector: unescape('recompileAll'),
 category: 'compiling',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){return smalltalk.send(self, "_recompile_", [each]);})]);
-return self;},
-args: [],
-source: unescape('recompileAll%0A%09Smalltalk%20current%20classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09self%20recompile%3A%20each%5D'),
-messageSends: ["do:", "classes", "current", "recompile:"],
-referencedClasses: ["Smalltalk"]
-}),
-smalltalk.Compiler.klass);
-
-smalltalk.addMethod(
-unescape('_performOptimizations'),
-smalltalk.method({
-selector: unescape('performOptimizations'),
-category: 'accessing',
-fn: function (){
-var self=this;
-return (($receiver = self['@performOptimizations']) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver;
+smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){(function($rec){smalltalk.send($rec, "_show_", [each]);return smalltalk.send($rec, "_cr", []);})((smalltalk.Transcript || Transcript));return smalltalk.send((function(){return smalltalk.send(self, "_recompile_", [each]);}), "_valueWithTimeout_", [(100)]);})]);
 return self;},
 args: [],
-source: unescape('performOptimizations%0A%09%5EperformOptimizations%20ifNil%3A%20%5Btrue%5D'),
-messageSends: ["ifNil:"],
-referencedClasses: []
+source: unescape('recompileAll%0A%09Smalltalk%20current%20classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09Transcript%20show%3A%20each%3B%20cr.%0A%09%09%5Bself%20recompile%3A%20each%5D%20valueWithTimeout%3A%20100%5D'),
+messageSends: ["do:", "classes", "current", "show:", "cr", "valueWithTimeout:", "recompile:"],
+referencedClasses: ["Smalltalk", "Transcript"]
 }),
-smalltalk.Compiler.klass);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_performOptimizations_'),
+unescape('_safeVariableNameFor_'),
 smalltalk.method({
-selector: unescape('performOptimizations%3A'),
+selector: unescape('safeVariableNameFor%3A'),
 category: 'accessing',
-fn: function (aBoolean){
+fn: function (aString){
 var self=this;
-(self['@performOptimizations']=aBoolean);
+return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_reservedWords", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(aString, "__comma", ["_"]);})() : (function(){return aString;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(aString, "__comma", ["_"]);}), (function(){return aString;})]));
 return self;},
-args: ["aBoolean"],
-source: unescape('performOptimizations%3A%20aBoolean%0A%09performOptimizations%20%3A%3D%20aBoolean'),
-messageSends: [],
-referencedClasses: []
+args: ["aString"],
+source: unescape('safeVariableNameFor%3A%20aString%0A%09%5E%28Smalltalk%20current%20reservedWords%20includes%3A%20aString%29%0A%09%09ifTrue%3A%20%5BaString%2C%20%27_%27%5D%0A%09%09ifFalse%3A%20%5BaString%5D'),
+messageSends: ["ifTrue:ifFalse:", "includes:", "reservedWords", "current", unescape("%2C")],
+referencedClasses: ["Smalltalk"]
 }),
-smalltalk.Compiler.klass);
-
+smalltalk.Compiler);
 
-smalltalk.addClass('BlockSequenceNode', smalltalk.SequenceNode, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_send_to_arguments_superSend_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
+selector: unescape('send%3Ato%3Aarguments%3AsuperSend%3A'),
 category: 'visiting',
-fn: function (aVisitor){
+fn: function (aSelector, aReceiver, aCollection, aBoolean){
 var self=this;
-smalltalk.send(aVisitor, "_visitBlockSequenceNode_", [self]);
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(str){var tmp=nil;
+(tmp=self['@stream']);smalltalk.send(str, "_nextPutAll_", [unescape("smalltalk.send%28")]);smalltalk.send(str, "_nextPutAll_", [aReceiver]);smalltalk.send(str, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%2C%20%22"), "__comma", [smalltalk.send(aSelector, "_asSelector", [])]), "__comma", [unescape("%22%2C%20%5B")])]);(self['@stream']=str);smalltalk.send(aCollection, "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);(self['@stream']=tmp);smalltalk.send(str, "_nextPutAll_", [unescape("%5D")]);((($receiver = aBoolean).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(str, "_nextPutAll_", [smalltalk.send(unescape("%2C%20smalltalk."), "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(smalltalk.send(self, "_currentClass", []), "_superclass", [])])])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(str, "_nextPutAll_", [smalltalk.send(unescape("%2C%20smalltalk."), "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(smalltalk.send(self, "_currentClass", []), "_superclass", [])])])]);})]));return smalltalk.send(str, "_nextPutAll_", [unescape("%29")]);})]);
 return self;},
-args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitBlockSequenceNode%3A%20self'),
-messageSends: ["visitBlockSequenceNode:"],
-referencedClasses: []
+args: ["aSelector", "aReceiver", "aCollection", "aBoolean"],
+source: unescape('send%3A%20aSelector%20to%3A%20aReceiver%20arguments%3A%20aCollection%20superSend%3A%20aBoolean%0A%09%5EString%20streamContents%3A%20%5B%3Astr%20%7C%7C%20tmp%20%7C%0A%20%20%20%20%20%20%20%20%09tmp%20%3A%3D%20stream.%0A%09%09str%20nextPutAll%3A%20%27smalltalk.send%28%27.%0A%09%09str%20nextPutAll%3A%20aReceiver.%0A%09%09str%20nextPutAll%3A%20%27%2C%20%22%27%2C%20aSelector%20asSelector%2C%20%27%22%2C%20%5B%27.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20%3A%3D%20str.%0A%09%09aCollection%0A%09%20%20%20%20%09%09do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D%0A%09%20%20%20%20%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stream%20%3A%3D%20tmp.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20str%20nextPutAll%3A%20%27%5D%27.%0A%09%09aBoolean%20ifTrue%3A%20%5B%0A%09%09%09str%20nextPutAll%3A%20%27%2C%20smalltalk.%27%2C%20%28self%20classNameFor%3A%20self%20currentClass%20superclass%29%5D.%0A%09%09str%20nextPutAll%3A%20%27%29%27%5D'),
+messageSends: ["streamContents:", "nextPutAll:", unescape("%2C"), "asSelector", "do:separatedBy:", "visit:", "ifTrue:", "classNameFor:", "superclass", "currentClass"],
+referencedClasses: ["String"]
 }),
-smalltalk.BlockSequenceNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_isBlockSequenceNode'),
+unescape('_setupClass_'),
 smalltalk.method({
-selector: unescape('isBlockSequenceNode'),
-category: 'testing',
-fn: function (){
+selector: unescape('setupClass%3A'),
+category: 'compiling',
+fn: function (aClass){
 var self=this;
-return true;
+smalltalk.init(aClass);
 return self;},
-args: [],
-source: unescape('isBlockSequenceNode%0A%09%5Etrue'),
+args: ["aClass"],
+source: unescape('setupClass%3A%20aClass%0A%09%3Csmalltalk.init%28aClass%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.BlockSequenceNode);
-
-
+smalltalk.Compiler);
 
-smalltalk.addClass('BlockNode', smalltalk.Node, ['parameters', 'inlined'], 'Compiler');
 smalltalk.addMethod(
-unescape('_parameters'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('parameters'),
+selector: unescape('source'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return (($receiver = self['@parameters']) == nil || $receiver == undefined) ? (function(){return (self['@parameters']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return (($receiver = self['@source']) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
 return self;},
 args: [],
-source: unescape('parameters%0A%09%5Eparameters%20ifNil%3A%20%5Bparameters%20%3A%3D%20Array%20new%5D'),
-messageSends: ["ifNil:", "new"],
-referencedClasses: ["Array"]
+source: unescape('source%0A%09%5Esource%20ifNil%3A%20%5B%27%27%5D'),
+messageSends: ["ifNil:"],
+referencedClasses: []
 }),
-smalltalk.BlockNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_parameters_'),
+unescape('_source_'),
 smalltalk.method({
-selector: unescape('parameters%3A'),
+selector: unescape('source%3A'),
 category: 'accessing',
-fn: function (aCollection){
+fn: function (aString){
 var self=this;
-(self['@parameters']=aCollection);
+(self['@source']=aString);
 return self;},
-args: ["aCollection"],
-source: unescape('parameters%3A%20aCollection%0A%09parameters%20%3A%3D%20aCollection'),
+args: ["aString"],
+source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.BlockNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_tempVariables'),
 smalltalk.method({
-selector: unescape('accept%3A'),
-category: 'visiting',
-fn: function (aVisitor){
+selector: unescape('tempVariables'),
+category: 'accessing',
+fn: function (){
 var self=this;
-smalltalk.send(aVisitor, "_visitBlockNode_", [self]);
+return smalltalk.send(self['@tempVariables'], "_copy", []);
 return self;},
-args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitBlockNode%3A%20self'),
-messageSends: ["visitBlockNode:"],
+args: [],
+source: unescape('tempVariables%0A%09%5EtempVariables%20copy'),
+messageSends: ["copy"],
 referencedClasses: []
 }),
-smalltalk.BlockNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_isBlockNode'),
+unescape('_unknownVariables'),
 smalltalk.method({
-selector: unescape('isBlockNode'),
-category: 'testing',
+selector: unescape('unknownVariables'),
+category: 'accessing',
 fn: function (){
 var self=this;
-return true;
+return smalltalk.send(self['@unknownVariables'], "_copy", []);
 return self;},
 args: [],
-source: unescape('isBlockNode%0A%09%5Etrue'),
-messageSends: [],
+source: unescape('unknownVariables%0A%09%5EunknownVariables%20copy'),
+messageSends: ["copy"],
 referencedClasses: []
 }),
-smalltalk.BlockNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_inlined'),
+unescape('_visit_'),
 smalltalk.method({
-selector: unescape('inlined'),
-category: 'accessing',
-fn: function (){
+selector: unescape('visit%3A'),
+category: 'visiting',
+fn: function (aNode){
 var self=this;
-return (($receiver = self['@inlined']) == nil || $receiver == undefined) ? (function(){return false;})() : $receiver;
+smalltalk.send(aNode, "_accept_", [self]);
 return self;},
-args: [],
-source: unescape('inlined%0A%09%5Einlined%20ifNil%3A%20%5Bfalse%5D'),
-messageSends: ["ifNil:"],
+args: ["aNode"],
+source: unescape('visit%3A%20aNode%0A%09aNode%20accept%3A%20self'),
+messageSends: ["accept:"],
 referencedClasses: []
 }),
-smalltalk.BlockNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_inlined_'),
+unescape('_visitAssignmentNode_'),
 smalltalk.method({
-selector: unescape('inlined%3A'),
-category: 'accessing',
-fn: function (aBoolean){
+selector: unescape('visitAssignmentNode%3A'),
+category: 'visiting',
+fn: function (aNode){
 var self=this;
-(self['@inlined']=aBoolean);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28")]);
+smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_left", [])]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3D")]);
+smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_right", [])]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29")]);
 return self;},
-args: ["aBoolean"],
-source: unescape('inlined%3A%20aBoolean%0A%09inlined%20%3A%3D%20aBoolean'),
-messageSends: [],
+args: ["aNode"],
+source: unescape('visitAssignmentNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27%28%27.%0A%09self%20visit%3A%20aNode%20left.%0A%09stream%20nextPutAll%3A%20%27%3D%27.%0A%09self%20visit%3A%20aNode%20right.%0A%09stream%20nextPutAll%3A%20%27%29%27'),
+messageSends: ["nextPutAll:", "visit:", "left", "right"],
 referencedClasses: []
 }),
-smalltalk.BlockNode);
-
-
+smalltalk.Compiler);
 
-smalltalk.addClass('CascadeNode', smalltalk.Node, ['receiver'], 'Compiler');
 smalltalk.addMethod(
-unescape('_receiver'),
+unescape('_visitBlockNode_'),
 smalltalk.method({
-selector: unescape('receiver'),
-category: 'accessing',
-fn: function (){
+selector: unescape('visitBlockNode%3A'),
+category: 'visiting',
+fn: function (aNode){
 var self=this;
-return self['@receiver'];
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28function%28")]);
+smalltalk.send(smalltalk.send(aNode, "_parameters", []), "_do_separatedBy_", [(function(each){smalltalk.send(self['@tempVariables'], "_add_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29%7B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29")]);
 return self;},
-args: [],
-source: unescape('receiver%0A%09%5Ereceiver'),
-messageSends: [],
+args: ["aNode"],
+source: unescape('visitBlockNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27%28function%28%27.%0A%09aNode%20parameters%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%0A%09%09tempVariables%20add%3A%20each.%0A%09%09stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09stream%20nextPutAll%3A%20%27%29%7B%27.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%29%27'),
+messageSends: ["nextPutAll:", "do:separatedBy:", "parameters", "add:", "do:", "nodes", "visit:"],
 referencedClasses: []
 }),
-smalltalk.CascadeNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_receiver_'),
+unescape('_visitBlockSequenceNode_'),
 smalltalk.method({
-selector: unescape('receiver%3A'),
-category: 'accessing',
+selector: unescape('visitBlockSequenceNode%3A'),
+category: 'visiting',
 fn: function (aNode){
 var self=this;
-(self['@receiver']=aNode);
+var index=nil;
+(self['@nestedBlocks']=((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
+((($receiver = smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("return%20nil%3B")]);})() : (function(){smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
+(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);(index=(0));return smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("return%20nil%3B")]);}), (function(){smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
+(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);(index=(0));return smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);})]));
+(self['@nestedBlocks']=((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])));
 return self;},
 args: ["aNode"],
-source: unescape('receiver%3A%20aNode%0A%09receiver%20%3A%3D%20aNode'),
-messageSends: [],
+source: unescape('visitBlockSequenceNode%3A%20aNode%0A%09%7C%20index%20%7C%0A%09nestedBlocks%20%3A%3D%20nestedBlocks%20+%201.%0A%09aNode%20nodes%20isEmpty%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09stream%20nextPutAll%3A%20%27return%20nil%3B%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09aNode%20temps%20do%3A%20%5B%3Aeach%20%7C%20%7C%20temp%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20temp%20%3A%3D%20self%20safeVariableNameFor%3A%20each.%0A%09%09%20%20%20%20tempVariables%20add%3A%20temp.%0A%09%09%20%20%20%20stream%20nextPutAll%3A%20%27var%20%27%2C%20temp%2C%20%27%3Dnil%3B%27%3B%20lf%5D.%0A%09%09index%20%3A%3D%200.%0A%09%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%20%20%20%20index%20%3A%3D%20index%20+%201.%0A%09%09%20%20%20%20index%20%3D%20aNode%20nodes%20size%20ifTrue%3A%20%5B%0A%09%09%09stream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09%09%20%20%20%20self%20visit%3A%20each.%0A%09%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D%5D.%0A%09nestedBlocks%20%3A%3D%20nestedBlocks%20-%201'),
+messageSends: [unescape("+"), "ifTrue:ifFalse:", "isEmpty", "nodes", "nextPutAll:", "do:", "temps", "safeVariableNameFor:", "add:", unescape("%2C"), "lf", "ifTrue:", unescape("%3D"), "size", "visit:", unescape("-")],
 referencedClasses: []
 }),
-smalltalk.CascadeNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_visitCascadeNode_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
+selector: unescape('visitCascadeNode%3A'),
 category: 'visiting',
-fn: function (aVisitor){
+fn: function (aNode){
 var self=this;
-smalltalk.send(aVisitor, "_visitCascadeNode_", [self]);
+var index=nil;
+(index=(0));
+((($receiver = smalltalk.send(self['@tempVariables'], "_includes_", ["$rec"])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@tempVariables'], "_add_", ["$rec"]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@tempVariables'], "_add_", ["$rec"]);})]));
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28function%28%24rec%29%7B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){(index=((($receiver = index).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));((($receiver = smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));smalltalk.send(each, "_receiver_", [smalltalk.send(smalltalk.send((smalltalk.VariableNode || VariableNode), "_new", []), "_value_", ["$rec"])]);smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29%28")]);
+smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_receiver", [])]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29")]);
 return self;},
-args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitCascadeNode%3A%20self'),
-messageSends: ["visitCascadeNode:"],
+args: ["aNode"],
+source: unescape('visitCascadeNode%3A%20aNode%0A%09%7C%20index%20%7C%0A%09index%20%3A%3D%200.%0A%09%28tempVariables%20includes%3A%20%27%24rec%27%29%20ifFalse%3A%20%5B%0A%09%09tempVariables%20add%3A%20%27%24rec%27%5D.%0A%09stream%20nextPutAll%3A%20%27%28function%28%24rec%29%7B%27.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20index%20%3A%3D%20index%20+%201.%0A%09%20%20%20%20index%20%3D%20aNode%20nodes%20size%20ifTrue%3A%20%5B%0A%09%09stream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09%20%20%20%20each%20receiver%3A%20%28VariableNode%20new%20value%3A%20%27%24rec%27%29.%0A%09%20%20%20%20self%20visit%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%29%28%27.%0A%09self%20visit%3A%20aNode%20receiver.%0A%09stream%20nextPutAll%3A%20%27%29%27'),
+messageSends: ["ifFalse:", "includes:", "add:", "nextPutAll:", "do:", "nodes", unescape("+"), "ifTrue:", unescape("%3D"), "size", "receiver:", "value:", "new", "visit:", "receiver"],
+referencedClasses: ["VariableNode"]
+}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+unescape('_visitClassReferenceNode_'),
+smalltalk.method({
+selector: unescape('visitClassReferenceNode%3A'),
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+((($receiver = smalltalk.send(self['@referencedClasses'], "_includes_", [smalltalk.send(aNode, "_value", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@referencedClasses'], "_add_", [smalltalk.send(aNode, "_value", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@referencedClasses'], "_add_", [smalltalk.send(aNode, "_value", [])]);})]));
+smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28smalltalk."), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%20%7C%7C%20")]), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%29")])]);
+return self;},
+args: ["aNode"],
+source: unescape('visitClassReferenceNode%3A%20aNode%0A%09%28referencedClasses%20includes%3A%20aNode%20value%29%20ifFalse%3A%20%5B%0A%09%09referencedClasses%20add%3A%20aNode%20value%5D.%0A%09stream%20nextPutAll%3A%20%27%28smalltalk.%27%2C%20aNode%20value%2C%20%27%20%7C%7C%20%27%2C%20aNode%20value%2C%20%27%29%27'),
+messageSends: ["ifFalse:", "includes:", "value", "add:", "nextPutAll:", unescape("%2C")],
 referencedClasses: []
 }),
-smalltalk.CascadeNode);
+smalltalk.Compiler);
 
+smalltalk.addMethod(
+unescape('_visitDynamicArrayNode_'),
+smalltalk.method({
+selector: unescape('visitDynamicArrayNode%3A'),
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D")]);
+return self;},
+args: ["aNode"],
+source: unescape('visitDynamicArrayNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27%5B%27.%0A%09aNode%20nodes%20%0A%09%09do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D%0A%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09stream%20nextPutAll%3A%20%27%5D%27'),
+messageSends: ["nextPutAll:", "do:separatedBy:", "nodes", "visit:"],
+referencedClasses: []
+}),
+smalltalk.Compiler);
 
+smalltalk.addMethod(
+unescape('_visitDynamicDictionaryNode_'),
+smalltalk.method({
+selector: unescape('visitDynamicDictionaryNode%3A'),
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("smalltalk.HashedCollection._fromPairs_%28%5B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D%29")]);
+return self;},
+args: ["aNode"],
+source: unescape('visitDynamicDictionaryNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27smalltalk.HashedCollection._fromPairs_%28%5B%27.%0A%09%09aNode%20nodes%20%0A%09%09%09do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D%0A%09%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09%09stream%20nextPutAll%3A%20%27%5D%29%27'),
+messageSends: ["nextPutAll:", "do:separatedBy:", "nodes", "visit:"],
+referencedClasses: []
+}),
+smalltalk.Compiler);
 
-smalltalk.addClass('MethodNode', smalltalk.Node, ['selector', 'arguments', 'source'], 'Compiler');
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_visitFailure_'),
 smalltalk.method({
-selector: unescape('selector'),
-category: 'accessing',
-fn: function (){
+selector: unescape('visitFailure%3A'),
+category: 'visiting',
+fn: function (aFailure){
 var self=this;
-return self['@selector'];
+smalltalk.send(self, "_error_", [smalltalk.send(aFailure, "_asString", [])]);
 return self;},
-args: [],
-source: unescape('selector%0A%09%5Eselector'),
-messageSends: [],
+args: ["aFailure"],
+source: unescape('visitFailure%3A%20aFailure%0A%09self%20error%3A%20aFailure%20asString'),
+messageSends: ["error:", "asString"],
 referencedClasses: []
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_selector_'),
+unescape('_visitJSStatementNode_'),
 smalltalk.method({
-selector: unescape('selector%3A'),
-category: 'accessing',
-fn: function (aString){
+selector: unescape('visitJSStatementNode%3A'),
+category: 'visiting',
+fn: function (aNode){
 var self=this;
-(self['@selector']=aString);
+smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(aNode, "_source", []), "_replace_with_", [unescape("%3E%3E"), unescape("%3E")])]);
 return self;},
-args: ["aString"],
-source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString'),
-messageSends: [],
+args: ["aNode"],
+source: unescape('visitJSStatementNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%28aNode%20source%20replace%3A%20%27%3E%3E%27%20with%3A%20%27%3E%27%29'),
+messageSends: ["nextPutAll:", "replace:with:", "source"],
 referencedClasses: []
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_arguments'),
+unescape('_visitMethodNode_'),
 smalltalk.method({
-selector: unescape('arguments'),
-category: 'accessing',
-fn: function (){
+selector: unescape('visitMethodNode%3A'),
+category: 'visiting',
+fn: function (aNode){
 var self=this;
-return (($receiver = self['@arguments']) == nil || $receiver == undefined) ? (function(){return [];})() : $receiver;
+var str=nil;
+var currentSelector=nil;
+(self['@currentSelector']=smalltalk.send(smalltalk.send(aNode, "_selector", []), "_asSelector", []));
+(self['@nestedBlocks']=(0));
+(self['@earlyReturn']=false);
+(self['@messageSends']=[]);
+(self['@referencedClasses']=[]);
+(self['@unknownVariables']=[]);
+(self['@tempVariables']=[]);
+(self['@argVariables']=[]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20%22"), "__comma", [smalltalk.send(aNode, "_selector", [])]), "__comma", [unescape("%22%2C")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("source%3A%20unescape%28%22"), "__comma", [smalltalk.send(smalltalk.send(self, "_source", []), "_escaped", [])]), "__comma", [unescape("%22%29%2C")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("fn%3A%20function%28")]);
+smalltalk.send(smalltalk.send(aNode, "_arguments", []), "_do_separatedBy_", [(function(each){smalltalk.send(self['@argVariables'], "_add_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C%20")]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%29%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("var%20self%3Dthis%3B")]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);
+(str=self['@stream']);
+(self['@stream']=smalltalk.send("", "_writeStream", []));
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
+((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(str, "_nextPutAll_", [unescape("try%7B")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(str, "_nextPutAll_", [unescape("try%7B")]);})]));
+smalltalk.send(str, "_nextPutAll_", [smalltalk.send(self['@stream'], "_contents", [])]);
+(self['@stream']=str);
+(function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("return%20self%3B")]);})(self['@stream']);
+((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27stReturn%27%20%26%26%20e.selector%20%3D%3D%3D%20"), "__comma", [smalltalk.send(self['@currentSelector'], "_printString", [])]), "__comma", [unescape("%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D")])]);})(self['@stream']);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27stReturn%27%20%26%26%20e.selector%20%3D%3D%3D%20"), "__comma", [smalltalk.send(self['@currentSelector'], "_printString", [])]), "__comma", [unescape("%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D")])]);})(self['@stream']);})]));
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D")]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%2C"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])]), "__comma", ["messageSends: "])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@messageSends'], "_asJavascript", []), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("args: ", "__comma", [smalltalk.send(self['@argVariables'], "_asJavascript", [])]), "__comma", [unescape("%2C")])]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_nextPutAll_", [unescape("referencedClasses%3A%20%5B")]);})(self['@stream']);
+smalltalk.send(self['@referencedClasses'], "_do_separatedBy_", [(function(each){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(each, "_printString", [])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D")]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29")]);
 return self;},
-args: [],
-source: unescape('arguments%0A%09%5Earguments%20ifNil%3A%20%5B%23%28%29%5D'),
-messageSends: ["ifNil:"],
+args: ["aNode"],
+source: unescape('visitMethodNode%3A%20aNode%0A%09%7C%20str%20currentSelector%20%7C%20%0A%09currentSelector%20%3A%3D%20aNode%20selector%20asSelector.%0A%09nestedBlocks%20%3A%3D%200.%0A%09earlyReturn%20%3A%3D%20false.%0A%09messageSends%20%3A%3D%20%23%28%29.%0A%09referencedClasses%20%3A%3D%20%23%28%29.%0A%09unknownVariables%20%3A%3D%20%23%28%29.%0A%09tempVariables%20%3A%3D%20%23%28%29.%0A%09argVariables%20%3A%3D%20%23%28%29.%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.method%28%7B%27%3B%20lf%3B%0A%09%20%20%20%20nextPutAll%3A%20%27selector%3A%20%22%27%2C%20aNode%20selector%2C%20%27%22%2C%27%3B%20lf.%0A%09stream%20nextPutAll%3A%20%27source%3A%20unescape%28%22%27%2C%20self%20source%20escaped%2C%20%27%22%29%2C%27%3Blf.%0A%09stream%20nextPutAll%3A%20%27fn%3A%20function%28%27.%0A%09aNode%20arguments%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09argVariables%20add%3A%20each.%0A%09%09stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20%27%29%7B%27%3B%20lf%3B%0A%09%20%20%20%20nextPutAll%3A%20%27var%20self%3Dthis%3B%27%3B%20lf.%0A%09str%20%3A%3D%20stream.%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20visit%3A%20each%5D.%0A%09earlyReturn%20ifTrue%3A%20%5B%0A%09%20%20%20%20str%20nextPutAll%3A%20%27try%7B%27%5D.%0A%09str%20nextPutAll%3A%20stream%20contents.%0A%09stream%20%3A%3D%20str.%0A%09stream%20%0A%09%20%20%20%20lf%3B%20%0A%09%20%20%20%20nextPutAll%3A%20%27return%20self%3B%27.%0A%09earlyReturn%20ifTrue%3A%20%5B%0A%09%20%20%20%20stream%20lf%3B%20nextPutAll%3A%20%27%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27%27stReturn%27%27%20%26%26%20e.selector%20%3D%3D%3D%20%27%2C%20currentSelector%20printString%2C%20%27%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D%27%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%27.%0A%09stream%20%0A%09%09nextPutAll%3A%20%27%2C%27%2C%20String%20lf%2C%20%27messageSends%3A%20%27%3B%0A%09%09nextPutAll%3A%20messageSends%20asJavascript%2C%20%27%2C%27%3B%20lf%3B%0A%20%20%20%20%20%20%20%20%20%20%09nextPutAll%3A%20%27args%3A%20%27%2C%20argVariables%20asJavascript%2C%20%27%2C%27%3B%20lf%3B%0A%09%09nextPutAll%3A%20%27referencedClasses%3A%20%5B%27.%0A%09referencedClasses%20%0A%09%09do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%20printString%5D%0A%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09stream%20nextPutAll%3A%20%27%5D%27.%0A%09stream%20nextPutAll%3A%20%27%7D%29%27'),
+messageSends: ["asSelector", "selector", "nextPutAll:", "lf", unescape("%2C"), "escaped", "source", "do:separatedBy:", "arguments", "add:", "writeStream", "do:", "nodes", "visit:", "ifTrue:", "contents", "printString", "asJavascript"],
+referencedClasses: ["String"]
+}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+unescape('_visitReturnNode_'),
+smalltalk.method({
+selector: unescape('visitReturnNode%3A'),
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+((($receiver = ((($receiver = self['@nestedBlocks']).klass === smalltalk.Number) ? $receiver >(0) : smalltalk.send($receiver, "__gt", [(0)]))).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (self['@earlyReturn']=true);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (self['@earlyReturn']=true);})]));
+((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%28function%28%29%7Bthrow%28")]);smalltalk.send($rec, "_nextPutAll_", [unescape("%7Bname%3A%20%27stReturn%27%2C%20selector%3A%20")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@currentSelector'], "_printString", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20fn%3A%20function%28%29%7Breturn%20")]);})(self['@stream']);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%28function%28%29%7Bthrow%28")]);smalltalk.send($rec, "_nextPutAll_", [unescape("%7Bname%3A%20%27stReturn%27%2C%20selector%3A%20")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@currentSelector'], "_printString", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20fn%3A%20function%28%29%7Breturn%20")]);})(self['@stream']);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]));
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
+((($receiver = self['@earlyReturn']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%7D%29%7D%29%28%29")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%7D%29%7D%29%28%29")]);})]));
+return self;},
+args: ["aNode"],
+source: unescape('visitReturnNode%3A%20aNode%0A%09nestedBlocks%20%3E%200%20ifTrue%3A%20%5B%0A%09%20%20%20%20earlyReturn%20%3A%3D%20true%5D.%0A%09earlyReturn%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09stream%0A%09%09%20%20%20%20nextPutAll%3A%20%27%28function%28%29%7Bthrow%28%27%3B%0A%09%09%20%20%20%20nextPutAll%3A%20%27%7Bname%3A%20%27%27stReturn%27%27%2C%20selector%3A%20%27%3B%0A%09%09%20%20%20%20nextPutAll%3A%20currentSelector%20printString%3B%0A%09%09%20%20%20%20nextPutAll%3A%20%27%2C%20fn%3A%20function%28%29%7Breturn%20%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5Bstream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20visit%3A%20each%5D.%0A%09earlyReturn%20ifTrue%3A%20%5B%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%7D%7D%29%7D%29%28%29%27%5D'),
+messageSends: ["ifTrue:", unescape("%3E"), "ifTrue:ifFalse:", "nextPutAll:", "printString", "do:", "nodes", "visit:"],
 referencedClasses: []
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_arguments_'),
+unescape('_visitSendNode_'),
 smalltalk.method({
-selector: unescape('arguments%3A'),
-category: 'accessing',
-fn: function (aCollection){
+selector: unescape('visitSendNode%3A'),
+category: 'visiting',
+fn: function (aNode){
 var self=this;
-(self['@arguments']=aCollection);
+var str=nil;
+var receiver=nil;
+var superSend=nil;
+var inlined=nil;
+(str=self['@stream']);
+((($receiver = smalltalk.send(self['@messageSends'], "_includes_", [smalltalk.send(aNode, "_selector", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@messageSends'], "_add_", [smalltalk.send(aNode, "_selector", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self['@messageSends'], "_add_", [smalltalk.send(aNode, "_selector", [])]);})]));
+(self['@stream']=smalltalk.send("", "_writeStream", []));
+smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_receiver", [])]);
+(superSend=smalltalk.send(smalltalk.send(self['@stream'], "_contents", []), "__eq", ["super"]));
+(receiver=((($receiver = superSend).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "self";})() : (function(){return smalltalk.send(self['@stream'], "_contents", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "self";}), (function(){return smalltalk.send(self['@stream'], "_contents", []);})])));
+(self['@stream']=str);
+((($receiver = smalltalk.send(self, "_performOptimizations", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inlineLiteral_receiverNode_argumentNodes_", [smalltalk.send(aNode, "_selector", []), smalltalk.send(aNode, "_receiver", []), smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})]));})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inlineLiteral_receiverNode_argumentNodes_", [smalltalk.send(aNode, "_selector", []), smalltalk.send(aNode, "_receiver", []), smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return ((($receiver = smalltalk.send(self, "_inline_receiver_argumentNodes_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(" : ", "__comma", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), "$receiver", smalltalk.send(aNode, "_arguments", []), superSend])]), "__comma", [unescape("%29")])]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));})]));}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(self, "_send_to_arguments_superSend_", [smalltalk.send(aNode, "_selector", []), receiver, smalltalk.send(aNode, "_arguments", []), superSend])]);})]));
 return self;},
-args: ["aCollection"],
-source: unescape('arguments%3A%20aCollection%0A%09arguments%20%3A%3D%20aCollection'),
-messageSends: [],
+args: ["aNode"],
+source: unescape('visitSendNode%3A%20aNode%0A%20%20%20%20%20%20%20%20%7C%20str%20receiver%20superSend%20inlined%20%7C%0A%20%20%20%20%20%20%20%20str%20%3A%3D%20stream.%0A%20%20%20%20%20%20%20%20%28messageSends%20includes%3A%20aNode%20selector%29%20ifFalse%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20messageSends%20add%3A%20aNode%20selector%5D.%0A%20%20%20%20%20%20%20%20stream%20%3A%3D%20%27%27%20writeStream.%0A%20%20%20%20%20%20%20%20self%20visit%3A%20aNode%20receiver.%0A%20%20%20%20%20%20%20%20superSend%20%3A%3D%20stream%20contents%20%3D%20%27super%27.%0A%20%20%20%20%20%20%20%20receiver%20%3A%3D%20superSend%20ifTrue%3A%20%5B%27self%27%5D%20ifFalse%3A%20%5Bstream%20contents%5D.%0A%20%20%20%20%20%20%20%20stream%20%3A%3D%20str.%0A%09%0A%09self%20performOptimizations%20%0A%09%09ifTrue%3A%20%5B%0A%09%09%09%28self%20inlineLiteral%3A%20aNode%20selector%20receiverNode%3A%20aNode%20receiver%20argumentNodes%3A%20aNode%20arguments%29%20ifFalse%3A%20%5B%0A%09%09%09%09%28self%20inline%3A%20aNode%20selector%20receiver%3A%20receiver%20argumentNodes%3A%20aNode%20arguments%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09ifTrue%3A%20%5Bstream%20nextPutAll%3A%20%27%20%3A%20%27%2C%20%28self%20send%3A%20aNode%20selector%20to%3A%20%27%24receiver%27%20arguments%3A%20aNode%20arguments%20superSend%3A%20superSend%29%2C%20%27%29%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09ifFalse%3A%20%5Bstream%20nextPutAll%3A%20%28self%20send%3A%20aNode%20selector%20to%3A%20receiver%20arguments%3A%20aNode%20arguments%20superSend%3A%20superSend%29%5D%5D%5D%0A%09%09ifFalse%3A%20%5Bstream%20nextPutAll%3A%20%28self%20send%3A%20aNode%20selector%20to%3A%20receiver%20arguments%3A%20aNode%20arguments%20superSend%3A%20superSend%29%5D'),
+messageSends: ["ifFalse:", "includes:", "selector", "add:", "writeStream", "visit:", "receiver", unescape("%3D"), "contents", "ifTrue:ifFalse:", "performOptimizations", "inlineLiteral:receiverNode:argumentNodes:", "arguments", "inline:receiver:argumentNodes:", "nextPutAll:", unescape("%2C"), "send:to:arguments:superSend:"],
 referencedClasses: []
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_visitSequenceNode_'),
 smalltalk.method({
-selector: unescape('source'),
-category: 'accessing',
-fn: function (){
+selector: unescape('visitSequenceNode%3A'),
+category: 'visiting',
+fn: function (aNode){
 var self=this;
-return self['@source'];
+smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){var temp=nil;
+(temp=smalltalk.send(self, "_safeVariableNameFor_", [each]));smalltalk.send(self['@tempVariables'], "_add_", [temp]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [temp]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);}), (function(){return smalltalk.send(self['@stream'], "_lf", []);})]);
 return self;},
-args: [],
-source: unescape('source%0A%09%5Esource'),
-messageSends: [],
+args: ["aNode"],
+source: unescape('visitSequenceNode%3A%20aNode%0A%09aNode%20temps%20do%3A%20%5B%3Aeach%20%7C%7C%20temp%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20temp%20%3A%3D%20self%20safeVariableNameFor%3A%20each.%0A%09%20%20%20%20tempVariables%20add%3A%20temp.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27var%20%27%2C%20temp%2C%20%27%3Dnil%3B%27%3B%20lf%5D.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20visit%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20lf%5D'),
+messageSends: ["do:", "temps", "safeVariableNameFor:", "add:", "nextPutAll:", unescape("%2C"), "lf", "do:separatedBy:", "nodes", "visit:"],
 referencedClasses: []
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_source_'),
+unescape('_visitValueNode_'),
 smalltalk.method({
-selector: unescape('source%3A'),
-category: 'accessing',
-fn: function (aString){
+selector: unescape('visitValueNode%3A'),
+category: 'visiting',
+fn: function (aNode){
 var self=this;
-(self['@source']=aString);
+smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(aNode, "_value", []), "_asJavascript", [])]);
 return self;},
-args: ["aString"],
-source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString'),
-messageSends: [],
+args: ["aNode"],
+source: unescape('visitValueNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20aNode%20value%20asJavascript'),
+messageSends: ["nextPutAll:", "asJavascript", "value"],
 referencedClasses: []
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 smalltalk.addMethod(
-unescape('_accept_'),
+unescape('_visitVariableNode_'),
 smalltalk.method({
-selector: unescape('accept%3A'),
+selector: unescape('visitVariableNode%3A'),
 category: 'visiting',
-fn: function (aVisitor){
+fn: function (aNode){
 var self=this;
-smalltalk.send(aVisitor, "_visitMethodNode_", [self]);
+var varName=nil;
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_currentClass", []), "_allInstanceVariableNames", []), "_includes_", [smalltalk.send(aNode, "_value", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("self%5B%27@"), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%27%5D")])]);})() : (function(){(varName=smalltalk.send(self, "_safeVariableNameFor_", [smalltalk.send(aNode, "_value", [])]));return ((($receiver = smalltalk.send(smalltalk.send(self, "_knownVariables", []), "_includes_", [varName])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("self%5B%27@"), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%27%5D")])]);}), (function(){(varName=smalltalk.send(self, "_safeVariableNameFor_", [smalltalk.send(aNode, "_value", [])]));return ((($receiver = smalltalk.send(smalltalk.send(self, "_knownVariables", []), "_includes_", [varName])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);return ((($receiver = smalltalk.send(aNode, "_assigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(unescape("%28typeof%20"), "__comma", [varName]), "__comma", [unescape("%20%3D%3D%20%27undefined%27%20%3F%20nil%20%3A%20")]), "__comma", [varName]), "__comma", [unescape("%29")])]);})]));}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(aNode, "_value", []), "__eq", ["thisContext"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);})() : (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%28smalltalk.getThisContext%28%29%29")]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [varName]);})]));})]));})]));
 return self;},
-args: ["aVisitor"],
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitMethodNode%3A%20self'),
-messageSends: ["visitMethodNode:"],
+args: ["aNode"],
+source: unescape('visitVariableNode%3A%20aNode%0A%09%7C%20varName%20%7C%0A%09%28self%20currentClass%20allInstanceVariableNames%20includes%3A%20aNode%20value%29%20%0A%09%09ifTrue%3A%20%5Bstream%20nextPutAll%3A%20%27self%5B%27%27@%27%2C%20aNode%20value%2C%20%27%27%27%5D%27%5D%0A%09%09ifFalse%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09varName%20%3A%3D%20self%20safeVariableNameFor%3A%20aNode%20value.%0A%09%09%09%28self%20knownVariables%20includes%3A%20varName%29%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09ifFalse%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09unknownVariables%20add%3A%20aNode%20value.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09aNode%20assigned%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09ifTrue%3A%20%5Bstream%20nextPutAll%3A%20varName%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09ifFalse%3A%20%5Bstream%20nextPutAll%3A%20%27%28typeof%20%27%2C%20varName%2C%20%27%20%3D%3D%20%27%27undefined%27%27%20%3F%20nil%20%3A%20%27%2C%20varName%2C%20%27%29%27%5D%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09ifTrue%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09aNode%20value%20%3D%20%27thisContext%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09ifTrue%3A%20%5Bstream%20nextPutAll%3A%20%27%28smalltalk.getThisContext%28%29%29%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09ifFalse%3A%20%5Bstream%20nextPutAll%3A%20varName%5D%5D%5D'),
+messageSends: ["ifTrue:ifFalse:", "includes:", "allInstanceVariableNames", "currentClass", "value", "nextPutAll:", unescape("%2C"), "safeVariableNameFor:", "ifFalse:ifTrue:", "knownVariables", "add:", "assigned", unescape("%3D")],
 referencedClasses: []
 }),
-smalltalk.MethodNode);
+smalltalk.Compiler);
 
 
+smalltalk.Compiler.klass.iVarNames = ['performOptimizations'];
+smalltalk.addMethod(
+unescape('_performOptimizations'),
+smalltalk.method({
+selector: unescape('performOptimizations'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return (($receiver = self['@performOptimizations']) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver;
+return self;},
+args: [],
+source: unescape('performOptimizations%0A%09%5EperformOptimizations%20ifNil%3A%20%5Btrue%5D'),
+messageSends: ["ifNil:"],
+referencedClasses: []
+}),
+smalltalk.Compiler.klass);
 
-smalltalk.addClass('StrippedExporter', smalltalk.Exporter, [], 'Compiler');
 smalltalk.addMethod(
-unescape('_exportDefinitionOf_on_'),
+unescape('_performOptimizations_'),
 smalltalk.method({
-selector: unescape('exportDefinitionOf%3Aon%3A'),
-category: 'private',
-fn: function (aClass, aStream){
+selector: unescape('performOptimizations%3A'),
+category: 'accessing',
+fn: function (aBoolean){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addClass%28")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])]), "__comma", [unescape("%27%2C%20")])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [smalltalk.send(aClass, "_superclass", [])])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%2C%20%5B")]);})(aStream);
-smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [each]), "__comma", [unescape("%27")])]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%2C%20")]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("%5D%2C%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(aClass, "_category", []), "__comma", [unescape("%27")])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);})(aStream);
-smalltalk.send(aStream, "_lf", []);
+(self['@performOptimizations']=aBoolean);
 return self;},
-args: ["aClass", "aStream"],
-source: unescape('exportDefinitionOf%3A%20aClass%20on%3A%20aStream%0A%09aStream%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.addClass%28%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%2C%20%28self%20classNameFor%3A%20aClass%29%2C%20%27%27%27%2C%20%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.%27%2C%20%28self%20classNameFor%3A%20aClass%20superclass%29%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%2C%20%5B%27.%0A%09aClass%20instanceVariableNames%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20aStream%20nextPutAll%3A%20%27%27%27%27%2C%20each%2C%20%27%27%27%27%5D%0A%09%20%20%20%20separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09aStream%09%0A%09%20%20%20%20nextPutAll%3A%20%27%5D%2C%20%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aClass%20category%2C%20%27%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%29%3B%27.%0A%09aStream%20lf'),
-messageSends: ["nextPutAll:", unescape("%2C"), "classNameFor:", "superclass", "do:separatedBy:", "instanceVariableNames", "category", "lf"],
+args: ["aBoolean"],
+source: unescape('performOptimizations%3A%20aBoolean%0A%09performOptimizations%20%3A%3D%20aBoolean'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.StrippedExporter);
+smalltalk.Compiler.klass);
 
 smalltalk.addMethod(
-unescape('_exportMethod_of_on_'),
+unescape('_recompile_'),
 smalltalk.method({
-selector: unescape('exportMethod%3Aof%3Aon%3A'),
-category: 'private',
-fn: function (aMethod, aClass, aStream){
+selector: unescape('recompile%3A'),
+category: 'compiling',
+fn: function (aClass){
 var self=this;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.addMethod%28")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_asSelector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("smalltalk.method%28%7B")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("selector%3A%20unescape%28%27"), "__comma", [smalltalk.send(smalltalk.send(aMethod, "_selector", []), "_escaped", [])]), "__comma", [unescape("%27%29%2C")])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("fn: ", "__comma", [smalltalk.send(smalltalk.send(aMethod, "_fn", []), "_compiledSource", [])])]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%2C")]);smalltalk.send($rec, "_lf", []);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send("smalltalk.", "__comma", [smalltalk.send(self, "_classNameFor_", [aClass])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%29%3B")]);smalltalk.send($rec, "_lf", []);return smalltalk.send($rec, "_lf", []);})(aStream);
+smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_do_", [(function(each){var method=nil;
+(method=smalltalk.send(smalltalk.send(self, "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), aClass]));smalltalk.send(method, "_category_", [smalltalk.send(each, "_category", [])]);return smalltalk.send(aClass, "_addCompiledMethod_", [method]);})]);
+((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_recompile_", [smalltalk.send(aClass, "_class", [])]);})]));
 return self;},
-args: ["aMethod", "aClass", "aStream"],
-source: unescape('exportMethod%3A%20aMethod%20of%3A%20aClass%20on%3A%20aStream%0A%09aStream%20%0A%09%09nextPutAll%3A%20%27smalltalk.addMethod%28%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27unescape%28%27%27%27%2C%20aMethod%20selector%20asSelector%20escaped%2C%20%27%27%27%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27smalltalk.method%28%7B%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27selector%3A%20unescape%28%27%27%27%2C%20aMethod%20selector%20escaped%2C%20%27%27%27%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27fn%3A%20%27%2C%20aMethod%20fn%20compiledSource%3Blf%3B%0A%09%09nextPutAll%3A%20%27%7D%29%2C%27%3Blf%3B%0A%09%09nextPutAll%3A%20%27smalltalk.%27%2C%20%28self%20classNameFor%3A%20aClass%29%3B%0A%09%09nextPutAll%3A%20%27%29%3B%27%3Blf%3Blf'),
-messageSends: ["nextPutAll:", "lf", unescape("%2C"), "escaped", "asSelector", "selector", "compiledSource", "fn", "classNameFor:"],
+args: ["aClass"],
+source: unescape('recompile%3A%20aClass%0A%09aClass%20methodDictionary%20do%3A%20%5B%3Aeach%20%7C%7C%20method%20%7C%0A%09%09method%20%3A%3D%20self%20new%20load%3A%20each%20source%20forClass%3A%20aClass.%0A%09%09method%20category%3A%20each%20category.%0A%09%09aClass%20addCompiledMethod%3A%20method%5D.%0A%09aClass%20isMetaclass%20ifFalse%3A%20%5Bself%20recompile%3A%20aClass%20class%5D'),
+messageSends: ["do:", "methodDictionary", "load:forClass:", "new", "source", "category:", "category", "addCompiledMethod:", "ifFalse:", "isMetaclass", "recompile:", "class"],
 referencedClasses: []
 }),
-smalltalk.StrippedExporter);
+smalltalk.Compiler.klass);
 
+smalltalk.addMethod(
+unescape('_recompileAll'),
+smalltalk.method({
+selector: unescape('recompileAll'),
+category: 'compiling',
+fn: function (){
+var self=this;
+smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){return smalltalk.send(self, "_recompile_", [each]);})]);
+return self;},
+args: [],
+source: unescape('recompileAll%0A%09Smalltalk%20current%20classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09self%20recompile%3A%20each%5D'),
+messageSends: ["do:", "classes", "current", "recompile:"],
+referencedClasses: ["Smalltalk"]
+}),
+smalltalk.Compiler.klass);
 
 
diff --git a/amber/src/js/Examples.deploy.js b/amber/src/js/Examples.deploy.js
index 0ff4d9517a3..4d74915c553 100644
--- a/amber/src/js/Examples.deploy.js
+++ b/amber/src/js/Examples.deploy.js
@@ -1,24 +1,24 @@
 smalltalk.addPackage('Examples', {});
 smalltalk.addClass('Counter', smalltalk.Widget, ['count', 'header'], 'Examples');
 smalltalk.addMethod(
-unescape('_increase'),
+unescape('_decrease'),
 smalltalk.method({
-selector: unescape('increase'),
+selector: unescape('decrease'),
 fn: function (){
 var self=this;
-(self['@count']=((($receiver = self['@count']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
+(self['@count']=((($receiver = self['@count']).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])));
 smalltalk.send(self['@header'], "_contents_", [(function(html){return smalltalk.send(html, "_with_", [smalltalk.send(self['@count'], "_asString", [])]);})]);
 return self;}
 }),
 smalltalk.Counter);
 
 smalltalk.addMethod(
-unescape('_decrease'),
+unescape('_increase'),
 smalltalk.method({
-selector: unescape('decrease'),
+selector: unescape('increase'),
 fn: function (){
 var self=this;
-(self['@count']=((($receiver = self['@count']).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])));
+(self['@count']=((($receiver = self['@count']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
 smalltalk.send(self['@header'], "_contents_", [(function(html){return smalltalk.send(html, "_with_", [smalltalk.send(self['@count'], "_asString", [])]);})]);
 return self;}
 }),
diff --git a/amber/src/js/Examples.js b/amber/src/js/Examples.js
index 71195d05907..248b1ef7681 100755
--- a/amber/src/js/Examples.js
+++ b/amber/src/js/Examples.js
@@ -1,35 +1,35 @@
 smalltalk.addPackage('Examples', {});
 smalltalk.addClass('Counter', smalltalk.Widget, ['count', 'header'], 'Examples');
 smalltalk.addMethod(
-unescape('_increase'),
+unescape('_decrease'),
 smalltalk.method({
-selector: unescape('increase'),
+selector: unescape('decrease'),
 category: 'actions',
 fn: function (){
 var self=this;
-(self['@count']=((($receiver = self['@count']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
+(self['@count']=((($receiver = self['@count']).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])));
 smalltalk.send(self['@header'], "_contents_", [(function(html){return smalltalk.send(html, "_with_", [smalltalk.send(self['@count'], "_asString", [])]);})]);
 return self;},
 args: [],
-source: unescape('increase%0A%20%20%20%20count%20%3A%3D%20count%20+%201.%0A%20%20%20%20header%20contents%3A%20%5B%3Ahtml%20%7C%20html%20with%3A%20count%20asString%5D'),
-messageSends: [unescape("+"), "contents:", "with:", "asString"],
+source: unescape('decrease%0A%20%20%20%20count%20%3A%3D%20count%20-%201.%0A%20%20%20%20header%20contents%3A%20%5B%3Ahtml%20%7C%20html%20with%3A%20count%20asString%5D'),
+messageSends: [unescape("-"), "contents:", "with:", "asString"],
 referencedClasses: []
 }),
 smalltalk.Counter);
 
 smalltalk.addMethod(
-unescape('_decrease'),
+unescape('_increase'),
 smalltalk.method({
-selector: unescape('decrease'),
+selector: unescape('increase'),
 category: 'actions',
 fn: function (){
 var self=this;
-(self['@count']=((($receiver = self['@count']).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])));
+(self['@count']=((($receiver = self['@count']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
 smalltalk.send(self['@header'], "_contents_", [(function(html){return smalltalk.send(html, "_with_", [smalltalk.send(self['@count'], "_asString", [])]);})]);
 return self;},
 args: [],
-source: unescape('decrease%0A%20%20%20%20count%20%3A%3D%20count%20-%201.%0A%20%20%20%20header%20contents%3A%20%5B%3Ahtml%20%7C%20html%20with%3A%20count%20asString%5D'),
-messageSends: [unescape("-"), "contents:", "with:", "asString"],
+source: unescape('increase%0A%20%20%20%20count%20%3A%3D%20count%20+%201.%0A%20%20%20%20header%20contents%3A%20%5B%3Ahtml%20%7C%20html%20with%3A%20count%20asString%5D'),
+messageSends: [unescape("+"), "contents:", "with:", "asString"],
 referencedClasses: []
 }),
 smalltalk.Counter);
diff --git a/amber/src/js/IDE.deploy.js b/amber/src/js/IDE.deploy.js
index 05b7844ab49..ae299c8545a 100644
--- a/amber/src/js/IDE.deploy.js
+++ b/amber/src/js/IDE.deploy.js
@@ -1,219 +1,201 @@
 smalltalk.addPackage('IDE', {});
-smalltalk.addClass('TabManager', smalltalk.Widget, ['selectedTab', 'tabs', 'opened', 'ul', 'input'], 'IDE');
+smalltalk.addClass('ClassesList', smalltalk.Widget, ['browser', 'ul', 'nodes'], 'IDE');
 smalltalk.addMethod(
-unescape('_tabs'),
+unescape('_browser'),
 smalltalk.method({
-selector: unescape('tabs'),
+selector: unescape('browser'),
 fn: function (){
 var self=this;
-return (($receiver = self['@tabs']) == nil || $receiver == undefined) ? (function(){return (self['@tabs']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return self['@browser'];
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_labelFor_'),
+unescape('_browser_'),
 smalltalk.method({
-selector: unescape('labelFor%3A'),
-fn: function (aWidget){
+selector: unescape('browser%3A'),
+fn: function (aBrowser){
 var self=this;
-var label=nil;
-var maxSize=nil;
-(maxSize=(15));
-(label=smalltalk.send(smalltalk.send(aWidget, "_label", []), "_copyFrom_to_", [(0), smalltalk.send(smalltalk.send(smalltalk.send(aWidget, "_label", []), "_size", []), "_min_", [maxSize])]));
-((($receiver = ((($receiver = smalltalk.send(smalltalk.send(aWidget, "_label", []), "_size", [])).klass === smalltalk.Number) ? $receiver >maxSize : smalltalk.send($receiver, "__gt", [maxSize]))).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (label=smalltalk.send(label, "__comma", ["..."]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (label=smalltalk.send(label, "__comma", ["..."]));})]));
-return label;
+(self['@browser']=aBrowser);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_updateBodyMargin'),
+unescape('_category'),
 smalltalk.method({
-selector: unescape('updateBodyMargin'),
+selector: unescape('category'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_setBodyMargin_", [smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_height", [])]);
+return smalltalk.send(smalltalk.send(self, "_browser", []), "_selectedPackage", []);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_updatePosition'),
+unescape('_getNodes'),
 smalltalk.method({
-selector: unescape('updatePosition'),
+selector: unescape('getNodes'),
 fn: function (){
 var self=this;
-jQuery('#jtalk').css('top', '').css('bottom', '0px');
+var classes=nil;
+var children=nil;
+var others=nil;
+(classes=smalltalk.send(smalltalk.send(self, "_browser", []), "_classes", []));
+(children=[]);
+(others=[]);
+smalltalk.send(classes, "_do_", [(function(each){return ((($receiver = smalltalk.send(classes, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
+return smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassesListNode || ClassesListNode), "_on_browser_classes_level_", [each, smalltalk.send(self, "_browser", []), others, (0)]);})]);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_removeBodyMargin'),
+unescape('_nodes'),
 smalltalk.method({
-selector: unescape('removeBodyMargin'),
+selector: unescape('nodes'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_setBodyMargin_", [(0)]);
-return self;}
-}),
-smalltalk.TabManager);
-
-smalltalk.addMethod(
-unescape('_setBodyMargin_'),
-smalltalk.method({
-selector: unescape('setBodyMargin%3A'),
-fn: function (anInteger){
-var self=this;
-smalltalk.send(smalltalk.send(".jtalkBody", "_asJQuery", []), "_css_put_", [unescape("margin-bottom"), smalltalk.send(smalltalk.send(anInteger, "_asString", []), "__comma", ["px"])]);
+(($receiver = self['@nodes']) == nil || $receiver == undefined) ? (function(){return (self['@nodes']=smalltalk.send(self, "_getNodes", []));})() : $receiver;
+return self['@nodes'];
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_onResize_'),
+unescape('_renderOn_'),
 smalltalk.method({
-selector: unescape('onResize%3A'),
-fn: function (aBlock){
+selector: unescape('renderOn%3A'),
+fn: function (html){
 var self=this;
-jQuery('#jtalk').resizable({
-	handles: 'n', 
-	resize: aBlock,
-	minHeight: 230
-});
+(self['@ul']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column browser classes"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_ul", [])));
+smalltalk.send(self, "_updateNodes", []);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_onWindowResize_'),
+unescape('_resetNodes'),
 smalltalk.method({
-selector: unescape('onWindowResize%3A'),
-fn: function (aBlock){
+selector: unescape('resetNodes'),
+fn: function (){
 var self=this;
-jQuery(window).resize(aBlock);
+(self['@nodes']=nil);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_updateNodes'),
 smalltalk.method({
-selector: unescape('open'),
+selector: unescape('updateNodes'),
 fn: function (){
 var self=this;
-((($receiver = self['@opened']).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_show", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_show", []);smalltalk.send(self, "_updateBodyMargin", []);smalltalk.send(self['@selectedTab'], "_show", []);return (self['@opened']=true);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_show", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_show", []);smalltalk.send(self, "_updateBodyMargin", []);smalltalk.send(self['@selectedTab'], "_show", []);return (self['@opened']=true);})]));
+smalltalk.send(self['@ul'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_nodes", []), "_do_", [(function(each){return smalltalk.send(each, "_renderOn_", [html]);})]);})]);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
+
 
 smalltalk.addMethod(
-unescape('_close'),
+unescape('_on_'),
 smalltalk.method({
-selector: unescape('close'),
-fn: function (){
+selector: unescape('on%3A'),
+fn: function (aBrowser){
 var self=this;
-((($receiver = self['@opened']).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_hide", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_hide", []);smalltalk.send(self['@selectedTab'], "_hide", []);smalltalk.send(self, "_removeBodyMargin", []);smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["jtalkBody"]);return (self['@opened']=false);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_hide", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_hide", []);smalltalk.send(self['@selectedTab'], "_hide", []);smalltalk.send(self, "_removeBodyMargin", []);smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["jtalkBody"]);return (self['@opened']=false);})]));
+return (function($rec){smalltalk.send($rec, "_browser_", [aBrowser]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList.klass);
 
+
+smalltalk.addClass('ClassesListNode', smalltalk.Widget, ['browser', 'theClass', 'level', 'nodes'], 'IDE');
 smalltalk.addMethod(
-unescape('_newBrowserTab'),
+unescape('_browser'),
 smalltalk.method({
-selector: unescape('newBrowserTab'),
+selector: unescape('browser'),
 fn: function (){
 var self=this;
-smalltalk.send((smalltalk.Browser || Browser), "_open", []);
+return self['@browser'];
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_selectTab_'),
+unescape('_browser_'),
 smalltalk.method({
-selector: unescape('selectTab%3A'),
-fn: function (aWidget){
+selector: unescape('browser%3A'),
+fn: function (aBrowser){
 var self=this;
-smalltalk.send(self, "_open", []);
-(self['@selectedTab']=aWidget);
-smalltalk.send(smalltalk.send(self, "_tabs", []), "_do_", [(function(each){return smalltalk.send(each, "_hide", []);})]);
-smalltalk.send(aWidget, "_show", []);
-smalltalk.send(self, "_update", []);
+(self['@browser']=aBrowser);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_closeTab_'),
+unescape('_getNodesFrom_'),
 smalltalk.method({
-selector: unescape('closeTab%3A'),
-fn: function (aWidget){
+selector: unescape('getNodesFrom%3A'),
+fn: function (aCollection){
 var self=this;
-smalltalk.send(self, "_removeTab_", [aWidget]);
-smalltalk.send(self, "_selectTab_", [smalltalk.send(smalltalk.send(self, "_tabs", []), "_last", [])]);
-smalltalk.send(aWidget, "_remove", []);
-smalltalk.send(self, "_update", []);
+var children=nil;
+var others=nil;
+(children=[]);
+(others=[]);
+smalltalk.send(aCollection, "_do_", [(function(each){return ((($receiver = smalltalk.send(smalltalk.send(each, "_superclass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
+(self['@nodes']=smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassesListNode || ClassesListNode), "_on_browser_classes_level_", [each, smalltalk.send(self, "_browser", []), others, ((($receiver = smalltalk.send(self, "_level", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})]));
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_search_'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('search%3A'),
-fn: function (aString){
+selector: unescape('label'),
+fn: function (){
 var self=this;
-var searchedClass=nil;
-(searchedClass=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [aString]));
-((($receiver = smalltalk.send(searchedClass, "_isClass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [searchedClass]);})() : (function(){return smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [searchedClass]);}), (function(){return smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);})]));
+var str=nil;
+(str=smalltalk.send(smalltalk.send((smalltalk.String || String), "_new", []), "_writeStream", []));
+smalltalk.send(smalltalk.send(self, "_level", []), "_timesRepeat_", [(function(){return smalltalk.send(str, "_nextPutAll_", [unescape("%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B")]);})]);
+smalltalk.send(str, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_theClass", []), "_name", [])]);
+return smalltalk.send(str, "_contents", []);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_addTab_'),
+unescape('_level'),
 smalltalk.method({
-selector: unescape('addTab%3A'),
-fn: function (aWidget){
+selector: unescape('level'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_tabs", []), "_add_", [aWidget]);
-smalltalk.send(aWidget, "_appendToJQuery_", [smalltalk.send(unescape("%23jtalk"), "_asJQuery", [])]);
-smalltalk.send(aWidget, "_hide", []);
+return self['@level'];
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_removeTab_'),
+unescape('_level_'),
 smalltalk.method({
-selector: unescape('removeTab%3A'),
-fn: function (aWidget){
+selector: unescape('level%3A'),
+fn: function (anInteger){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_tabs", []), "_remove_", [aWidget]);
-smalltalk.send(self, "_update", []);
+(self['@level']=anInteger);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_nodes'),
 smalltalk.method({
-selector: unescape('initialize'),
+selector: unescape('nodes'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Widget);
-(self['@opened']=true);
-smalltalk.send((function(html){return smalltalk.send(smalltalk.send(html, "_div", []), "_id_", ["jtalk"]);}), "_appendToJQuery_", [smalltalk.send("body", "_asJQuery", [])]);
-smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);
-smalltalk.send(self, "_appendToJQuery_", [smalltalk.send(unescape("%23jtalk"), "_asJQuery", [])]);
-(function($rec){smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.IDETranscript || IDETranscript), "_current", [])]);smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.Workspace || Workspace), "_new", [])]);return smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.TestRunner || TestRunner), "_new", [])]);})(self);
-smalltalk.send(self, "_selectTab_", [smalltalk.send(smalltalk.send(self, "_tabs", []), "_last", [])]);
-(function($rec){smalltalk.send($rec, "_onResize_", [(function(){return (function($rec){smalltalk.send($rec, "_updateBodyMargin", []);return smalltalk.send($rec, "_updatePosition", []);})(self);})]);return smalltalk.send($rec, "_onWindowResize_", [(function(){return smalltalk.send(self, "_updatePosition", []);})]);})(self);
+return self['@nodes'];
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
 unescape('_renderOn_'),
@@ -221,264 +203,311 @@ smalltalk.method({
 selector: unescape('renderOn%3A'),
 fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(html, "_div", []), "_id_", ["logo"]);
-smalltalk.send(self, "_renderToolbarOn_", [html]);
-(self['@ul']=(function($rec){smalltalk.send($rec, "_id_", ["jtalkTabs"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_ul", [])));
-smalltalk.send(self, "_renderTabs", []);
+var li=nil;
+var cssClass=nil;
+(cssClass="");
+(li=smalltalk.send(smalltalk.send(html, "_li", []), "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_browser", []), "_selectClass_", [smalltalk.send(self, "_theClass", [])]);})]));
+smalltalk.send(smalltalk.send(li, "_asJQuery", []), "_html_", [smalltalk.send(self, "_label", [])]);
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_browser", []), "_selectedClass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" selected"]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" selected"]));})]));
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_theClass", []), "_comment", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" commented"]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" commented"]));})]));
+smalltalk.send(li, "_class_", [cssClass]);
+smalltalk.send(smalltalk.send(self, "_nodes", []), "_do_", [(function(each){return smalltalk.send(each, "_renderOn_", [html]);})]);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_renderTabFor_on_'),
+unescape('_theClass'),
 smalltalk.method({
-selector: unescape('renderTabFor%3Aon%3A'),
-fn: function (aWidget, html){
+selector: unescape('theClass'),
+fn: function (){
 var self=this;
-var li=nil;
-(li=smalltalk.send(html, "_li", []));
-((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [aWidget])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));
-(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", [(function(){((($receiver = smalltalk.send(aWidget, "_canBeClosed", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})]));return smalltalk.send(smalltalk.send(html, "_span", []), "_with_", [smalltalk.send(self, "_labelFor_", [aWidget])]);})]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [aWidget]);})]);})(li);
+return self['@theClass'];
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_renderTabs'),
+unescape('_theClass_'),
 smalltalk.method({
-selector: unescape('renderTabs'),
-fn: function (){
+selector: unescape('theClass%3A'),
+fn: function (aClass){
 var self=this;
-smalltalk.send(self['@ul'], "_contents_", [(function(html){smalltalk.send(smalltalk.send(self, "_tabs", []), "_do_", [(function(each){return smalltalk.send(self, "_renderTabFor_on_", [each, html]);})]);return (function($rec){smalltalk.send($rec, "_class_", ["newtab"]);smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", [unescape("%20+%20")]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_newBrowserTab", []);})]);})(smalltalk.send(html, "_li", []));})]);
+(self['@theClass']=aClass);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
+
 
 smalltalk.addMethod(
-unescape('_renderToolbarOn_'),
+unescape('_on_browser_classes_level_'),
 smalltalk.method({
-selector: unescape('renderToolbarOn%3A'),
-fn: function (html){
+selector: unescape('on%3Abrowser%3Aclasses%3Alevel%3A'),
+fn: function (aClass, aBrowser, aCollection, anInteger){
 var self=this;
-(function($rec){smalltalk.send($rec, "_id_", ["jt_toolbar"]);return smalltalk.send($rec, "_with_", [(function(){(self['@input']=(function($rec){smalltalk.send($rec, "_class_", ["implementors"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_input", [])));smalltalk.send(self['@input'], "_onKeyPress_", [(function(event){return ((($receiver = smalltalk.send(smalltalk.send(event, "_keyCode", []), "__eq", [(13)])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);})]));})]);return (function($rec){smalltalk.send($rec, "_id_", ["jt_close"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_close", []);})]);})(smalltalk.send(html, "_div", []));})]);})(smalltalk.send(html, "_div", []));
+return (function($rec){smalltalk.send($rec, "_theClass_", [aClass]);smalltalk.send($rec, "_browser_", [aBrowser]);smalltalk.send($rec, "_level_", [anInteger]);smalltalk.send($rec, "_getNodesFrom_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode.klass);
+
 
+smalltalk.addClass('DebugErrorHandler', smalltalk.ErrorHandler, [], 'IDE');
 smalltalk.addMethod(
-unescape('_update'),
+unescape('_handleError_'),
 smalltalk.method({
-selector: unescape('update'),
-fn: function (){
+selector: unescape('handleError%3A'),
+fn: function (anError){
 var self=this;
-smalltalk.send(self, "_renderTabs", []);
+smalltalk.send((function(){return (function($rec){smalltalk.send($rec, "_error_", [anError]);return smalltalk.send($rec, "_open", []);})(smalltalk.send((smalltalk.Debugger || Debugger), "_new", []));}), "_on_do_", [(smalltalk.Error || Error), (function(error){return smalltalk.send(smalltalk.send((smalltalk.ErrorHandler || ErrorHandler), "_new", []), "_handleError_", [error]);})]);
 return self;}
 }),
-smalltalk.TabManager);
+smalltalk.DebugErrorHandler);
 
 
-smalltalk.TabManager.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_current'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('current'),
+selector: unescape('initialize'),
 fn: function (){
 var self=this;
-return (($receiver = self['@current']) == nil || $receiver == undefined) ? (function(){return (self['@current']=smalltalk.send(self, "_new", [], smalltalk.Widget.klass));})() : $receiver;
+smalltalk.send(self, "_register", []);
 return self;}
 }),
-smalltalk.TabManager.klass);
+smalltalk.DebugErrorHandler.klass);
+
 
+smalltalk.addClass('SourceArea', smalltalk.Widget, ['editor', 'div', 'receiver', 'onDoIt'], 'IDE');
 smalltalk.addMethod(
-unescape('_new'),
+unescape('_clear'),
 smalltalk.method({
-selector: unescape('new'),
+selector: unescape('clear'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+smalltalk.send(self, "_val_", [""]);
 return self;}
 }),
-smalltalk.TabManager.klass);
-
+smalltalk.SourceArea);
 
-smalltalk.addClass('TabWidget', smalltalk.Widget, ['div'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_currentLine'),
 smalltalk.method({
-selector: unescape('label'),
+selector: unescape('currentLine'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
+return smalltalk.send(self['@editor'], "_getLine_", [smalltalk.send(smalltalk.send(self['@editor'], "_getCursor", []), "_line", [])]);
 return self;}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_currentLineOrSelection'),
 smalltalk.method({
-selector: unescape('open'),
+selector: unescape('currentLineOrSelection'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_addTab_", [self]);
-smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_selectTab_", [self]);
+return ((($receiver = smalltalk.send(self['@editor'], "_somethingSelected", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_currentLine", []);})() : (function(){return smalltalk.send(self, "_selection", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_currentLine", []);}), (function(){return smalltalk.send(self, "_selection", []);})]));
 return self;}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_show'),
+unescape('_doIt'),
 smalltalk.method({
-selector: unescape('show'),
+selector: unescape('doIt'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_show", []);
+var result=nil;
+(result=smalltalk.send(self, "_eval_", [smalltalk.send(self, "_currentLineOrSelection", [])]));
+(($receiver = smalltalk.send(self, "_onDoIt", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(smalltalk.send(self, "_onDoIt", []), "_value", []);})() : nil;
+return result;
 return self;}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_hide'),
+unescape('_editor'),
 smalltalk.method({
-selector: unescape('hide'),
+selector: unescape('editor'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_hide", []);
+return self['@editor'];
 return self;}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_remove'),
+unescape('_eval_'),
 smalltalk.method({
-selector: unescape('remove'),
-fn: function (){
+selector: unescape('eval%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_remove", []);
-return self;}
+try{var compiler=nil;
+(compiler=smalltalk.send((smalltalk.Compiler || Compiler), "_new", []));
+smalltalk.send((function(){return smalltalk.send(compiler, "_parseExpression_", [aString]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return (function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(ex, "_messageText", [])])}})})();})]);
+(function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send(smalltalk.send(smalltalk.send(compiler, "_load_forClass_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")]), (smalltalk.DoIt || DoIt)]), "_fn", []), "_applyTo_arguments_", [smalltalk.send(self, "_receiver", []), []])}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_eval_'){return e.fn()} throw(e)}}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_close'),
+unescape('_fileIn'),
 smalltalk.method({
-selector: unescape('close'),
+selector: unescape('fileIn'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_closeTab_", [self]);
+smalltalk.send(smalltalk.send((smalltalk.Importer || Importer), "_new", []), "_import_", [smalltalk.send(smalltalk.send(self, "_currentLineOrSelection", []), "_readStream", [])]);
 return self;}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_renderOn_'),
+unescape('_handleKeyDown_'),
 smalltalk.method({
-selector: unescape('renderOn%3A'),
-fn: function (html){
+selector: unescape('handleKeyDown%3A'),
+fn: function (anEvent){
 var self=this;
-(self['@div']=(function($rec){smalltalk.send($rec, "_class_", ["jtalkTool"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_div", [])));
-smalltalk.send(self, "_renderTab", []);
+if(anEvent.ctrlKey) {
+		if(anEvent.keyCode === 80) { //ctrl+p
+			self._printIt();
+			anEvent.preventDefault();
+			return false;
+		}
+		if(anEvent.keyCode === 68) { //ctrl+d
+			self._doIt();
+			anEvent.preventDefault();
+			return false;
+		}
+		if(anEvent.keyCode === 73) { //ctrl+i
+			self._inspectIt();
+			anEvent.preventDefault();
+			return false;
+		}
+	};
 return self;}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_renderBoxOn_'),
+unescape('_inspectIt'),
 smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-fn: function (html){
+selector: unescape('inspectIt'),
+fn: function (){
 var self=this;
-
+smalltalk.send(smalltalk.send(self, "_doIt", []), "_inspect", []);
 return self;}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
+unescape('_onDoIt'),
 smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
-fn: function (html){
+selector: unescape('onDoIt'),
+fn: function (){
 var self=this;
-
+return self['@onDoIt'];
 return self;}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_update'),
+unescape('_onDoIt_'),
 smalltalk.method({
-selector: unescape('update'),
-fn: function (){
+selector: unescape('onDoIt%3A'),
+fn: function (aBlock){
 var self=this;
-smalltalk.send(self, "_renderTab", []);
+(self['@onDoIt']=aBlock);
 return self;}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_renderTab'),
+unescape('_onKeyDown_'),
 smalltalk.method({
-selector: unescape('renderTab'),
-fn: function (){
+selector: unescape('onKeyDown%3A'),
+fn: function (aBlock){
 var self=this;
-smalltalk.send(self['@div'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["jt_box"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderBoxOn_", [html]);})]);})(smalltalk.send(html, "_div", []));return (function($rec){smalltalk.send($rec, "_class_", ["jt_buttons"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderButtonsOn_", [html]);})]);})(smalltalk.send(html, "_div", []));})]);
+smalltalk.send(self['@div'], "_onKeyDown_", [aBlock]);
 return self;}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_canBeClosed'),
+unescape('_onKeyUp_'),
 smalltalk.method({
-selector: unescape('canBeClosed'),
-fn: function (){
+selector: unescape('onKeyUp%3A'),
+fn: function (aBlock){
 var self=this;
-return false;
+smalltalk.send(self['@div'], "_onKeyUp_", [aBlock]);
 return self;}
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
+smalltalk.addMethod(
+unescape('_print_'),
+smalltalk.method({
+selector: unescape('print%3A'),
+fn: function (aString){
+var self=this;
+var start=nil;
+var stop=nil;
+(start=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
+(stop=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
+smalltalk.send(start, "_at_put_", ["line", smalltalk.send(smalltalk.send(self['@editor'], "_getCursor_", [false]), "_line", [])]);
+smalltalk.send(start, "_at_put_", ["ch", smalltalk.send(smalltalk.send(self['@editor'], "_getCursor_", [false]), "_ch", [])]);
+smalltalk.send(stop, "_at_put_", ["line", smalltalk.send(start, "_at_", ["line"])]);
+smalltalk.send(stop, "_at_put_", ["ch", ((($receiver = ((($receiver = smalltalk.send(start, "_at_", ["ch"])).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])]))).klass === smalltalk.Number) ? $receiver +(2) : smalltalk.send($receiver, "__plus", [(2)]))]);
+smalltalk.send(self['@editor'], "_replaceSelection_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self['@editor'], "_getSelection", []), "__comma", [" "]), "__comma", [aString]), "__comma", [" "])]);
+smalltalk.send(self['@editor'], "_setCursor_", [smalltalk.send(self['@editor'], "_getCursor_", [true])]);
+smalltalk.send(self['@editor'], "_setSelection_end_", [stop, start]);
+return self;}
+}),
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_printIt'),
 smalltalk.method({
-selector: unescape('open'),
+selector: unescape('printIt'),
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_new", []), "_open", []);
+smalltalk.send(self, "_print_", [smalltalk.send(smalltalk.send(self, "_doIt", []), "_printString", [])]);
 return self;}
 }),
-smalltalk.TabWidget.klass);
-
+smalltalk.SourceArea);
 
-smalltalk.addClass('SourceArea', smalltalk.Widget, ['editor', 'div', 'receiver', 'onDoIt'], 'IDE');
 smalltalk.addMethod(
-unescape('_val'),
+unescape('_receiver'),
 smalltalk.method({
-selector: unescape('val'),
+selector: unescape('receiver'),
 fn: function (){
 var self=this;
-return smalltalk.send(self['@editor'], "_getValue", []);
+return (($receiver = self['@receiver']) == nil || $receiver == undefined) ? (function(){return smalltalk.send((smalltalk.DoIt || DoIt), "_new", []);})() : $receiver;
 return self;}
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_val_'),
+unescape('_receiver_'),
 smalltalk.method({
-selector: unescape('val%3A'),
-fn: function (aString){
+selector: unescape('receiver%3A'),
+fn: function (anObject){
 var self=this;
-smalltalk.send(self['@editor'], "_setValue_", [aString]);
+(self['@receiver']=anObject);
 return self;}
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_currentLine'),
+unescape('_renderOn_'),
 smalltalk.method({
-selector: unescape('currentLine'),
-fn: function (){
+selector: unescape('renderOn%3A'),
+fn: function (html){
 var self=this;
-return smalltalk.send(self['@editor'], "_getLine_", [smalltalk.send(smalltalk.send(self['@editor'], "_getCursor", []), "_line", [])]);
+var textarea=nil;
+(self['@div']=smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["source"]));
+smalltalk.send(self['@div'], "_with_", [(function(){return (textarea=smalltalk.send(html, "_textarea", []));})]);
+smalltalk.send(self, "_setEditorOn_", [smalltalk.send(textarea, "_element", [])]);
+smalltalk.send(self['@div'], "_onKeyDown_", [(function(e){return smalltalk.send(self, "_handleKeyDown_", [e]);})]);
 return self;}
 }),
 smalltalk.SourceArea);
@@ -506,34 +535,34 @@ return self;}
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_selectionStart'),
+unescape('_selectionEnd_'),
 smalltalk.method({
-selector: unescape('selectionStart'),
-fn: function (){
+selector: unescape('selectionEnd%3A'),
+fn: function (anInteger){
 var self=this;
-return smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionStart", []);
+smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionEnd_", [anInteger]);
 return self;}
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_selectionStart_'),
+unescape('_selectionStart'),
 smalltalk.method({
-selector: unescape('selectionStart%3A'),
-fn: function (anInteger){
+selector: unescape('selectionStart'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionStart_", [anInteger]);
+return smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionStart", []);
 return self;}
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_selectionEnd_'),
+unescape('_selectionStart_'),
 smalltalk.method({
-selector: unescape('selectionEnd%3A'),
+selector: unescape('selectionStart%3A'),
 fn: function (anInteger){
 var self=this;
-smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionEnd_", [anInteger]);
+smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionStart_", [anInteger]);
 return self;}
 }),
 smalltalk.SourceArea);
@@ -556,731 +585,800 @@ return self;}
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_editor'),
+unescape('_val'),
 smalltalk.method({
-selector: unescape('editor'),
+selector: unescape('val'),
 fn: function (){
 var self=this;
-return self['@editor'];
+return smalltalk.send(self['@editor'], "_getValue", []);
 return self;}
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_receiver'),
+unescape('_val_'),
 smalltalk.method({
-selector: unescape('receiver'),
-fn: function (){
+selector: unescape('val%3A'),
+fn: function (aString){
 var self=this;
-return (($receiver = self['@receiver']) == nil || $receiver == undefined) ? (function(){return smalltalk.send((smalltalk.DoIt || DoIt), "_new", []);})() : $receiver;
+smalltalk.send(self['@editor'], "_setValue_", [aString]);
 return self;}
 }),
 smalltalk.SourceArea);
 
+
+
+smalltalk.addClass('TabManager', smalltalk.Widget, ['selectedTab', 'tabs', 'opened', 'ul', 'input'], 'IDE');
 smalltalk.addMethod(
-unescape('_receiver_'),
+unescape('_addTab_'),
 smalltalk.method({
-selector: unescape('receiver%3A'),
-fn: function (anObject){
+selector: unescape('addTab%3A'),
+fn: function (aWidget){
 var self=this;
-(self['@receiver']=anObject);
+smalltalk.send(smalltalk.send(self, "_tabs", []), "_add_", [aWidget]);
+smalltalk.send(aWidget, "_appendToJQuery_", [smalltalk.send(unescape("%23jtalk"), "_asJQuery", [])]);
+smalltalk.send(aWidget, "_hide", []);
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_onDoIt_'),
+unescape('_close'),
 smalltalk.method({
-selector: unescape('onDoIt%3A'),
-fn: function (aBlock){
+selector: unescape('close'),
+fn: function (){
 var self=this;
-(self['@onDoIt']=aBlock);
+((($receiver = self['@opened']).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_hide", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_hide", []);smalltalk.send(self['@selectedTab'], "_hide", []);smalltalk.send(self, "_removeBodyMargin", []);smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["jtalkBody"]);return (self['@opened']=false);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_hide", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_hide", []);smalltalk.send(self['@selectedTab'], "_hide", []);smalltalk.send(self, "_removeBodyMargin", []);smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["jtalkBody"]);return (self['@opened']=false);})]));
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_onDoIt'),
+unescape('_closeTab_'),
 smalltalk.method({
-selector: unescape('onDoIt'),
+selector: unescape('closeTab%3A'),
+fn: function (aWidget){
+var self=this;
+smalltalk.send(self, "_removeTab_", [aWidget]);
+smalltalk.send(self, "_selectTab_", [smalltalk.send(smalltalk.send(self, "_tabs", []), "_last", [])]);
+smalltalk.send(aWidget, "_remove", []);
+smalltalk.send(self, "_update", []);
+return self;}
+}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+unescape('_initialize'),
+smalltalk.method({
+selector: unescape('initialize'),
 fn: function (){
 var self=this;
-return self['@onDoIt'];
+smalltalk.send(self, "_initialize", [], smalltalk.Widget);
+(self['@opened']=true);
+smalltalk.send((function(html){return smalltalk.send(smalltalk.send(html, "_div", []), "_id_", ["jtalk"]);}), "_appendToJQuery_", [smalltalk.send("body", "_asJQuery", [])]);
+smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);
+smalltalk.send(self, "_appendToJQuery_", [smalltalk.send(unescape("%23jtalk"), "_asJQuery", [])]);
+(function($rec){smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.IDETranscript || IDETranscript), "_current", [])]);smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.Workspace || Workspace), "_new", [])]);return smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.TestRunner || TestRunner), "_new", [])]);})(self);
+smalltalk.send(self, "_selectTab_", [smalltalk.send(smalltalk.send(self, "_tabs", []), "_last", [])]);
+(function($rec){smalltalk.send($rec, "_onResize_", [(function(){return (function($rec){smalltalk.send($rec, "_updateBodyMargin", []);return smalltalk.send($rec, "_updatePosition", []);})(self);})]);return smalltalk.send($rec, "_onWindowResize_", [(function(){return smalltalk.send(self, "_updatePosition", []);})]);})(self);
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_currentLineOrSelection'),
+unescape('_labelFor_'),
 smalltalk.method({
-selector: unescape('currentLineOrSelection'),
+selector: unescape('labelFor%3A'),
+fn: function (aWidget){
+var self=this;
+var label=nil;
+var maxSize=nil;
+(maxSize=(15));
+(label=smalltalk.send(smalltalk.send(aWidget, "_label", []), "_copyFrom_to_", [(0), smalltalk.send(smalltalk.send(smalltalk.send(aWidget, "_label", []), "_size", []), "_min_", [maxSize])]));
+((($receiver = ((($receiver = smalltalk.send(smalltalk.send(aWidget, "_label", []), "_size", [])).klass === smalltalk.Number) ? $receiver >maxSize : smalltalk.send($receiver, "__gt", [maxSize]))).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (label=smalltalk.send(label, "__comma", ["..."]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (label=smalltalk.send(label, "__comma", ["..."]));})]));
+return label;
+return self;}
+}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+unescape('_newBrowserTab'),
+smalltalk.method({
+selector: unescape('newBrowserTab'),
 fn: function (){
 var self=this;
-return ((($receiver = smalltalk.send(self['@editor'], "_somethingSelected", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_currentLine", []);})() : (function(){return smalltalk.send(self, "_selection", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_currentLine", []);}), (function(){return smalltalk.send(self, "_selection", []);})]));
+smalltalk.send((smalltalk.Browser || Browser), "_open", []);
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_clear'),
+unescape('_onResize_'),
 smalltalk.method({
-selector: unescape('clear'),
+selector: unescape('onResize%3A'),
+fn: function (aBlock){
+var self=this;
+jQuery('#jtalk').resizable({
+	handles: 'n', 
+	resize: aBlock,
+	minHeight: 230
+});
+return self;}
+}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+unescape('_onWindowResize_'),
+smalltalk.method({
+selector: unescape('onWindowResize%3A'),
+fn: function (aBlock){
+var self=this;
+jQuery(window).resize(aBlock);
+return self;}
+}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+unescape('_open'),
+smalltalk.method({
+selector: unescape('open'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_val_", [""]);
+((($receiver = self['@opened']).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_show", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_show", []);smalltalk.send(self, "_updateBodyMargin", []);smalltalk.send(self['@selectedTab'], "_show", []);return (self['@opened']=true);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_show", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_show", []);smalltalk.send(self, "_updateBodyMargin", []);smalltalk.send(self['@selectedTab'], "_show", []);return (self['@opened']=true);})]));
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_doIt'),
+unescape('_removeBodyMargin'),
 smalltalk.method({
-selector: unescape('doIt'),
+selector: unescape('removeBodyMargin'),
 fn: function (){
 var self=this;
-var result=nil;
-(result=smalltalk.send(self, "_eval_", [smalltalk.send(self, "_currentLineOrSelection", [])]));
-(($receiver = smalltalk.send(self, "_onDoIt", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(smalltalk.send(self, "_onDoIt", []), "_value", []);})() : nil;
-return result;
+smalltalk.send(self, "_setBodyMargin_", [(0)]);
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_eval_'),
+unescape('_removeTab_'),
 smalltalk.method({
-selector: unescape('eval%3A'),
-fn: function (aString){
+selector: unescape('removeTab%3A'),
+fn: function (aWidget){
 var self=this;
-try{var compiler=nil;
-(compiler=smalltalk.send((smalltalk.Compiler || Compiler), "_new", []));
-smalltalk.send((function(){return smalltalk.send(compiler, "_parseExpression_", [aString]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return (function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(ex, "_messageText", [])])}})})();})]);
-(function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send(smalltalk.send(smalltalk.send(compiler, "_load_forClass_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")]), (smalltalk.DoIt || DoIt)]), "_fn", []), "_applyTo_arguments_", [smalltalk.send(self, "_receiver", []), []])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_eval_'){return e.fn()} throw(e)}}
+smalltalk.send(smalltalk.send(self, "_tabs", []), "_remove_", [aWidget]);
+smalltalk.send(self, "_update", []);
+return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_handleKeyDown_'),
+unescape('_renderOn_'),
 smalltalk.method({
-selector: unescape('handleKeyDown%3A'),
-fn: function (anEvent){
+selector: unescape('renderOn%3A'),
+fn: function (html){
 var self=this;
-if(anEvent.ctrlKey) {
-		if(anEvent.keyCode === 80) { //ctrl+p
-			self._printIt();
-			anEvent.preventDefault();
-			return false;
-		}
-		if(anEvent.keyCode === 68) { //ctrl+d
-			self._doIt();
-			anEvent.preventDefault();
-			return false;
-		}
-		if(anEvent.keyCode === 73) { //ctrl+i
-			self._inspectIt();
-			anEvent.preventDefault();
-			return false;
-		}
-	};
+smalltalk.send(smalltalk.send(html, "_div", []), "_id_", ["logo"]);
+smalltalk.send(self, "_renderToolbarOn_", [html]);
+(self['@ul']=(function($rec){smalltalk.send($rec, "_id_", ["jtalkTabs"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_ul", [])));
+smalltalk.send(self, "_renderTabs", []);
+return self;}
+}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+unescape('_renderTabFor_on_'),
+smalltalk.method({
+selector: unescape('renderTabFor%3Aon%3A'),
+fn: function (aWidget, html){
+var self=this;
+var li=nil;
+(li=smalltalk.send(html, "_li", []));
+((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [aWidget])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));
+(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", [(function(){((($receiver = smalltalk.send(aWidget, "_canBeClosed", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})]));return smalltalk.send(smalltalk.send(html, "_span", []), "_with_", [smalltalk.send(self, "_labelFor_", [aWidget])]);})]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [aWidget]);})]);})(li);
+return self;}
+}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+unescape('_renderTabs'),
+smalltalk.method({
+selector: unescape('renderTabs'),
+fn: function (){
+var self=this;
+smalltalk.send(self['@ul'], "_contents_", [(function(html){smalltalk.send(smalltalk.send(self, "_tabs", []), "_do_", [(function(each){return smalltalk.send(self, "_renderTabFor_on_", [each, html]);})]);return (function($rec){smalltalk.send($rec, "_class_", ["newtab"]);smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", [unescape("%20+%20")]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_newBrowserTab", []);})]);})(smalltalk.send(html, "_li", []));})]);
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_inspectIt'),
+unescape('_renderToolbarOn_'),
 smalltalk.method({
-selector: unescape('inspectIt'),
-fn: function (){
+selector: unescape('renderToolbarOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_doIt", []), "_inspect", []);
+(function($rec){smalltalk.send($rec, "_id_", ["jt_toolbar"]);return smalltalk.send($rec, "_with_", [(function(){(self['@input']=(function($rec){smalltalk.send($rec, "_class_", ["implementors"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_input", [])));smalltalk.send(self['@input'], "_onKeyPress_", [(function(event){return ((($receiver = smalltalk.send(smalltalk.send(event, "_keyCode", []), "__eq", [(13)])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);})]));})]);return (function($rec){smalltalk.send($rec, "_id_", ["jt_close"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_close", []);})]);})(smalltalk.send(html, "_div", []));})]);})(smalltalk.send(html, "_div", []));
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_print_'),
+unescape('_search_'),
 smalltalk.method({
-selector: unescape('print%3A'),
+selector: unescape('search%3A'),
 fn: function (aString){
 var self=this;
-var start=nil;
-var stop=nil;
-(start=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
-(stop=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
-smalltalk.send(start, "_at_put_", ["line", smalltalk.send(smalltalk.send(self['@editor'], "_getCursor_", [false]), "_line", [])]);
-smalltalk.send(start, "_at_put_", ["ch", smalltalk.send(smalltalk.send(self['@editor'], "_getCursor_", [false]), "_ch", [])]);
-smalltalk.send(stop, "_at_put_", ["line", smalltalk.send(start, "_at_", ["line"])]);
-smalltalk.send(stop, "_at_put_", ["ch", ((($receiver = ((($receiver = smalltalk.send(start, "_at_", ["ch"])).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])]))).klass === smalltalk.Number) ? $receiver +(2) : smalltalk.send($receiver, "__plus", [(2)]))]);
-smalltalk.send(self['@editor'], "_replaceSelection_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self['@editor'], "_getSelection", []), "__comma", [" "]), "__comma", [aString]), "__comma", [" "])]);
-smalltalk.send(self['@editor'], "_setCursor_", [smalltalk.send(self['@editor'], "_getCursor_", [true])]);
-smalltalk.send(self['@editor'], "_setSelection_end_", [stop, start]);
+var searchedClass=nil;
+(searchedClass=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [aString]));
+((($receiver = smalltalk.send(searchedClass, "_isClass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [searchedClass]);})() : (function(){return smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [searchedClass]);}), (function(){return smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);})]));
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_printIt'),
+unescape('_selectTab_'),
 smalltalk.method({
-selector: unescape('printIt'),
-fn: function (){
+selector: unescape('selectTab%3A'),
+fn: function (aWidget){
 var self=this;
-smalltalk.send(self, "_print_", [smalltalk.send(smalltalk.send(self, "_doIt", []), "_printString", [])]);
+smalltalk.send(self, "_open", []);
+(self['@selectedTab']=aWidget);
+smalltalk.send(smalltalk.send(self, "_tabs", []), "_do_", [(function(each){return smalltalk.send(each, "_hide", []);})]);
+smalltalk.send(aWidget, "_show", []);
+smalltalk.send(self, "_update", []);
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_fileIn'),
+unescape('_setBodyMargin_'),
 smalltalk.method({
-selector: unescape('fileIn'),
-fn: function (){
+selector: unescape('setBodyMargin%3A'),
+fn: function (anInteger){
 var self=this;
-smalltalk.send(smalltalk.send((smalltalk.Importer || Importer), "_new", []), "_import_", [smalltalk.send(smalltalk.send(self, "_currentLineOrSelection", []), "_readStream", [])]);
+smalltalk.send(smalltalk.send(".jtalkBody", "_asJQuery", []), "_css_put_", [unescape("margin-bottom"), smalltalk.send(smalltalk.send(anInteger, "_asString", []), "__comma", ["px"])]);
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_onKeyUp_'),
+unescape('_tabs'),
 smalltalk.method({
-selector: unescape('onKeyUp%3A'),
-fn: function (aBlock){
+selector: unescape('tabs'),
+fn: function (){
 var self=this;
-smalltalk.send(self['@div'], "_onKeyUp_", [aBlock]);
+return (($receiver = self['@tabs']) == nil || $receiver == undefined) ? (function(){return (self['@tabs']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_onKeyDown_'),
+unescape('_update'),
 smalltalk.method({
-selector: unescape('onKeyDown%3A'),
-fn: function (aBlock){
+selector: unescape('update'),
+fn: function (){
 var self=this;
-smalltalk.send(self['@div'], "_onKeyDown_", [aBlock]);
+smalltalk.send(self, "_renderTabs", []);
 return self;}
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_renderOn_'),
+unescape('_updateBodyMargin'),
 smalltalk.method({
-selector: unescape('renderOn%3A'),
-fn: function (html){
+selector: unescape('updateBodyMargin'),
+fn: function (){
 var self=this;
-var textarea=nil;
-(self['@div']=smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["source"]));
-smalltalk.send(self['@div'], "_with_", [(function(){return (textarea=smalltalk.send(html, "_textarea", []));})]);
-smalltalk.send(self, "_setEditorOn_", [smalltalk.send(textarea, "_element", [])]);
-smalltalk.send(self['@div'], "_onKeyDown_", [(function(e){return smalltalk.send(self, "_handleKeyDown_", [e]);})]);
+smalltalk.send(self, "_setBodyMargin_", [smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_height", [])]);
 return self;}
 }),
-smalltalk.SourceArea);
-
-
+smalltalk.TabManager);
 
-smalltalk.addClass('ClassesList', smalltalk.Widget, ['browser', 'ul', 'nodes'], 'IDE');
 smalltalk.addMethod(
-unescape('_category'),
+unescape('_updatePosition'),
 smalltalk.method({
-selector: unescape('category'),
+selector: unescape('updatePosition'),
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_browser", []), "_selectedPackage", []);
+jQuery('#jtalk').css('top', '').css('bottom', '0px');
 return self;}
 }),
-smalltalk.ClassesList);
+smalltalk.TabManager);
 
+
+smalltalk.TabManager.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_nodes'),
+unescape('_current'),
 smalltalk.method({
-selector: unescape('nodes'),
+selector: unescape('current'),
 fn: function (){
 var self=this;
-(($receiver = self['@nodes']) == nil || $receiver == undefined) ? (function(){return (self['@nodes']=smalltalk.send(self, "_getNodes", []));})() : $receiver;
-return self['@nodes'];
+return (($receiver = self['@current']) == nil || $receiver == undefined) ? (function(){return (self['@current']=smalltalk.send(self, "_new", [], smalltalk.Widget.klass));})() : $receiver;
 return self;}
 }),
-smalltalk.ClassesList);
+smalltalk.TabManager.klass);
 
 smalltalk.addMethod(
-unescape('_browser'),
+unescape('_new'),
 smalltalk.method({
-selector: unescape('browser'),
+selector: unescape('new'),
 fn: function (){
 var self=this;
-return self['@browser'];
+smalltalk.send(self, "_shouldNotImplement", []);
 return self;}
 }),
-smalltalk.ClassesList);
+smalltalk.TabManager.klass);
+
 
+smalltalk.addClass('TabWidget', smalltalk.Widget, ['div'], 'IDE');
 smalltalk.addMethod(
-unescape('_browser_'),
+unescape('_canBeClosed'),
 smalltalk.method({
-selector: unescape('browser%3A'),
-fn: function (aBrowser){
+selector: unescape('canBeClosed'),
+fn: function (){
 var self=this;
-(self['@browser']=aBrowser);
+return false;
 return self;}
 }),
-smalltalk.ClassesList);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_getNodes'),
+unescape('_close'),
 smalltalk.method({
-selector: unescape('getNodes'),
+selector: unescape('close'),
 fn: function (){
 var self=this;
-var classes=nil;
-var children=nil;
-var others=nil;
-(classes=smalltalk.send(smalltalk.send(self, "_browser", []), "_classes", []));
-(children=[]);
-(others=[]);
-smalltalk.send(classes, "_do_", [(function(each){return ((($receiver = smalltalk.send(classes, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
-return smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassesListNode || ClassesListNode), "_on_browser_classes_level_", [each, smalltalk.send(self, "_browser", []), others, (0)]);})]);
+smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_closeTab_", [self]);
 return self;}
 }),
-smalltalk.ClassesList);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_resetNodes'),
+unescape('_hide'),
 smalltalk.method({
-selector: unescape('resetNodes'),
+selector: unescape('hide'),
 fn: function (){
 var self=this;
-(self['@nodes']=nil);
+smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_hide", []);
 return self;}
 }),
-smalltalk.ClassesList);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_renderOn_'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('renderOn%3A'),
-fn: function (html){
+selector: unescape('label'),
+fn: function (){
 var self=this;
-(self['@ul']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column browser classes"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_ul", [])));
-smalltalk.send(self, "_updateNodes", []);
+smalltalk.send(self, "_subclassResponsibility", []);
 return self;}
 }),
-smalltalk.ClassesList);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_updateNodes'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('updateNodes'),
+selector: unescape('open'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@ul'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_nodes", []), "_do_", [(function(each){return smalltalk.send(each, "_renderOn_", [html]);})]);})]);
+smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_addTab_", [self]);
+smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_selectTab_", [self]);
 return self;}
 }),
-smalltalk.ClassesList);
-
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_on_'),
+unescape('_remove'),
 smalltalk.method({
-selector: unescape('on%3A'),
-fn: function (aBrowser){
+selector: unescape('remove'),
+fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_browser_", [aBrowser]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_remove", []);
 return self;}
 }),
-smalltalk.ClassesList.klass);
-
+smalltalk.TabWidget);
 
-smalltalk.addClass('ClassesListNode', smalltalk.Widget, ['browser', 'theClass', 'level', 'nodes'], 'IDE');
 smalltalk.addMethod(
-unescape('_renderOn_'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('renderOn%3A'),
+selector: unescape('renderBoxOn%3A'),
 fn: function (html){
 var self=this;
-var li=nil;
-var cssClass=nil;
-(cssClass="");
-(li=smalltalk.send(smalltalk.send(html, "_li", []), "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_browser", []), "_selectClass_", [smalltalk.send(self, "_theClass", [])]);})]));
-smalltalk.send(smalltalk.send(li, "_asJQuery", []), "_html_", [smalltalk.send(self, "_label", [])]);
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_browser", []), "_selectedClass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" selected"]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" selected"]));})]));
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_theClass", []), "_comment", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" commented"]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" commented"]));})]));
-smalltalk.send(li, "_class_", [cssClass]);
-smalltalk.send(smalltalk.send(self, "_nodes", []), "_do_", [(function(each){return smalltalk.send(each, "_renderOn_", [html]);})]);
+
 return self;}
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_nodes'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('nodes'),
-fn: function (){
+selector: unescape('renderButtonsOn%3A'),
+fn: function (html){
 var self=this;
-return self['@nodes'];
+
 return self;}
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_theClass'),
+unescape('_renderOn_'),
 smalltalk.method({
-selector: unescape('theClass'),
-fn: function (){
+selector: unescape('renderOn%3A'),
+fn: function (html){
 var self=this;
-return self['@theClass'];
+(self['@div']=(function($rec){smalltalk.send($rec, "_class_", ["jtalkTool"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_div", [])));
+smalltalk.send(self, "_renderTab", []);
 return self;}
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_theClass_'),
+unescape('_renderTab'),
 smalltalk.method({
-selector: unescape('theClass%3A'),
-fn: function (aClass){
+selector: unescape('renderTab'),
+fn: function (){
 var self=this;
-(self['@theClass']=aClass);
+smalltalk.send(self['@div'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["jt_box"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderBoxOn_", [html]);})]);})(smalltalk.send(html, "_div", []));return (function($rec){smalltalk.send($rec, "_class_", ["jt_buttons"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderButtonsOn_", [html]);})]);})(smalltalk.send(html, "_div", []));})]);
 return self;}
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_browser'),
+unescape('_show'),
 smalltalk.method({
-selector: unescape('browser'),
+selector: unescape('show'),
 fn: function (){
 var self=this;
-return self['@browser'];
+smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_show", []);
 return self;}
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_browser_'),
+unescape('_update'),
 smalltalk.method({
-selector: unescape('browser%3A'),
-fn: function (aBrowser){
+selector: unescape('update'),
+fn: function (){
 var self=this;
-(self['@browser']=aBrowser);
+smalltalk.send(self, "_renderTab", []);
 return self;}
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabWidget);
+
 
 smalltalk.addMethod(
-unescape('_level'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('level'),
+selector: unescape('open'),
 fn: function (){
 var self=this;
-return self['@level'];
+return smalltalk.send(smalltalk.send(self, "_new", []), "_open", []);
 return self;}
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabWidget.klass);
+
 
+smalltalk.addClass('Browser', smalltalk.TabWidget, ['selectedPackage', 'selectedClass', 'selectedProtocol', 'selectedMethod', 'packagesList', 'classesList', 'protocolsList', 'methodsList', 'sourceArea', 'tabsList', 'selectedTab', 'saveButton', 'classButtons', 'methodButtons', 'unsavedChanges'], 'IDE');
 smalltalk.addMethod(
-unescape('_level_'),
+unescape('_addInstanceVariableNamed_toClass_'),
 smalltalk.method({
-selector: unescape('level%3A'),
-fn: function (anInteger){
+selector: unescape('addInstanceVariableNamed%3AtoClass%3A'),
+fn: function (aString, aClass){
 var self=this;
-(self['@level']=anInteger);
+smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_addSubclassOf_named_instanceVariableNames_package_", [smalltalk.send(aClass, "_superclass", []), smalltalk.send(aClass, "_name", []), (function($rec){smalltalk.send($rec, "_add_", [aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_copy", [])), smalltalk.send(smalltalk.send(aClass, "_package", []), "_name", [])]);
 return self;}
 }),
-smalltalk.ClassesListNode);
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_addNewClass'),
 smalltalk.method({
-selector: unescape('label'),
+selector: unescape('addNewClass'),
 fn: function (){
 var self=this;
-var str=nil;
-(str=smalltalk.send(smalltalk.send((smalltalk.String || String), "_new", []), "_writeStream", []));
-smalltalk.send(smalltalk.send(self, "_level", []), "_timesRepeat_", [(function(){return smalltalk.send(str, "_nextPutAll_", [unescape("%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B")]);})]);
-smalltalk.send(str, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_theClass", []), "_name", [])]);
-return smalltalk.send(str, "_contents", []);
+var className=nil;
+(className=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["New class"]));
+((($receiver = smalltalk.send(smalltalk.send(className, "_notNil", []), "_and_", [(function(){return smalltalk.send(className, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send((smalltalk.Object || Object), "_subclass_instanceVariableNames_package_", [className, "", smalltalk.send(self, "_selectedPackage", [])]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send((smalltalk.Object || Object), "_subclass_instanceVariableNames_package_", [className, "", smalltalk.send(self, "_selectedPackage", [])]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})]));
 return self;}
 }),
-smalltalk.ClassesListNode);
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_getNodesFrom_'),
+unescape('_addNewProtocol'),
 smalltalk.method({
-selector: unescape('getNodesFrom%3A'),
-fn: function (aCollection){
+selector: unescape('addNewProtocol'),
+fn: function (){
 var self=this;
-var children=nil;
-var others=nil;
-(children=[]);
-(others=[]);
-smalltalk.send(aCollection, "_do_", [(function(each){return ((($receiver = smalltalk.send(smalltalk.send(each, "_superclass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
-(self['@nodes']=smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassesListNode || ClassesListNode), "_on_browser_classes_level_", [each, smalltalk.send(self, "_browser", []), others, ((($receiver = smalltalk.send(self, "_level", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})]));
+var newProtocol=nil;
+(newProtocol=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["New method protocol"]));
+((($receiver = smalltalk.send(smalltalk.send(newProtocol, "_notNil", []), "_and_", [(function(){return smalltalk.send(newProtocol, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self['@selectedMethod'], "_category_", [newProtocol]);return smalltalk.send(self, "_setMethodProtocol_", [newProtocol]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self['@selectedMethod'], "_category_", [newProtocol]);return smalltalk.send(self, "_setMethodProtocol_", [newProtocol]);})]));
 return self;}
 }),
-smalltalk.ClassesListNode);
-
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_on_browser_classes_level_'),
+unescape('_ajaxPutAt_data_'),
 smalltalk.method({
-selector: unescape('on%3Abrowser%3Aclasses%3Alevel%3A'),
-fn: function (aClass, aBrowser, aCollection, anInteger){
+selector: unescape('ajaxPutAt%3Adata%3A'),
+fn: function (anURL, aString){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_theClass_", [aClass]);smalltalk.send($rec, "_browser_", [aBrowser]);smalltalk.send($rec, "_level_", [anInteger]);smalltalk.send($rec, "_getNodesFrom_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_ajax_options_", [anURL, smalltalk.HashedCollection._fromPairs_([smalltalk.send("type", "__minus_gt", ["PUT"]),smalltalk.send("data", "__minus_gt", [aString]),smalltalk.send("contentType", "__minus_gt", [unescape("text/plain%3Bcharset%3DUTF-8")]),smalltalk.send("error", "__minus_gt", [(function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send("PUT request failed at:  ", "__comma", [anURL])]);})])])]);
 return self;}
 }),
-smalltalk.ClassesListNode.klass);
-
+smalltalk.Browser);
 
-smalltalk.addClass('DebugErrorHandler', smalltalk.ErrorHandler, [], 'IDE');
 smalltalk.addMethod(
-unescape('_handleError_'),
+unescape('_canBeClosed'),
 smalltalk.method({
-selector: unescape('handleError%3A'),
-fn: function (anError){
+selector: unescape('canBeClosed'),
+fn: function (){
 var self=this;
-smalltalk.send((function(){return (function($rec){smalltalk.send($rec, "_error_", [anError]);return smalltalk.send($rec, "_open", []);})(smalltalk.send((smalltalk.Debugger || Debugger), "_new", []));}), "_on_do_", [(smalltalk.Error || Error), (function(error){return smalltalk.send(smalltalk.send((smalltalk.ErrorHandler || ErrorHandler), "_new", []), "_handleError_", [error]);})]);
+return true;
 return self;}
 }),
-smalltalk.DebugErrorHandler);
-
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_cancelChanges'),
 smalltalk.method({
-selector: unescape('initialize'),
+selector: unescape('cancelChanges'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_register", []);
+return ((($receiver = self['@unsavedChanges']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [unescape("Cancel%20changes%3F")]);})() : (function(){return true;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [unescape("Cancel%20changes%3F")]);}), (function(){return true;})]));
 return self;}
 }),
-smalltalk.DebugErrorHandler.klass);
-
+smalltalk.Browser);
 
-smalltalk.addClass('Workspace', smalltalk.TabWidget, ['sourceArea'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_classCommentSource'),
 smalltalk.method({
-selector: unescape('label'),
+selector: unescape('classCommentSource'),
 fn: function (){
 var self=this;
-return "Workspace";
+return smalltalk.send(self['@selectedClass'], "_comment", []);
 return self;}
 }),
-smalltalk.Workspace);
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_clearWorkspace'),
+unescape('_classDeclarationSource'),
 smalltalk.method({
-selector: unescape('clearWorkspace'),
+selector: unescape('classDeclarationSource'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_clear", []);
-return self;}
+try{var stream=nil;
+(stream=smalltalk.send("", "_writeStream", []));
+(($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return (function(){throw({name: 'stReturn', selector: '_classDeclarationSource', fn: function(){return smalltalk.send(self, "_classDeclarationTemplate", [])}})})();})() : $receiver;
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@selectedClass'], "_superclass", []), "_asString", [])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%20subclass%3A%20%23")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@selectedClass'], "_name", [])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send((smalltalk.String || String), "_lf", []), "__comma", [smalltalk.send((smalltalk.String || String), "_tab", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("instanceVariableNames%3A%20%27")]);})(stream);
+smalltalk.send(smalltalk.send(self['@selectedClass'], "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(stream, "_nextPutAll_", [" "]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])]), "__comma", [smalltalk.send((smalltalk.String || String), "_tab", [])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("package%3A%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@selectedClass'], "_category", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%27")]);})(stream);
+(function(){throw({name: 'stReturn', selector: '_classDeclarationSource', fn: function(){return smalltalk.send(stream, "_contents", [])}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_classDeclarationSource'){return e.fn()} throw(e)}}
 }),
-smalltalk.Workspace);
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_doIt'),
+unescape('_classDeclarationTemplate'),
 smalltalk.method({
-selector: unescape('doIt'),
+selector: unescape('classDeclarationTemplate'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_doIt", []);
+return smalltalk.send(smalltalk.send(unescape("Object%20subclass%3A%20%23NameOfSubclass%0A%09instanceVariableNames%3A%20%27%27%0A%09package%3A%20%27"), "__comma", [smalltalk.send(self, "_selectedPackage", [])]), "__comma", [unescape("%27")]);
 return self;}
 }),
-smalltalk.Workspace);
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_printIt'),
+unescape('_classes'),
 smalltalk.method({
-selector: unescape('printIt'),
+selector: unescape('classes'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_printIt", []);
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(each, "_category", []), "__eq", [self['@selectedPackage']]);})]), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_name", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(b, "_name", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(b, "_name", [])]));})]), "_asSet", []);
 return self;}
 }),
-smalltalk.Workspace);
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_inspectIt'),
+unescape('_commitPackage'),
 smalltalk.method({
-selector: unescape('inspectIt'),
+selector: unescape('commitPackage'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_inspectIt", []);
+(($receiver = self['@selectedPackage']) != nil && $receiver != undefined) ? (function(){var package=nil;
+(package=smalltalk.send((smalltalk.Package || Package), "_named_", [self['@selectedPackage']]));return smalltalk.send([smalltalk.send((smalltalk.Exporter || Exporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathJs", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".js"])]),smalltalk.send((smalltalk.StrippedExporter || StrippedExporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathJs", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".deploy.js"])]),smalltalk.send((smalltalk.ChunkExporter || ChunkExporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathSt", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".st"])])], "_do_", [(function(commitStrategy){var fileContents=nil;
+(fileContents=smalltalk.send(smalltalk.send(smalltalk.send(commitStrategy, "_key", []), "_new", []), "_exportPackage_", [self['@selectedPackage']]));return smalltalk.send(self, "_ajaxPutAt_data_", [smalltalk.send(commitStrategy, "_value", []), fileContents]);})]);})() : nil;
 return self;}
 }),
-smalltalk.Workspace);
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_fileIn'),
+unescape('_compile'),
 smalltalk.method({
-selector: unescape('fileIn'),
+selector: unescape('compile'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_fileIn", []);
+smalltalk.send(self, "_disableSaveButton", []);
+((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_compileClassComment", []);})() : nil;})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_compileDefinition", []);})() : (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_compileDefinition", []);}), (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_compileClassComment", []);})() : nil;}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_compileDefinition", []);})() : (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_compileDefinition", []);}), (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})]));})]));
 return self;}
 }),
-smalltalk.Workspace);
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renderBoxOn_'),
+unescape('_compileClassComment'),
 smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-fn: function (html){
+selector: unescape('compileClassComment'),
+fn: function (){
 var self=this;
-(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));
-smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);
+smalltalk.send(self['@selectedClass'], "_comment_", [smalltalk.send(self['@sourceArea'], "_val", [])]);
 return self;}
 }),
-smalltalk.Workspace);
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
+unescape('_compileDefinition'),
 smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
-fn: function (html){
+selector: unescape('compileDefinition'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+d")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+p")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+i")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["FileIn"]);smalltalk.send($rec, "_title_", [unescape("ctrl+f")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_fileIn", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["Clear workspace"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_clearWorkspace", []);})]);})(smalltalk.send(html, "_button", []));
+var newClass=nil;
+(newClass=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [smalltalk.send(self['@sourceArea'], "_val", [])]));
+(function($rec){smalltalk.send($rec, "_resetClassesList", []);smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+smalltalk.send(self, "_selectClass_", [newClass]);
 return self;}
 }),
-smalltalk.Workspace);
-
-
+smalltalk.Browser);
 
-smalltalk.addClass('Browser', smalltalk.TabWidget, ['selectedPackage', 'selectedClass', 'selectedProtocol', 'selectedMethod', 'packagesList', 'classesList', 'protocolsList', 'methodsList', 'sourceArea', 'tabsList', 'selectedTab', 'saveButton', 'classButtons', 'methodButtons', 'unsavedChanges'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_compileMethodDefinition'),
 smalltalk.method({
-selector: unescape('label'),
+selector: unescape('compileMethodDefinition'),
 fn: function (){
 var self=this;
-return (($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return unescape("Browser%20%28nil%29");})() : (function(){return smalltalk.send("Browser: ", "__comma", [smalltalk.send(self['@selectedClass'], "_name", [])]);})();
+((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [self['@selectedClass']]);})() : (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [smalltalk.send(self['@selectedClass'], "_class", [])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [self['@selectedClass']]);}), (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [smalltalk.send(self['@selectedClass'], "_class", [])]);})]));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_packages'),
+unescape('_compileMethodDefinitionFor_'),
 smalltalk.method({
-selector: unescape('packages'),
-fn: function (){
+selector: unescape('compileMethodDefinitionFor%3A'),
+fn: function (aClass){
 var self=this;
-var packages=nil;
-(packages=smalltalk.send((smalltalk.Array || Array), "_new", []));
-smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(packages, "_includes_", [smalltalk.send(each, "_category", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})]));})]);
-return smalltalk.send(packages, "_sort", []);
-return self;}
+try{var compiler=nil;
+var method=nil;
+var source=nil;
+var node=nil;
+(source=smalltalk.send(self['@sourceArea'], "_val", []));
+(($receiver = self['@selectedProtocol']) == nil || $receiver == undefined) ? (function(){return (self['@selectedProtocol']=smalltalk.send(self['@selectedMethod'], "_category", []));})() : $receiver;
+(compiler=smalltalk.send((smalltalk.Compiler || Compiler), "_new", []));
+smalltalk.send(compiler, "_source_", [source]);
+(node=smalltalk.send(compiler, "_parse_", [source]));
+((($receiver = smalltalk.send(node, "_isParseFailure", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(smalltalk.send(smalltalk.send("PARSE ERROR: ", "__comma", [smalltalk.send(node, "_reason", [])]), "__comma", [unescape("%2C%20position%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(node, "_position", []), "_asString", [])])])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(smalltalk.send(smalltalk.send("PARSE ERROR: ", "__comma", [smalltalk.send(node, "_reason", [])]), "__comma", [unescape("%2C%20position%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(node, "_position", []), "_asString", [])])])}})})();})]));
+smalltalk.send(compiler, "_currentClass_", [aClass]);
+(method=smalltalk.send(compiler, "_eval_", [smalltalk.send(compiler, "_compileNode_", [node])]));
+smalltalk.send(method, "_category_", [self['@selectedProtocol']]);
+smalltalk.send(smalltalk.send(compiler, "_unknownVariables", []), "_do_", [(function(each){return (($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_at_", [each])) == nil || $receiver == undefined) ? (function(){return ((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send(unescape("Declare%20%27"), "__comma", [each]), "__comma", [unescape("%27%20as%20instance%20variable%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_addInstanceVariableNamed_toClass_", [each, aClass]);return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [aClass])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_addInstanceVariableNamed_toClass_", [each, aClass]);return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [aClass])}})})();})]));})() : $receiver;})]);
+smalltalk.send(aClass, "_addCompiledMethod_", [method]);
+smalltalk.send(compiler, "_setupClass_", [aClass]);
+smalltalk.send(self, "_updateMethodsList", []);
+smalltalk.send(self, "_selectMethod_", [method]);
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_compileMethodDefinitionFor_'){return e.fn()} throw(e)}}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_classes'),
+unescape('_copyClass'),
 smalltalk.method({
-selector: unescape('classes'),
+selector: unescape('copyClass'),
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(each, "_category", []), "__eq", [self['@selectedPackage']]);})]), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_name", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(b, "_name", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(b, "_name", [])]));})]), "_asSet", []);
+var className=nil;
+(className=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["Copy class"]));
+((($receiver = smalltalk.send(smalltalk.send(className, "_notNil", []), "_and_", [(function(){return smalltalk.send(className, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_copyClass_named_", [smalltalk.send(self, "_selectedClass", []), className]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_copyClass_named_", [smalltalk.send(self, "_selectedClass", []), className]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})]));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_protocols'),
+unescape('_declarationSource'),
 smalltalk.method({
-selector: unescape('protocols'),
+selector: unescape('declarationSource'),
 fn: function (){
 var self=this;
-try{var klass=nil;
-(($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return []}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return []}})})();})]));(klass=((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return self['@selectedClass'];})() : (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return self['@selectedClass'];}), (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})])));((($receiver = smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_with_", ["not yet classified"])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_with_", ["not yet classified"])}})})();})]));return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send(klass, "_protocols", [])}})})();})() : nil;
-(function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_new", [])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_protocols'){return e.fn()} throw(e)}}
+return ((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_classDeclarationSource", []);})() : (function(){return smalltalk.send(self, "_metaclassDeclarationSource", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_classDeclarationSource", []);}), (function(){return smalltalk.send(self, "_metaclassDeclarationSource", []);})]));
+return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_methods'),
+unescape('_disableSaveButton'),
 smalltalk.method({
-selector: unescape('methods'),
+selector: unescape('disableSaveButton'),
 fn: function (){
 var self=this;
-try{var klass=nil;
-((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return []}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return []}})})();})]));
-(($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return (klass=((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return self['@selectedClass'];})() : (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return self['@selectedClass'];}), (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})])));})() : nil;
-(function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return smalltalk.send((($receiver = self['@selectedProtocol']) == nil || $receiver == undefined) ? (function(){return (($receiver = klass) == nil || $receiver == undefined) ? (function(){return [];})() : (function(){return smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_values", []);})();})() : (function(){return smalltalk.send(smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_values", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(each, "_category", []), "__eq", [self['@selectedProtocol']]);})]);})(), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_selector", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(b, "_selector", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(b, "_selector", [])]));})])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_methods'){return e.fn()} throw(e)}}
+(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;
+(self['@unsavedChanges']=false);
+return self;}
+}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+unescape('_dummyMethodSource'),
+smalltalk.method({
+selector: unescape('dummyMethodSource'),
+fn: function (){
+var self=this;
+return unescape("messageSelectorAndArgumentNames%0A%09%22comment%20stating%20purpose%20of%20message%22%0A%0A%09%7C%20temporary%20variable%20names%20%7C%0A%09statements");
+return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_handleSourceAreaKeyDown_'),
 smalltalk.method({
-selector: unescape('source'),
-fn: function (){
+selector: unescape('handleSourceAreaKeyDown%3A'),
+fn: function (anEvent){
 var self=this;
-try{((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_source', fn: function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_declarationSource", []);})() : (function(){return smalltalk.send(self, "_methodSource", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_declarationSource", []);}), (function(){return smalltalk.send(self, "_methodSource", []);})]))}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '_source', fn: function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_declarationSource", []);})() : (function(){return smalltalk.send(self, "_methodSource", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_declarationSource", []);}), (function(){return smalltalk.send(self, "_methodSource", []);})]))}})})();})]));
-(function(){throw({name: 'stReturn', selector: '_source', fn: function(){return (($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return "";})() : (function(){return smalltalk.send(self, "_classCommentSource", []);})()}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_source'){return e.fn()} throw(e)}}
+if(anEvent.ctrlKey) {
+		if(anEvent.keyCode === 83) { //ctrl+s
+			self._compile();
+			anEvent.preventDefault();
+			return false;
+		}
+	}
+	;
+return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_methodSource'),
+unescape('_hideClassButtons'),
 smalltalk.method({
-selector: unescape('methodSource'),
+selector: unescape('hideClassButtons'),
 fn: function (){
 var self=this;
-return (($receiver = self['@selectedMethod']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self, "_dummyMethodSource", []);})() : (function(){return smalltalk.send(self['@selectedMethod'], "_source", []);})();
+smalltalk.send(smalltalk.send(self['@classButtons'], "_asJQuery", []), "_hide", []);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_dummyMethodSource'),
+unescape('_hideMethodButtons'),
 smalltalk.method({
-selector: unescape('dummyMethodSource'),
+selector: unescape('hideMethodButtons'),
 fn: function (){
 var self=this;
-return unescape("messageSelectorAndArgumentNames%0A%09%22comment%20stating%20purpose%20of%20message%22%0A%0A%09%7C%20temporary%20variable%20names%20%7C%0A%09statements");
+smalltalk.send(smalltalk.send(self['@methodButtons'], "_asJQuery", []), "_hide", []);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_declarationSource'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('declarationSource'),
+selector: unescape('initialize'),
 fn: function (){
 var self=this;
-return ((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_classDeclarationSource", []);})() : (function(){return smalltalk.send(self, "_metaclassDeclarationSource", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_classDeclarationSource", []);}), (function(){return smalltalk.send(self, "_metaclassDeclarationSource", []);})]));
+smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
+(self['@selectedTab']=smalltalk.symbolFor("instance"));
+(self['@selectedPackage']=smalltalk.send(smalltalk.send(self, "_packages", []), "_first", []));
+(self['@unsavedChanges']=false);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_classDeclarationSource'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('classDeclarationSource'),
+selector: unescape('label'),
 fn: function (){
 var self=this;
-try{var stream=nil;
-(stream=smalltalk.send("", "_writeStream", []));
-(($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return (function(){throw({name: 'stReturn', selector: '_classDeclarationSource', fn: function(){return smalltalk.send(self, "_classDeclarationTemplate", [])}})})();})() : $receiver;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@selectedClass'], "_superclass", []), "_asString", [])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%20subclass%3A%20%23")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@selectedClass'], "_name", [])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send((smalltalk.String || String), "_lf", []), "__comma", [smalltalk.send((smalltalk.String || String), "_tab", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("instanceVariableNames%3A%20%27")]);})(stream);
-smalltalk.send(smalltalk.send(self['@selectedClass'], "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(stream, "_nextPutAll_", [" "]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])]), "__comma", [smalltalk.send((smalltalk.String || String), "_tab", [])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("package%3A%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@selectedClass'], "_category", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%27")]);})(stream);
-(function(){throw({name: 'stReturn', selector: '_classDeclarationSource', fn: function(){return smalltalk.send(stream, "_contents", [])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_classDeclarationSource'){return e.fn()} throw(e)}}
+return (($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return unescape("Browser%20%28nil%29");})() : (function(){return smalltalk.send("Browser: ", "__comma", [smalltalk.send(self['@selectedClass'], "_name", [])]);})();
+return self;}
 }),
 smalltalk.Browser);
 
@@ -1299,235 +1397,221 @@ return self;}
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_classCommentSource'),
+unescape('_methodSource'),
 smalltalk.method({
-selector: unescape('classCommentSource'),
+selector: unescape('methodSource'),
 fn: function (){
 var self=this;
-return smalltalk.send(self['@selectedClass'], "_comment", []);
+return (($receiver = self['@selectedMethod']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self, "_dummyMethodSource", []);})() : (function(){return smalltalk.send(self['@selectedMethod'], "_source", []);})();
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_selectedClass'),
+unescape('_methods'),
 smalltalk.method({
-selector: unescape('selectedClass'),
+selector: unescape('methods'),
 fn: function (){
 var self=this;
-return self['@selectedClass'];
-return self;}
+try{var klass=nil;
+((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return []}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return []}})})();})]));
+(($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return (klass=((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return self['@selectedClass'];})() : (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return self['@selectedClass'];}), (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})])));})() : nil;
+(function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return smalltalk.send((($receiver = self['@selectedProtocol']) == nil || $receiver == undefined) ? (function(){return (($receiver = klass) == nil || $receiver == undefined) ? (function(){return [];})() : (function(){return smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_values", []);})();})() : (function(){return smalltalk.send(smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_values", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(each, "_category", []), "__eq", [self['@selectedProtocol']]);})]);})(), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_selector", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(b, "_selector", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(b, "_selector", [])]));})])}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_methods'){return e.fn()} throw(e)}}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_classDeclarationTemplate'),
+unescape('_packages'),
 smalltalk.method({
-selector: unescape('classDeclarationTemplate'),
+selector: unescape('packages'),
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(unescape("Object%20subclass%3A%20%23NameOfSubclass%0A%09instanceVariableNames%3A%20%27%27%0A%09package%3A%20%27"), "__comma", [smalltalk.send(self, "_selectedPackage", [])]), "__comma", [unescape("%27")]);
+var packages=nil;
+(packages=smalltalk.send((smalltalk.Array || Array), "_new", []));
+smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(packages, "_includes_", [smalltalk.send(each, "_category", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})]));})]);
+return smalltalk.send(packages, "_sort", []);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_selectedPackage'),
+unescape('_protocols'),
 smalltalk.method({
-selector: unescape('selectedPackage'),
+selector: unescape('protocols'),
 fn: function (){
 var self=this;
-return self['@selectedPackage'];
-return self;}
+try{var klass=nil;
+(($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return []}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return []}})})();})]));(klass=((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return self['@selectedClass'];})() : (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return self['@selectedClass'];}), (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})])));((($receiver = smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_with_", ["not yet classified"])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_with_", ["not yet classified"])}})})();})]));return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send(klass, "_protocols", [])}})})();})() : nil;
+(function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_new", [])}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_protocols'){return e.fn()} throw(e)}}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_disableSaveButton'),
+unescape('_removeClass'),
 smalltalk.method({
-selector: unescape('disableSaveButton'),
+selector: unescape('removeClass'),
 fn: function (){
 var self=this;
-(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;
-(self['@unsavedChanges']=false);
+((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send("Do you really want to remove ", "__comma", [smalltalk.send(self['@selectedClass'], "_name", [])]), "__comma", [unescape("%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removeClass_", [self['@selectedClass']]);smalltalk.send(self, "_resetClassesList", []);return smalltalk.send(self, "_selectClass_", [nil]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removeClass_", [self['@selectedClass']]);smalltalk.send(self, "_resetClassesList", []);return smalltalk.send(self, "_selectClass_", [nil]);})]));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_hideClassButtons'),
+unescape('_removeMethod'),
 smalltalk.method({
-selector: unescape('hideClassButtons'),
+selector: unescape('removeMethod'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@classButtons'], "_asJQuery", []), "_hide", []);
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send(unescape("Do%20you%20really%20want%20to%20remove%20%23"), "__comma", [smalltalk.send(self['@selectedMethod'], "_selector", [])]), "__comma", [unescape("%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);})() : (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);}), (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})]));return smalltalk.send(self, "_selectMethod_", [nil]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);})() : (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);}), (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})]));return smalltalk.send(self, "_selectMethod_", [nil]);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send(unescape("Do%20you%20really%20want%20to%20remove%20%23"), "__comma", [smalltalk.send(self['@selectedMethod'], "_selector", [])]), "__comma", [unescape("%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);})() : (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);}), (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})]));return smalltalk.send(self, "_selectMethod_", [nil]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);})() : (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);}), (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})]));return smalltalk.send(self, "_selectMethod_", [nil]);})]));})]));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_showClassButtons'),
+unescape('_removePackage'),
 smalltalk.method({
-selector: unescape('showClassButtons'),
+selector: unescape('removePackage'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@classButtons'], "_asJQuery", []), "_show", []);
+((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send("Do you really want to remove the whole package ", "__comma", [self['@selectedPackage']]), "__comma", [unescape("%20with%20all%20its%20classes%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removePackage_", [self['@selectedPackage']]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removePackage_", [self['@selectedPackage']]);return smalltalk.send(self, "_updateCategoriesList", []);})]));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_hideMethodButtons'),
+unescape('_renameClass'),
 smalltalk.method({
-selector: unescape('hideMethodButtons'),
+selector: unescape('renameClass'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@methodButtons'], "_asJQuery", []), "_hide", []);
+var newName=nil;
+(newName=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", [smalltalk.send("Rename class ", "__comma", [smalltalk.send(self['@selectedClass'], "_name", [])])]));
+((($receiver = smalltalk.send(smalltalk.send(newName, "_notNil", []), "_and_", [(function(){return smalltalk.send(newName, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self['@selectedClass'], "_rename_", [newName]);return (function($rec){smalltalk.send($rec, "_updateClassesList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self['@selectedClass'], "_rename_", [newName]);return (function($rec){smalltalk.send($rec, "_updateClassesList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_showMethodButtons'),
+unescape('_renamePackage'),
 smalltalk.method({
-selector: unescape('showMethodButtons'),
+selector: unescape('renamePackage'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@methodButtons'], "_asJQuery", []), "_show", []);
+var newName=nil;
+(newName=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", [smalltalk.send("Rename package ", "__comma", [self['@selectedPackage']])]));
+(($receiver = newName) != nil && $receiver != undefined) ? (function(){return ((($receiver = smalltalk.send(newName, "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})]));})() : nil;
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_compile'),
+unescape('_renderBottomPanelOn_'),
 smalltalk.method({
-selector: unescape('compile'),
-fn: function (){
+selector: unescape('renderBottomPanelOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(self, "_disableSaveButton", []);
-((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_compileClassComment", []);})() : nil;})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_compileDefinition", []);})() : (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_compileDefinition", []);}), (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_compileClassComment", []);})() : nil;}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_compileDefinition", []);})() : (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_compileDefinition", []);}), (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})]));})]));
+(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);smalltalk.send(self['@sourceArea'], "_onKeyDown_", [(function(e){return smalltalk.send(self, "_handleSourceAreaKeyDown_", [e]);})]);return smalltalk.send(self['@sourceArea'], "_onKeyUp_", [(function(){return smalltalk.send(self, "_updateStatus", []);})]);})]);})(smalltalk.send(html, "_div", []));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_compileClassComment'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('compileClassComment'),
-fn: function (){
+selector: unescape('renderBoxOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(self['@selectedClass'], "_comment_", [smalltalk.send(self['@sourceArea'], "_val", [])]);
+(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);smalltalk.send($rec, "_renderTabsOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_compileMethodDefinition'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('compileMethodDefinition'),
-fn: function (){
+selector: unescape('renderButtonsOn%3A'),
+fn: function (html){
 var self=this;
-((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [self['@selectedClass']]);})() : (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [smalltalk.send(self['@selectedClass'], "_class", [])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [self['@selectedClass']]);}), (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [smalltalk.send(self['@selectedClass'], "_class", [])]);})]));
+(self['@saveButton']=smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["Save"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_compile", []);})]);})(self['@saveButton']);
+(self['@methodButtons']=smalltalk.send(html, "_span", []));
+(self['@classButtons']=smalltalk.send(html, "_span", []));
+(function($rec){smalltalk.send($rec, "_class_", ["right"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_doIt", []);})]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_printIt", []);})]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));})]);})(smalltalk.send(html, "_div", []));
+smalltalk.send(self, "_updateSourceAndButtons", []);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_compileMethodDefinitionFor_'),
+unescape('_renderTabsOn_'),
 smalltalk.method({
-selector: unescape('compileMethodDefinitionFor%3A'),
-fn: function (aClass){
+selector: unescape('renderTabsOn%3A'),
+fn: function (html){
 var self=this;
-try{var compiler=nil;
-var method=nil;
-var source=nil;
-var node=nil;
-(source=smalltalk.send(self['@sourceArea'], "_val", []));
-(($receiver = self['@selectedProtocol']) == nil || $receiver == undefined) ? (function(){return (self['@selectedProtocol']=smalltalk.send(self['@selectedMethod'], "_category", []));})() : $receiver;
-(compiler=smalltalk.send((smalltalk.Compiler || Compiler), "_new", []));
-smalltalk.send(compiler, "_source_", [source]);
-(node=smalltalk.send(compiler, "_parse_", [source]));
-((($receiver = smalltalk.send(node, "_isParseFailure", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(smalltalk.send(smalltalk.send("PARSE ERROR: ", "__comma", [smalltalk.send(node, "_reason", [])]), "__comma", [unescape("%2C%20position%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(node, "_position", []), "_asString", [])])])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(smalltalk.send(smalltalk.send("PARSE ERROR: ", "__comma", [smalltalk.send(node, "_reason", [])]), "__comma", [unescape("%2C%20position%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(node, "_position", []), "_asString", [])])])}})})();})]));
-smalltalk.send(compiler, "_currentClass_", [aClass]);
-(method=smalltalk.send(compiler, "_eval_", [smalltalk.send(compiler, "_compileNode_", [node])]));
-smalltalk.send(method, "_category_", [self['@selectedProtocol']]);
-smalltalk.send(smalltalk.send(compiler, "_unknownVariables", []), "_do_", [(function(each){return (($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_at_", [each])) == nil || $receiver == undefined) ? (function(){return ((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send(unescape("Declare%20%27"), "__comma", [each]), "__comma", [unescape("%27%20as%20instance%20variable%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_addInstanceVariableNamed_toClass_", [each, aClass]);return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [aClass])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_addInstanceVariableNamed_toClass_", [each, aClass]);return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [aClass])}})})();})]));})() : $receiver;})]);
-smalltalk.send(aClass, "_addCompiledMethod_", [method]);
-smalltalk.send(compiler, "_setupClass_", [aClass]);
-smalltalk.send(self, "_updateMethodsList", []);
-smalltalk.send(self, "_selectMethod_", [method]);
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_compileMethodDefinitionFor_'){return e.fn()} throw(e)}}
+(self['@tabsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_tabs jt_browser"]));
+smalltalk.send(self, "_updateTabsList", []);
+return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_compileDefinition'),
+unescape('_renderTopPanelOn_'),
 smalltalk.method({
-selector: unescape('compileDefinition'),
-fn: function (){
+selector: unescape('renderTopPanelOn%3A'),
+fn: function (html){
 var self=this;
-var newClass=nil;
-(newClass=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [smalltalk.send(self['@sourceArea'], "_val", [])]));
-(function($rec){smalltalk.send($rec, "_resetClassesList", []);smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
-smalltalk.send(self, "_selectClass_", [newClass]);
+(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(self['@packagesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser packages"]));(function($rec){smalltalk.send($rec, "_class_", ["jt_packagesButtons"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_title_", ["Commit classes in this package to disk"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_commitPackage", []);})]);return smalltalk.send($rec, "_with_", ["Commit"]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_title_", ["Rename package"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_renamePackage", []);})]);return smalltalk.send($rec, "_with_", ["Rename"]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_title_", ["Remove this package from the system"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_removePackage", []);})]);return smalltalk.send($rec, "_with_", ["Remove"]);})(smalltalk.send(html, "_button", []));})]);})(smalltalk.send(html, "_div", []));(self['@classesList']=smalltalk.send((smalltalk.ClassesList || ClassesList), "_on_", [self]));smalltalk.send(self['@classesList'], "_renderOn_", [html]);(self['@protocolsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser protocols"]));(self['@methodsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser methods"]));(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);return smalltalk.send($rec, "_updateMethodsList", []);})(self);return smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_clear"]);})]);})(smalltalk.send(html, "_div", []));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_cancelChanges'),
+unescape('_resetClassesList'),
 smalltalk.method({
-selector: unescape('cancelChanges'),
+selector: unescape('resetClassesList'),
 fn: function (){
 var self=this;
-return ((($receiver = self['@unsavedChanges']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [unescape("Cancel%20changes%3F")]);})() : (function(){return true;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [unescape("Cancel%20changes%3F")]);}), (function(){return true;})]));
+smalltalk.send(self['@classesList'], "_resetNodes", []);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_removeClass'),
+unescape('_search_'),
 smalltalk.method({
-selector: unescape('removeClass'),
-fn: function (){
+selector: unescape('search%3A'),
+fn: function (aString){
 var self=this;
-((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send("Do you really want to remove ", "__comma", [smalltalk.send(self['@selectedClass'], "_name", [])]), "__comma", [unescape("%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removeClass_", [self['@selectedClass']]);smalltalk.send(self, "_resetClassesList", []);return smalltalk.send(self, "_selectClass_", [nil]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removeClass_", [self['@selectedClass']]);smalltalk.send(self, "_resetClassesList", []);return smalltalk.send(self, "_selectClass_", [nil]);})]));
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){var searchedClass=nil;
+(searchedClass=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [aString]));return ((($receiver = smalltalk.send(searchedClass, "_isClass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_class", []), "_openOn_", [searchedClass]);})() : (function(){return smalltalk.send(self, "_searchReferencesOf_", [aString]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_class", []), "_openOn_", [searchedClass]);}), (function(){return smalltalk.send(self, "_searchReferencesOf_", [aString]);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){var searchedClass=nil;
+(searchedClass=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [aString]));return ((($receiver = smalltalk.send(searchedClass, "_isClass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_class", []), "_openOn_", [searchedClass]);})() : (function(){return smalltalk.send(self, "_searchReferencesOf_", [aString]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_class", []), "_openOn_", [searchedClass]);}), (function(){return smalltalk.send(self, "_searchReferencesOf_", [aString]);})]));})]));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_removeMethod'),
+unescape('_searchClassReferences'),
 smalltalk.method({
-selector: unescape('removeMethod'),
+selector: unescape('searchClassReferences'),
 fn: function (){
 var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send(unescape("Do%20you%20really%20want%20to%20remove%20%23"), "__comma", [smalltalk.send(self['@selectedMethod'], "_selector", [])]), "__comma", [unescape("%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);})() : (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);}), (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})]));return smalltalk.send(self, "_selectMethod_", [nil]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);})() : (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);}), (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})]));return smalltalk.send(self, "_selectMethod_", [nil]);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send(unescape("Do%20you%20really%20want%20to%20remove%20%23"), "__comma", [smalltalk.send(self['@selectedMethod'], "_selector", [])]), "__comma", [unescape("%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);})() : (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);}), (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})]));return smalltalk.send(self, "_selectMethod_", [nil]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);})() : (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@selectedClass'], "_removeCompiledMethod_", [self['@selectedMethod']]);}), (function(){return smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_removeCompiledMethod_", [self['@selectedMethod']]);})]));return smalltalk.send(self, "_selectMethod_", [nil]);})]));})]));
+smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [smalltalk.send(self['@selectedClass'], "_name", [])]);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_setMethodProtocol_'),
+unescape('_searchReferencesOf_'),
 smalltalk.method({
-selector: unescape('setMethodProtocol%3A'),
+selector: unescape('searchReferencesOf%3A'),
 fn: function (aString){
 var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_protocols", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_addNewProtocol", []);})() : (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_addNewProtocol", []);}), (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_protocols", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_addNewProtocol", []);})() : (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_addNewProtocol", []);}), (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));})]));
-return self;}
-}),
-smalltalk.Browser);
-
-smalltalk.addMethod(
-unescape('_addNewProtocol'),
-smalltalk.method({
-selector: unescape('addNewProtocol'),
-fn: function (){
-var self=this;
-var newProtocol=nil;
-(newProtocol=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["New method protocol"]));
-((($receiver = smalltalk.send(smalltalk.send(newProtocol, "_notNil", []), "_and_", [(function(){return smalltalk.send(newProtocol, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self['@selectedMethod'], "_category_", [newProtocol]);return smalltalk.send(self, "_setMethodProtocol_", [newProtocol]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self['@selectedMethod'], "_category_", [newProtocol]);return smalltalk.send(self, "_setMethodProtocol_", [newProtocol]);})]));
+smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);
 return self;}
 }),
 smalltalk.Browser);
@@ -1547,20 +1631,9 @@ smalltalk.addMethod(
 unescape('_selectClass_'),
 smalltalk.method({
 selector: unescape('selectClass%3A'),
-fn: function (aClass){
-var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedClass']=aClass);(self['@selectedProtocol']=(self['@selectedMethod']=nil));return (function($rec){smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedClass']=aClass);(self['@selectedProtocol']=(self['@selectedMethod']=nil));return (function($rec){smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
-return self;}
-}),
-smalltalk.Browser);
-
-smalltalk.addMethod(
-unescape('_selectProtocol_'),
-smalltalk.method({
-selector: unescape('selectProtocol%3A'),
-fn: function (aString){
+fn: function (aClass){
 var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedProtocol']=aString);(self['@selectedMethod']=nil);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedProtocol']=aString);(self['@selectedMethod']=nil);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedClass']=aClass);(self['@selectedProtocol']=(self['@selectedMethod']=nil));return (function($rec){smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedClass']=aClass);(self['@selectedProtocol']=(self['@selectedMethod']=nil));return (function($rec){smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
 return self;}
 }),
 smalltalk.Browser);
@@ -1577,1607 +1650,1565 @@ return self;}
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_selectTab_'),
+unescape('_selectProtocol_'),
 smalltalk.method({
-selector: unescape('selectTab%3A'),
+selector: unescape('selectProtocol%3A'),
 fn: function (aString){
 var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedTab']=aString);smalltalk.send(self, "_selectProtocol_", [nil]);return smalltalk.send(self, "_updateTabsList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedTab']=aString);smalltalk.send(self, "_selectProtocol_", [nil]);return smalltalk.send(self, "_updateTabsList", []);})]));
-return self;}
-}),
-smalltalk.Browser);
-
-smalltalk.addMethod(
-unescape('_renameClass'),
-smalltalk.method({
-selector: unescape('renameClass'),
-fn: function (){
-var self=this;
-var newName=nil;
-(newName=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", [smalltalk.send("Rename class ", "__comma", [smalltalk.send(self['@selectedClass'], "_name", [])])]));
-((($receiver = smalltalk.send(smalltalk.send(newName, "_notNil", []), "_and_", [(function(){return smalltalk.send(newName, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self['@selectedClass'], "_rename_", [newName]);return (function($rec){smalltalk.send($rec, "_updateClassesList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self['@selectedClass'], "_rename_", [newName]);return (function($rec){smalltalk.send($rec, "_updateClassesList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedProtocol']=aString);(self['@selectedMethod']=nil);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedProtocol']=aString);(self['@selectedMethod']=nil);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_addInstanceVariableNamed_toClass_'),
+unescape('_selectTab_'),
 smalltalk.method({
-selector: unescape('addInstanceVariableNamed%3AtoClass%3A'),
-fn: function (aString, aClass){
+selector: unescape('selectTab%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_addSubclassOf_named_instanceVariableNames_package_", [smalltalk.send(aClass, "_superclass", []), smalltalk.send(aClass, "_name", []), (function($rec){smalltalk.send($rec, "_add_", [aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_copy", [])), smalltalk.send(smalltalk.send(aClass, "_package", []), "_name", [])]);
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedTab']=aString);smalltalk.send(self, "_selectProtocol_", [nil]);return smalltalk.send(self, "_updateTabsList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedTab']=aString);smalltalk.send(self, "_selectProtocol_", [nil]);return smalltalk.send(self, "_updateTabsList", []);})]));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_searchReferencesOf_'),
+unescape('_selectedClass'),
 smalltalk.method({
-selector: unescape('searchReferencesOf%3A'),
-fn: function (aString){
+selector: unescape('selectedClass'),
+fn: function (){
 var self=this;
-smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);
+return self['@selectedClass'];
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_searchClassReferences'),
+unescape('_selectedPackage'),
 smalltalk.method({
-selector: unescape('searchClassReferences'),
+selector: unescape('selectedPackage'),
 fn: function (){
 var self=this;
-smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [smalltalk.send(self['@selectedClass'], "_name", [])]);
+return self['@selectedPackage'];
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_search_'),
+unescape('_setMethodProtocol_'),
 smalltalk.method({
-selector: unescape('search%3A'),
+selector: unescape('setMethodProtocol%3A'),
 fn: function (aString){
 var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){var searchedClass=nil;
-(searchedClass=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [aString]));return ((($receiver = smalltalk.send(searchedClass, "_isClass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_class", []), "_openOn_", [searchedClass]);})() : (function(){return smalltalk.send(self, "_searchReferencesOf_", [aString]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_class", []), "_openOn_", [searchedClass]);}), (function(){return smalltalk.send(self, "_searchReferencesOf_", [aString]);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){var searchedClass=nil;
-(searchedClass=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [aString]));return ((($receiver = smalltalk.send(searchedClass, "_isClass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_class", []), "_openOn_", [searchedClass]);})() : (function(){return smalltalk.send(self, "_searchReferencesOf_", [aString]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_class", []), "_openOn_", [searchedClass]);}), (function(){return smalltalk.send(self, "_searchReferencesOf_", [aString]);})]));})]));
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_protocols", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_addNewProtocol", []);})() : (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_addNewProtocol", []);}), (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_protocols", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_addNewProtocol", []);})() : (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_addNewProtocol", []);}), (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));})]));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_handleSourceAreaKeyDown_'),
+unescape('_showClassButtons'),
 smalltalk.method({
-selector: unescape('handleSourceAreaKeyDown%3A'),
-fn: function (anEvent){
+selector: unescape('showClassButtons'),
+fn: function (){
 var self=this;
-if(anEvent.ctrlKey) {
-		if(anEvent.keyCode === 83) { //ctrl+s
-			self._compile();
-			anEvent.preventDefault();
-			return false;
-		}
-	}
-	;
+smalltalk.send(smalltalk.send(self['@classButtons'], "_asJQuery", []), "_show", []);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_commitPackage'),
+unescape('_showMethodButtons'),
 smalltalk.method({
-selector: unescape('commitPackage'),
+selector: unescape('showMethodButtons'),
 fn: function (){
 var self=this;
-(($receiver = self['@selectedPackage']) != nil && $receiver != undefined) ? (function(){var package=nil;
-(package=smalltalk.send((smalltalk.Package || Package), "_named_", [self['@selectedPackage']]));return smalltalk.send([smalltalk.send((smalltalk.Exporter || Exporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathJs", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".js"])]),smalltalk.send((smalltalk.StrippedExporter || StrippedExporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathJs", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".deploy.js"])]),smalltalk.send((smalltalk.ChunkExporter || ChunkExporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathSt", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".st"])])], "_do_", [(function(commitStrategy){var fileContents=nil;
-(fileContents=smalltalk.send(smalltalk.send(smalltalk.send(commitStrategy, "_key", []), "_new", []), "_exportPackage_", [self['@selectedPackage']]));return smalltalk.send(self, "_ajaxPutAt_data_", [smalltalk.send(commitStrategy, "_value", []), fileContents]);})]);})() : nil;
+smalltalk.send(smalltalk.send(self['@methodButtons'], "_asJQuery", []), "_show", []);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renamePackage'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('renamePackage'),
+selector: unescape('source'),
 fn: function (){
 var self=this;
-var newName=nil;
-(newName=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", [smalltalk.send("Rename package ", "__comma", [self['@selectedPackage']])]));
-(($receiver = newName) != nil && $receiver != undefined) ? (function(){return ((($receiver = smalltalk.send(newName, "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})]));})() : nil;
-return self;}
+try{((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_source', fn: function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_declarationSource", []);})() : (function(){return smalltalk.send(self, "_methodSource", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_declarationSource", []);}), (function(){return smalltalk.send(self, "_methodSource", []);})]))}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '_source', fn: function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_declarationSource", []);})() : (function(){return smalltalk.send(self, "_methodSource", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_declarationSource", []);}), (function(){return smalltalk.send(self, "_methodSource", []);})]))}})})();})]));
+(function(){throw({name: 'stReturn', selector: '_source', fn: function(){return (($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return "";})() : (function(){return smalltalk.send(self, "_classCommentSource", []);})()}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_source'){return e.fn()} throw(e)}}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_removePackage'),
+unescape('_updateCategoriesList'),
 smalltalk.method({
-selector: unescape('removePackage'),
+selector: unescape('updateCategoriesList'),
 fn: function (){
 var self=this;
-((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send("Do you really want to remove the whole package ", "__comma", [self['@selectedPackage']]), "__comma", [unescape("%20with%20all%20its%20classes%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removePackage_", [self['@selectedPackage']]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removePackage_", [self['@selectedPackage']]);return smalltalk.send(self, "_updateCategoriesList", []);})]));
+smalltalk.send(self['@packagesList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_packages", []), "_do_", [(function(each){var li=nil;
+var label=nil;
+((($receiver = smalltalk.send(each, "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (label="Unclassified");})() : (function(){return (label=each);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (label="Unclassified");}), (function(){return (label=each);})]));(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedPackage'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [label]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectCategory_", [each]);})]);})(li);})]);})]);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_addNewClass'),
+unescape('_updateClassesList'),
 smalltalk.method({
-selector: unescape('addNewClass'),
+selector: unescape('updateClassesList'),
 fn: function (){
 var self=this;
-var className=nil;
-(className=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["New class"]));
-((($receiver = smalltalk.send(smalltalk.send(className, "_notNil", []), "_and_", [(function(){return smalltalk.send(className, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send((smalltalk.Object || Object), "_subclass_instanceVariableNames_package_", [className, "", smalltalk.send(self, "_selectedPackage", [])]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send((smalltalk.Object || Object), "_subclass_instanceVariableNames_package_", [className, "", smalltalk.send(self, "_selectedPackage", [])]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})]));
+smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_update", []);
+smalltalk.send(self['@classesList'], "_updateNodes", []);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_copyClass'),
+unescape('_updateMethodsList'),
 smalltalk.method({
-selector: unescape('copyClass'),
+selector: unescape('updateMethodsList'),
 fn: function (){
 var self=this;
-var className=nil;
-(className=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["Copy class"]));
-((($receiver = smalltalk.send(smalltalk.send(className, "_notNil", []), "_and_", [(function(){return smalltalk.send(className, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_copyClass_named_", [smalltalk.send(self, "_selectedClass", []), className]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_copyClass_named_", [smalltalk.send(self, "_selectedClass", []), className]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})]));
+smalltalk.send(self['@methodsList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_methods", []), "_do_", [(function(each){var li=nil;
+(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedMethod'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(each, "_selector", [])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectMethod_", [each]);})]);})(li);})]);})]);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_updateProtocolsList'),
 smalltalk.method({
-selector: unescape('initialize'),
+selector: unescape('updateProtocolsList'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
-(self['@selectedTab']=smalltalk.symbolFor("instance"));
-(self['@selectedPackage']=smalltalk.send(smalltalk.send(self, "_packages", []), "_first", []));
-(self['@unsavedChanges']=false);
+smalltalk.send(self['@protocolsList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_protocols", []), "_do_", [(function(each){var li=nil;
+(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedProtocol'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectProtocol_", [each]);})]);})(li);})]);})]);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_ajaxPutAt_data_'),
+unescape('_updateSourceAndButtons'),
 smalltalk.method({
-selector: unescape('ajaxPutAt%3Adata%3A'),
-fn: function (anURL, aString){
+selector: unescape('updateSourceAndButtons'),
+fn: function (){
 var self=this;
-smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_ajax_options_", [anURL, smalltalk.HashedCollection._fromPairs_([smalltalk.send("type", "__minus_gt", ["PUT"]),smalltalk.send("data", "__minus_gt", [aString]),smalltalk.send("contentType", "__minus_gt", [unescape("text/plain%3Bcharset%3DUTF-8")]),smalltalk.send("error", "__minus_gt", [(function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send("PUT request failed at:  ", "__comma", [anURL])]);})])])]);
+smalltalk.send(self, "_disableSaveButton", []);
+smalltalk.send(self['@classButtons'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_title_", ["Create a new class"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_addNewClass", []);})]);return smalltalk.send($rec, "_with_", ["New class"]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_with_", ["Rename class"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_renameClass", []);})]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_with_", ["Copy class"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_copyClass", []);})]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_with_", ["Remove class"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_removeClass", []);})]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_with_", ["References"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_searchClassReferences", []);})]);})(smalltalk.send(html, "_button", []));})]);
+smalltalk.send(self['@methodButtons'], "_contents_", [(function(html){var protocolSelect=nil;
+var referencesSelect=nil;
+(function($rec){smalltalk.send($rec, "_with_", ["Remove method"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_removeMethod", []);})]);})(smalltalk.send(html, "_button", []));(protocolSelect=smalltalk.send(html, "_select", []));(function($rec){smalltalk.send($rec, "_onChange_", [(function(){return smalltalk.send(self, "_setMethodProtocol_", [smalltalk.send(smalltalk.send(protocolSelect, "_asJQuery", []), "_val", [])]);})]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_with_", ["Method protocol"]);return smalltalk.send($rec, "_at_put_", ["disabled", "disabled"]);})(smalltalk.send(html, "_option", []));(function($rec){smalltalk.send($rec, "_class_", ["important"]);return smalltalk.send($rec, "_with_", ["New..."]);})(smalltalk.send(html, "_option", []));return smalltalk.send(smalltalk.send(self, "_protocols", []), "_do_", [(function(each){(option=smalltalk.send(smalltalk.send(html, "_option", []), "_with_", [each]));return ((($receiver = smalltalk.send(self['@selectedProtocol'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send((typeof option == 'undefined' ? nil : option), "_at_put_", ["selected", "selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send((typeof option == 'undefined' ? nil : option), "_at_put_", ["selected", "selected"]);})]));})]);})]);})(protocolSelect);return ((($receiver = smalltalk.send(self['@selectedMethod'], "_isNil", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){(referencesSelect=smalltalk.send(html, "_select", []));return (function($rec){smalltalk.send($rec, "_onChange_", [(function(){return smalltalk.send(self, "_searchReferencesOf_", [smalltalk.send(smalltalk.send(referencesSelect, "_asJQuery", []), "_val", [])]);})]);return smalltalk.send($rec, "_with_", [(function(){var option=nil;
+(function($rec){smalltalk.send($rec, "_with_", ["References"]);return smalltalk.send($rec, "_at_put_", ["disabled", "disabled"]);})(smalltalk.send(html, "_option", []));(function($rec){smalltalk.send($rec, "_class_", ["important"]);return smalltalk.send($rec, "_with_", [smalltalk.send(self['@selectedMethod'], "_selector", [])]);})(smalltalk.send(html, "_option", []));return smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedMethod'], "_messageSends", []), "_sorted", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(html, "_option", []), "_with_", [each]);})]);})]);})(referencesSelect);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){(referencesSelect=smalltalk.send(html, "_select", []));return (function($rec){smalltalk.send($rec, "_onChange_", [(function(){return smalltalk.send(self, "_searchReferencesOf_", [smalltalk.send(smalltalk.send(referencesSelect, "_asJQuery", []), "_val", [])]);})]);return smalltalk.send($rec, "_with_", [(function(){var option=nil;
+(function($rec){smalltalk.send($rec, "_with_", ["References"]);return smalltalk.send($rec, "_at_put_", ["disabled", "disabled"]);})(smalltalk.send(html, "_option", []));(function($rec){smalltalk.send($rec, "_class_", ["important"]);return smalltalk.send($rec, "_with_", [smalltalk.send(self['@selectedMethod'], "_selector", [])]);})(smalltalk.send(html, "_option", []));return smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedMethod'], "_messageSends", []), "_sorted", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(html, "_option", []), "_with_", [each]);})]);})]);})(referencesSelect);})]));})]);
+((($receiver = smalltalk.send(self['@selectedMethod'], "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_hideMethodButtons", []);return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedClass'], "_isNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedProtocol'], "_notNil", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_hideClassButtons", []);})() : (function(){return smalltalk.send(self, "_showClassButtons", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_hideClassButtons", []);}), (function(){return smalltalk.send(self, "_showClassButtons", []);})]));})() : (function(){smalltalk.send(self, "_hideClassButtons", []);return smalltalk.send(self, "_showMethodButtons", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(self, "_hideMethodButtons", []);return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedClass'], "_isNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedProtocol'], "_notNil", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_hideClassButtons", []);})() : (function(){return smalltalk.send(self, "_showClassButtons", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_hideClassButtons", []);}), (function(){return smalltalk.send(self, "_showClassButtons", []);})]));}), (function(){smalltalk.send(self, "_hideClassButtons", []);return smalltalk.send(self, "_showMethodButtons", []);})]));
+smalltalk.send(self['@sourceArea'], "_val_", [smalltalk.send(self, "_source", [])]);
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renderBoxOn_'),
+unescape('_updateStatus'),
 smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-fn: function (html){
+selector: unescape('updateStatus'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);smalltalk.send($rec, "_renderTabsOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
+((($receiver = smalltalk.send(smalltalk.send(self['@sourceArea'], "_val", []), "__eq", [smalltalk.send(self, "_source", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);})() : (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);}), (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})]));
 return self;}
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renderTopPanelOn_'),
+unescape('_updateTabsList'),
 smalltalk.method({
-selector: unescape('renderTopPanelOn%3A'),
-fn: function (html){
+selector: unescape('updateTabsList'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(self['@packagesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser packages"]));(function($rec){smalltalk.send($rec, "_class_", ["jt_packagesButtons"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_title_", ["Commit classes in this package to disk"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_commitPackage", []);})]);return smalltalk.send($rec, "_with_", ["Commit"]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_title_", ["Rename package"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_renamePackage", []);})]);return smalltalk.send($rec, "_with_", ["Rename"]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_title_", ["Remove this package from the system"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_removePackage", []);})]);return smalltalk.send($rec, "_with_", ["Remove"]);})(smalltalk.send(html, "_button", []));})]);})(smalltalk.send(html, "_div", []));(self['@classesList']=smalltalk.send((smalltalk.ClassesList || ClassesList), "_on_", [self]));smalltalk.send(self['@classesList'], "_renderOn_", [html]);(self['@protocolsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser protocols"]));(self['@methodsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser methods"]));(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);return smalltalk.send($rec, "_updateMethodsList", []);})(self);return smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_clear"]);})]);})(smalltalk.send(html, "_div", []));
+smalltalk.send(self['@tabsList'], "_contents_", [(function(html){var li=nil;
+(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Instance"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("instance")]);})]);})(li);(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("class")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Class"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("class")]);})]);})(li);(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Comment"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("comment")]);})]);})(li);})]);
 return self;}
 }),
 smalltalk.Browser);
 
+
 smalltalk.addMethod(
-unescape('_renderTabsOn_'),
+unescape('_commitPathJs'),
 smalltalk.method({
-selector: unescape('renderTabsOn%3A'),
-fn: function (html){
+selector: unescape('commitPathJs'),
+fn: function (){
 var self=this;
-(self['@tabsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_tabs jt_browser"]));
-smalltalk.send(self, "_updateTabsList", []);
+return "js";
 return self;}
 }),
-smalltalk.Browser);
+smalltalk.Browser.klass);
 
 smalltalk.addMethod(
-unescape('_renderBottomPanelOn_'),
+unescape('_commitPathSt'),
 smalltalk.method({
-selector: unescape('renderBottomPanelOn%3A'),
-fn: function (html){
+selector: unescape('commitPathSt'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);smalltalk.send(self['@sourceArea'], "_onKeyDown_", [(function(e){return smalltalk.send(self, "_handleSourceAreaKeyDown_", [e]);})]);return smalltalk.send(self['@sourceArea'], "_onKeyUp_", [(function(){return smalltalk.send(self, "_updateStatus", []);})]);})]);})(smalltalk.send(html, "_div", []));
+return "st";
 return self;}
 }),
-smalltalk.Browser);
+smalltalk.Browser.klass);
 
 smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
-fn: function (html){
+selector: unescape('open'),
+fn: function (){
 var self=this;
-(self['@saveButton']=smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["Save"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_compile", []);})]);})(self['@saveButton']);
-(self['@methodButtons']=smalltalk.send(html, "_span", []));
-(self['@classButtons']=smalltalk.send(html, "_span", []));
-(function($rec){smalltalk.send($rec, "_class_", ["right"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_doIt", []);})]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_printIt", []);})]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));})]);})(smalltalk.send(html, "_div", []));
-smalltalk.send(self, "_updateSourceAndButtons", []);
+smalltalk.send(smalltalk.send(self, "_new", []), "_open", []);
 return self;}
 }),
-smalltalk.Browser);
+smalltalk.Browser.klass);
 
 smalltalk.addMethod(
-unescape('_canBeClosed'),
+unescape('_openOn_'),
 smalltalk.method({
-selector: unescape('canBeClosed'),
-fn: function (){
+selector: unescape('openOn%3A'),
+fn: function (aClass){
 var self=this;
-return true;
+return (function($rec){smalltalk.send($rec, "_open", []);smalltalk.send($rec, "_selectCategory_", [smalltalk.send(aClass, "_category", [])]);return smalltalk.send($rec, "_selectClass_", [aClass]);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.Browser);
+smalltalk.Browser.klass);
+
 
+smalltalk.addClass('Debugger', smalltalk.TabWidget, ['error', 'selectedContext', 'sourceArea', 'ul', 'ul2', 'inspector', 'saveButton', 'unsavedChanges', 'selectedVariable', 'selectedVariableName', 'inspectButton'], 'IDE');
 smalltalk.addMethod(
-unescape('_updateCategoriesList'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('updateCategoriesList'),
+selector: unescape('arguments'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@packagesList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_packages", []), "_do_", [(function(each){var li=nil;
-var label=nil;
-((($receiver = smalltalk.send(each, "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (label="Unclassified");})() : (function(){return (label=each);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (label="Unclassified");}), (function(){return (label=each);})]));(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedPackage'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [label]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectCategory_", [each]);})]);})(li);})]);})]);
+return (($receiver = smalltalk.send(self, "_method", [])) == nil || $receiver == undefined) ? (function(){return smalltalk.send(smalltalk.send(self['@selectedContext'], "_temps", []), "_collect_", [(function(each){return nil;})]);})() : (function(){return smalltalk.send(smalltalk.send(self, "_method", []), "_arguments", []);})();
 return self;}
 }),
-smalltalk.Browser);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_updateClassesList'),
+unescape('_canBeClosed'),
 smalltalk.method({
-selector: unescape('updateClassesList'),
+selector: unescape('canBeClosed'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_update", []);
-smalltalk.send(self['@classesList'], "_updateNodes", []);
+return true;
 return self;}
 }),
-smalltalk.Browser);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_updateProtocolsList'),
+unescape('_error'),
 smalltalk.method({
-selector: unescape('updateProtocolsList'),
+selector: unescape('error'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@protocolsList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_protocols", []), "_do_", [(function(each){var li=nil;
-(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedProtocol'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectProtocol_", [each]);})]);})(li);})]);})]);
+return self['@error'];
 return self;}
 }),
-smalltalk.Browser);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_updateMethodsList'),
+unescape('_error_'),
 smalltalk.method({
-selector: unescape('updateMethodsList'),
-fn: function (){
+selector: unescape('error%3A'),
+fn: function (anError){
 var self=this;
-smalltalk.send(self['@methodsList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_methods", []), "_do_", [(function(each){var li=nil;
-(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedMethod'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(each, "_selector", [])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectMethod_", [each]);})]);})(li);})]);})]);
+(self['@error']=anError);
 return self;}
 }),
-smalltalk.Browser);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_updateTabsList'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('updateTabsList'),
+selector: unescape('initialize'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@tabsList'], "_contents_", [(function(html){var li=nil;
-(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Instance"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("instance")]);})]);})(li);(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("class")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Class"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("class")]);})]);})(li);(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Comment"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("comment")]);})]);})(li);})]);
+smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
+smalltalk.send(self['@unsavedChanges'], "__eq", [false]);
 return self;}
 }),
-smalltalk.Browser);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_updateSourceAndButtons'),
+unescape('_inspectSelectedVariable'),
 smalltalk.method({
-selector: unescape('updateSourceAndButtons'),
+selector: unescape('inspectSelectedVariable'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_disableSaveButton", []);
-smalltalk.send(self['@classButtons'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_title_", ["Create a new class"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_addNewClass", []);})]);return smalltalk.send($rec, "_with_", ["New class"]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_with_", ["Rename class"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_renameClass", []);})]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_with_", ["Copy class"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_copyClass", []);})]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_with_", ["Remove class"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_removeClass", []);})]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_with_", ["References"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_searchClassReferences", []);})]);})(smalltalk.send(html, "_button", []));})]);
-smalltalk.send(self['@methodButtons'], "_contents_", [(function(html){var protocolSelect=nil;
-var referencesSelect=nil;
-(function($rec){smalltalk.send($rec, "_with_", ["Remove method"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_removeMethod", []);})]);})(smalltalk.send(html, "_button", []));(protocolSelect=smalltalk.send(html, "_select", []));(function($rec){smalltalk.send($rec, "_onChange_", [(function(){return smalltalk.send(self, "_setMethodProtocol_", [smalltalk.send(smalltalk.send(protocolSelect, "_asJQuery", []), "_val", [])]);})]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_with_", ["Method protocol"]);return smalltalk.send($rec, "_at_put_", ["disabled", "disabled"]);})(smalltalk.send(html, "_option", []));(function($rec){smalltalk.send($rec, "_class_", ["important"]);return smalltalk.send($rec, "_with_", ["New..."]);})(smalltalk.send(html, "_option", []));return smalltalk.send(smalltalk.send(self, "_protocols", []), "_do_", [(function(each){(option=smalltalk.send(smalltalk.send(html, "_option", []), "_with_", [each]));return ((($receiver = smalltalk.send(self['@selectedProtocol'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send((typeof option == 'undefined' ? nil : option), "_at_put_", ["selected", "selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send((typeof option == 'undefined' ? nil : option), "_at_put_", ["selected", "selected"]);})]));})]);})]);})(protocolSelect);return ((($receiver = smalltalk.send(self['@selectedMethod'], "_isNil", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){(referencesSelect=smalltalk.send(html, "_select", []));return (function($rec){smalltalk.send($rec, "_onChange_", [(function(){return smalltalk.send(self, "_searchReferencesOf_", [smalltalk.send(smalltalk.send(referencesSelect, "_asJQuery", []), "_val", [])]);})]);return smalltalk.send($rec, "_with_", [(function(){var option=nil;
-(function($rec){smalltalk.send($rec, "_with_", ["References"]);return smalltalk.send($rec, "_at_put_", ["disabled", "disabled"]);})(smalltalk.send(html, "_option", []));(function($rec){smalltalk.send($rec, "_class_", ["important"]);return smalltalk.send($rec, "_with_", [smalltalk.send(self['@selectedMethod'], "_selector", [])]);})(smalltalk.send(html, "_option", []));return smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedMethod'], "_messageSends", []), "_sorted", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(html, "_option", []), "_with_", [each]);})]);})]);})(referencesSelect);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){(referencesSelect=smalltalk.send(html, "_select", []));return (function($rec){smalltalk.send($rec, "_onChange_", [(function(){return smalltalk.send(self, "_searchReferencesOf_", [smalltalk.send(smalltalk.send(referencesSelect, "_asJQuery", []), "_val", [])]);})]);return smalltalk.send($rec, "_with_", [(function(){var option=nil;
-(function($rec){smalltalk.send($rec, "_with_", ["References"]);return smalltalk.send($rec, "_at_put_", ["disabled", "disabled"]);})(smalltalk.send(html, "_option", []));(function($rec){smalltalk.send($rec, "_class_", ["important"]);return smalltalk.send($rec, "_with_", [smalltalk.send(self['@selectedMethod'], "_selector", [])]);})(smalltalk.send(html, "_option", []));return smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedMethod'], "_messageSends", []), "_sorted", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(html, "_option", []), "_with_", [each]);})]);})]);})(referencesSelect);})]));})]);
-((($receiver = smalltalk.send(self['@selectedMethod'], "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_hideMethodButtons", []);return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedClass'], "_isNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedProtocol'], "_notNil", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_hideClassButtons", []);})() : (function(){return smalltalk.send(self, "_showClassButtons", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_hideClassButtons", []);}), (function(){return smalltalk.send(self, "_showClassButtons", []);})]));})() : (function(){smalltalk.send(self, "_hideClassButtons", []);return smalltalk.send(self, "_showMethodButtons", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(self, "_hideMethodButtons", []);return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedClass'], "_isNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedProtocol'], "_notNil", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_hideClassButtons", []);})() : (function(){return smalltalk.send(self, "_showClassButtons", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_hideClassButtons", []);}), (function(){return smalltalk.send(self, "_showClassButtons", []);})]));}), (function(){smalltalk.send(self, "_hideClassButtons", []);return smalltalk.send(self, "_showMethodButtons", []);})]));
-smalltalk.send(self['@sourceArea'], "_val_", [smalltalk.send(self, "_source", [])]);
+smalltalk.send(self['@selectedVariable'], "_inspect", []);
 return self;}
 }),
-smalltalk.Browser);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_updateStatus'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('updateStatus'),
+selector: unescape('label'),
 fn: function (){
 var self=this;
-((($receiver = smalltalk.send(smalltalk.send(self['@sourceArea'], "_val", []), "__eq", [smalltalk.send(self, "_source", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);})() : (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);}), (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})]));
+return unescape("%5BDebugger%5D");
 return self;}
 }),
-smalltalk.Browser);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_resetClassesList'),
+unescape('_method'),
 smalltalk.method({
-selector: unescape('resetClassesList'),
+selector: unescape('method'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@classesList'], "_resetNodes", []);
+return smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_methodAt_", [smalltalk.send(self['@selectedContext'], "_selector", [])]);
 return self;}
 }),
-smalltalk.Browser);
-
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_commitPathJs'),
+unescape('_proceed'),
 smalltalk.method({
-selector: unescape('commitPathJs'),
+selector: unescape('proceed'),
 fn: function (){
 var self=this;
-return "js";
+smalltalk.send(self, "_close", []);
+smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_perform_withArguments_", [smalltalk.send(self['@selectedContext'], "_selector", []), smalltalk.send(self['@selectedContext'], "_temps", [])]);
 return self;}
 }),
-smalltalk.Browser.klass);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_commitPathSt'),
+unescape('_receiver'),
 smalltalk.method({
-selector: unescape('commitPathSt'),
+selector: unescape('receiver'),
 fn: function (){
 var self=this;
-return "st";
+return smalltalk.send(self['@selectedContext'], "_receiver", []);
 return self;}
 }),
-smalltalk.Browser.klass);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_openOn_'),
+unescape('_renderBottomPanelOn_'),
 smalltalk.method({
-selector: unescape('openOn%3A'),
-fn: function (aClass){
+selector: unescape('renderBottomPanelOn%3A'),
+fn: function (html){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_open", []);smalltalk.send($rec, "_selectCategory_", [smalltalk.send(aClass, "_category", [])]);return smalltalk.send($rec, "_selectClass_", [aClass]);})(smalltalk.send(self, "_new", []));
+(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode debugger"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));return smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
+(self['@ul2']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column debugger variables"]));
+(self['@inspector']=smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_column debugger inspector"]));
+smalltalk.send(self['@sourceArea'], "_onKeyUp_", [(function(){return smalltalk.send(self, "_updateStatus", []);})]);
 return self;}
 }),
-smalltalk.Browser.klass);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('open'),
-fn: function (){
+selector: unescape('renderBoxOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_new", []), "_open", []);
+(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
 return self;}
 }),
-smalltalk.Browser.klass);
-
+smalltalk.Debugger);
 
-smalltalk.addClass('Inspector', smalltalk.TabWidget, ['label', 'variables', 'object', 'selectedVariable', 'variablesList', 'valueTextarea', 'diveButton', 'sourceArea'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('label'),
-fn: function (){
+selector: unescape('renderButtonsOn%3A'),
+fn: function (html){
 var self=this;
-return (($receiver = self['@label']) == nil || $receiver == undefined) ? (function(){return unescape("Inspector%20%28nil%29");})() : $receiver;
+(self['@saveButton']=(function($rec){smalltalk.send($rec, "_with_", ["Save"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_save", []);})]);})(smalltalk.send(html, "_button", [])));
+(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["Proceed"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_proceed", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["Abandon"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_close", []);})]);})(smalltalk.send(html, "_button", []));
+(self['@inspectButton']=(function($rec){smalltalk.send($rec, "_class_", ["jt_button debugger inspect"]);smalltalk.send($rec, "_with_", ["Inspect"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_inspectSelectedVariable", []);})]);})(smalltalk.send(html, "_button", [])));
+(function($rec){smalltalk.send($rec, "_updateSourceArea", []);smalltalk.send($rec, "_updateStatus", []);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateInspector", []);})(self);
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_variables'),
+unescape('_renderContext_on_'),
 smalltalk.method({
-selector: unescape('variables'),
-fn: function (){
+selector: unescape('renderContext%3Aon%3A'),
+fn: function (aContext, html){
 var self=this;
-return self['@variables'];
+var li=nil;
+(li=smalltalk.send(html, "_li", []));
+((($receiver = smalltalk.send(self['@selectedContext'], "__eq", [aContext])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));
+(function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(aContext, "_asString", [])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectContext_", [aContext]);})]);})(li);
+(($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(aContext, "_home", []), html]);})() : nil;
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_setVariables_'),
+unescape('_renderTopPanelOn_'),
 smalltalk.method({
-selector: unescape('setVariables%3A'),
-fn: function (aCollection){
+selector: unescape('renderTopPanelOn%3A'),
+fn: function (html){
 var self=this;
-(self['@variables']=aCollection);
+(self['@selectedContext']=smalltalk.send(smalltalk.send(self, "_error", []), "_context", []));
+(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_class_", ["label"]);return smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(self, "_error", []), "_messageText", [])]);})(smalltalk.send(html, "_div", []));return (self['@ul']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column debugger contexts"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(smalltalk.send(self, "_error", []), "_context", []), html]);})]);})(smalltalk.send(html, "_ul", [])));})]);})(smalltalk.send(html, "_div", []));
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_setLabel_'),
+unescape('_save'),
 smalltalk.method({
-selector: unescape('setLabel%3A'),
-fn: function (aString){
+selector: unescape('save'),
+fn: function (){
 var self=this;
-(self['@label']=aString);
+var protocol=nil;
+(protocol=smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_methodDictionary", []), "_at_", [smalltalk.send(self['@selectedContext'], "_selector", [])]), "_category", []));
+smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_compile_category_", [smalltalk.send(self['@sourceArea'], "_val", []), protocol]);
+smalltalk.send(self, "_updateStatus", []);
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_selectedVariable'),
+unescape('_selectContext_'),
 smalltalk.method({
-selector: unescape('selectedVariable'),
-fn: function (){
+selector: unescape('selectContext%3A'),
+fn: function (aContext){
 var self=this;
-return self['@selectedVariable'];
+(self['@selectedContext']=aContext);
+(self['@selectedVariable']=nil);
+(self['@selectedVariableName']=nil);
+(function($rec){smalltalk.send($rec, "_updateContextsList", []);smalltalk.send($rec, "_updateSourceArea", []);smalltalk.send($rec, "_updateInspector", []);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateStatus", []);})(self);
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_selectedVariable_'),
+unescape('_selectVariable_named_'),
 smalltalk.method({
-selector: unescape('selectedVariable%3A'),
-fn: function (aString){
+selector: unescape('selectVariable%3Anamed%3A'),
+fn: function (anObject, aString){
 var self=this;
-(self['@selectedVariable']=aString);
+(self['@selectedVariable']=anObject);
+(self['@selectedVariableName']=aString);
+smalltalk.send(self['@inspector'], "_contents_", [(function(html){return smalltalk.send(html, "_with_", [smalltalk.send(anObject, "_printString", [])]);})]);
+smalltalk.send(self, "_updateVariablesList", []);
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_sourceArea'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('sourceArea'),
+selector: unescape('source'),
 fn: function (){
 var self=this;
-return self['@sourceArea'];
+return (($receiver = smalltalk.send(self, "_method", [])) == nil || $receiver == undefined) ? (function(){return unescape("Method%20doesn%27t%20exist%21");})() : (function(){return smalltalk.send(smalltalk.send(self, "_method", []), "_source", []);})();
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_inspect_'),
+unescape('_updateContextsList'),
 smalltalk.method({
-selector: unescape('inspect%3A'),
-fn: function (anObject){
+selector: unescape('updateContextsList'),
+fn: function (){
 var self=this;
-(self['@object']=anObject);
-(self['@variables']=[]);
-smalltalk.send(self['@object'], "_inspectOn_", [self]);
+smalltalk.send(self['@ul'], "_contents_", [(function(html){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(smalltalk.send(self, "_error", []), "_context", []), html]);})]);
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_dive'),
+unescape('_updateInspector'),
 smalltalk.method({
-selector: unescape('dive'),
+selector: unescape('updateInspector'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_inspect", []);
+smalltalk.send(self['@inspector'], "_contents_", [(function(html){return nil;})]);
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_refresh'),
+unescape('_updateSourceArea'),
 smalltalk.method({
-selector: unescape('refresh'),
+selector: unescape('updateSourceArea'),
 fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_inspect_", [self['@object']]);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateValueTextarea", []);})(self);
+smalltalk.send(self['@sourceArea'], "_val_", [smalltalk.send(self, "_source", [])]);
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_renderBoxOn_'),
+unescape('_updateStatus'),
 smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-fn: function (html){
+selector: unescape('updateStatus'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
+((($receiver = smalltalk.send(smalltalk.send(self['@sourceArea'], "_val", []), "__eq", [smalltalk.send(self, "_source", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);})() : (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);}), (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})]));
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_renderTopPanelOn_'),
+unescape('_updateVariablesList'),
 smalltalk.method({
-selector: unescape('renderTopPanelOn%3A'),
-fn: function (html){
+selector: unescape('updateVariablesList'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(self['@variablesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column variables"]));(self['@valueTextarea']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column value"]);return smalltalk.send($rec, "_at_put_", ["readonly", "readonly"]);})(smalltalk.send(html, "_textarea", [])));(function($rec){smalltalk.send($rec, "_class_", ["jt_tabs inspector"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_class_", ["jt_button inspector refresh"]);smalltalk.send($rec, "_with_", ["Refresh"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_refresh", []);})]);})(smalltalk.send(html, "_button", []));return (self['@diveButton']=(function($rec){smalltalk.send($rec, "_class_", ["jt_button inspector dive"]);smalltalk.send($rec, "_with_", ["Dive"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_dive", []);})]);})(smalltalk.send(html, "_button", [])));})]);})(smalltalk.send(html, "_div", []));return smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_clear"]);})]);})(smalltalk.send(html, "_div", []));
-(function($rec){smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateValueTextarea", []);})(self);
+smalltalk.send(self['@ul2'], "_contents_", [(function(html){var li=nil;
+(li=(function($rec){smalltalk.send($rec, "_with_", ["self"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [smalltalk.send(self, "_receiver", []), "self"]);})]);})(smalltalk.send(html, "_li", [])));((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", ["self"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));smalltalk.send(smalltalk.send(self, "_arguments", []), "_withIndexDo_", [(function(each, index){var param=nil;
+(param=smalltalk.send(smalltalk.send(self['@selectedContext'], "_temps", []), "_at_", [index]));(li=(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [param, each]);})]);})(smalltalk.send(html, "_li", [])));return ((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_allInstanceVariableNames", []), "_do_", [(function(each){var ivar=nil;
+(ivar=smalltalk.send(smalltalk.send(self, "_receiver", []), "_instVarAt_", [each]));(li=(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [ivar, each]);})]);})(smalltalk.send(html, "_li", [])));return ((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);})]);
+(($receiver = self['@selectedVariable']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self['@inspectButton'], "_at_put_", ["disabled", true]);})() : (function(){return smalltalk.send(self['@inspectButton'], "_removeAt_", ["disabled"]);})();
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
+
 
+
+smalltalk.addClass('IDETranscript', smalltalk.TabWidget, ['textarea'], 'IDE');
 smalltalk.addMethod(
-unescape('_renderBottomPanelOn_'),
+unescape('_clear'),
 smalltalk.method({
-selector: unescape('renderBottomPanelOn%3A'),
-fn: function (html){
+selector: unescape('clear'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=(function($rec){smalltalk.send($rec, "_receiver_", [self['@object']]);smalltalk.send($rec, "_onDoIt_", [(function(){return smalltalk.send(self, "_refresh", []);})]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", [])));return smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
+smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [""]);
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
+unescape('_cr'),
 smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
-fn: function (html){
+selector: unescape('cr'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
-smalltalk.send(self, "_updateButtons", []);
+smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [smalltalk.send(smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val", []), "__comma", [smalltalk.send((smalltalk.String || String), "_cr", [])])]);
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_canBeClosed'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('canBeClosed'),
+selector: unescape('label'),
 fn: function (){
 var self=this;
-return true;
+return "Transcript";
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_updateVariablesList'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('updateVariablesList'),
+selector: unescape('open'),
 fn: function (){
-var self=this;
-smalltalk.send(self['@variablesList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_keys", []), "_do_", [(function(each){var li=nil;
-(li=smalltalk.send(html, "_li", []));(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_", [each]);})]);})(li);return ((($receiver = smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);})]);
+var self=this;
+(function($rec){smalltalk.send($rec, "_open", []);return smalltalk.send($rec, "_selectTab_", [self]);})(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []));
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_selectVariable_'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('selectVariable%3A'),
-fn: function (aString){
+selector: unescape('renderBoxOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(self, "_selectedVariable_", [aString]);
-(function($rec){smalltalk.send($rec, "_updateVariablesList", []);smalltalk.send($rec, "_updateValueTextarea", []);return smalltalk.send($rec, "_updateButtons", []);})(self);
+(self['@textarea']=smalltalk.send(html, "_textarea", []));
+(function($rec){smalltalk.send($rec, "_class_", ["jt_transcript"]);return smalltalk.send($rec, "_at_put_", ["spellcheck", "false"]);})(self['@textarea']);
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_updateValueTextarea'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('updateValueTextarea'),
-fn: function (){
+selector: unescape('renderButtonsOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(self['@valueTextarea'], "_asJQuery", []), "_val_", [((($receiver = smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "";})() : (function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_printString", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "";}), (function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_printString", []);})]))]);
+(function($rec){smalltalk.send($rec, "_with_", ["Clear transcript"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_clear", []);})]);})(smalltalk.send(html, "_button", []));
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_updateButtons'),
+unescape('_show_'),
 smalltalk.method({
-selector: unescape('updateButtons'),
-fn: function (){
+selector: unescape('show%3A'),
+fn: function (anObject){
 var self=this;
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "_notNil", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@diveButton'], "_at_put_", ["disabled", true]);})() : (function(){return smalltalk.send(self['@diveButton'], "_removeAt_", ["disabled"]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@diveButton'], "_at_put_", ["disabled", true]);}), (function(){return smalltalk.send(self['@diveButton'], "_removeAt_", ["disabled"]);})]));
+(($receiver = self['@textarea']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self, "_open", []);})() : $receiver;
+smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [smalltalk.send(smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val", []), "__comma", [smalltalk.send(anObject, "_asString", [])])]);
 return self;}
 }),
-smalltalk.Inspector);
+smalltalk.IDETranscript);
 
 
+smalltalk.IDETranscript.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_on_'),
+unescape('_current'),
 smalltalk.method({
-selector: unescape('on%3A'),
-fn: function (anObject){
+selector: unescape('current'),
+fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_inspect_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return (($receiver = self['@current']) == nil || $receiver == undefined) ? (function(){return (self['@current']=smalltalk.send(self, "_new", [], smalltalk.TabWidget.klass));})() : $receiver;
 return self;}
 }),
-smalltalk.Inspector.klass);
-
+smalltalk.IDETranscript.klass);
 
-smalltalk.addClass('ReferencesBrowser', smalltalk.TabWidget, ['implementors', 'senders', 'implementorsList', 'input', 'timer', 'selector', 'sendersList', 'referencedClasses', 'referencedClassesList'], 'IDE');
 smalltalk.addMethod(
-unescape('_implementors'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('implementors'),
+selector: unescape('initialize'),
 fn: function (){
 var self=this;
-return (($receiver = self['@implementors']) == nil || $receiver == undefined) ? (function(){return (self['@implementors']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+smalltalk.send((smalltalk.Transcript || Transcript), "_register_", [smalltalk.send(self, "_current", [])]);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript.klass);
 
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_new'),
 smalltalk.method({
-selector: unescape('label'),
+selector: unescape('new'),
 fn: function (){
 var self=this;
-return unescape("%5BReferences%5D");
+smalltalk.send(self, "_shouldNotImplement", []);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript.klass);
 
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('selector'),
+selector: unescape('open'),
 fn: function (){
 var self=this;
-return self['@selector'];
+(function($rec){smalltalk.send($rec, "_open", []);return smalltalk.send($rec, "_selectTab_", [smalltalk.send(self, "_current", [])]);})(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []));
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript.klass);
 
+
+smalltalk.addClass('Inspector', smalltalk.TabWidget, ['label', 'variables', 'object', 'selectedVariable', 'variablesList', 'valueTextarea', 'diveButton', 'sourceArea'], 'IDE');
 smalltalk.addMethod(
-unescape('_senders'),
+unescape('_canBeClosed'),
 smalltalk.method({
-selector: unescape('senders'),
+selector: unescape('canBeClosed'),
 fn: function (){
 var self=this;
-return (($receiver = self['@senders']) == nil || $receiver == undefined) ? (function(){return (self['@senders']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return true;
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_classesAndMetaclasses'),
+unescape('_dive'),
 smalltalk.method({
-selector: unescape('classesAndMetaclasses'),
+selector: unescape('dive'),
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_collect_", [(function(each){return smalltalk.send(each, "_class", []);})])]);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_inspect", []);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_referencedClasses'),
+unescape('_inspect_'),
 smalltalk.method({
-selector: unescape('referencedClasses'),
-fn: function (){
+selector: unescape('inspect%3A'),
+fn: function (anObject){
 var self=this;
-return (($receiver = self['@referencedClasses']) == nil || $receiver == undefined) ? (function(){return (self['@referencedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+(self['@object']=anObject);
+(self['@variables']=[]);
+smalltalk.send(self['@object'], "_inspectOn_", [self]);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_openBrowserOn_'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('openBrowserOn%3A'),
-fn: function (aMethod){
+selector: unescape('label'),
+fn: function (){
 var self=this;
-var browser=nil;
-(browser=smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [((($receiver = smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_instanceClass", []);})() : (function(){return smalltalk.send(aMethod, "_methodClass", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_instanceClass", []);}), (function(){return smalltalk.send(aMethod, "_methodClass", []);})]))]));
-((($receiver = smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(browser, "_selectTab_", [smalltalk.symbolFor("class")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(browser, "_selectTab_", [smalltalk.symbolFor("class")]);})]));
-(function($rec){smalltalk.send($rec, "_selectProtocol_", [smalltalk.send(aMethod, "_category", [])]);return smalltalk.send($rec, "_selectMethod_", [aMethod]);})(browser);
+return (($receiver = self['@label']) == nil || $receiver == undefined) ? (function(){return unescape("Inspector%20%28nil%29");})() : $receiver;
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_searchReferencesFor_'),
+unescape('_refresh'),
 smalltalk.method({
-selector: unescape('searchReferencesFor%3A'),
-fn: function (aString){
+selector: unescape('refresh'),
+fn: function (){
 var self=this;
-(self['@selector']=aString);
-(self['@implementors']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-(self['@senders']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-(self['@referencedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-((($receiver = smalltalk.send(self['@selector'], "_match_", [unescape("%5E%5BA-Z%5D")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);})() : (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);}), (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})]));
+(function($rec){smalltalk.send($rec, "_inspect_", [self['@object']]);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateValueTextarea", []);})(self);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_search_'),
+unescape('_renderBottomPanelOn_'),
 smalltalk.method({
-selector: unescape('search%3A'),
-fn: function (aString){
+selector: unescape('renderBottomPanelOn%3A'),
+fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);smalltalk.send($rec, "_updateImplementorsList", []);smalltalk.send($rec, "_updateSendersList", []);return smalltalk.send($rec, "_updateReferencedClassesList", []);})(self);
+(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=(function($rec){smalltalk.send($rec, "_receiver_", [self['@object']]);smalltalk.send($rec, "_onDoIt_", [(function(){return smalltalk.send(self, "_refresh", []);})]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", [])));return smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_searchReferencedClassesFor_'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('searchReferencedClassesFor%3A'),
-fn: function (aString){
+selector: unescape('renderBoxOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_values", []), "_do_", [(function(value){return ((($receiver = smalltalk.send(smalltalk.send(value, "_referencedClasses", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})]));})]);})]);
+(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_searchSelectorReferencesFor_'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('searchSelectorReferencesFor%3A'),
-fn: function (aString){
+selector: unescape('renderButtonsOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_keysAndValuesDo_", [(function(key, value){((($receiver = smalltalk.send(key, "__eq", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})]));return ((($receiver = smalltalk.send(smalltalk.send(value, "_messageSends", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})]));})]);})]);
+(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
+smalltalk.send(self, "_updateButtons", []);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_renderTopPanelOn_'),
 smalltalk.method({
-selector: unescape('initialize'),
-fn: function (){
+selector: unescape('renderTopPanelOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
-(self['@selector']="");
+(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(self['@variablesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column variables"]));(self['@valueTextarea']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column value"]);return smalltalk.send($rec, "_at_put_", ["readonly", "readonly"]);})(smalltalk.send(html, "_textarea", [])));(function($rec){smalltalk.send($rec, "_class_", ["jt_tabs inspector"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_class_", ["jt_button inspector refresh"]);smalltalk.send($rec, "_with_", ["Refresh"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_refresh", []);})]);})(smalltalk.send(html, "_button", []));return (self['@diveButton']=(function($rec){smalltalk.send($rec, "_class_", ["jt_button inspector dive"]);smalltalk.send($rec, "_with_", ["Dive"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_dive", []);})]);})(smalltalk.send(html, "_button", [])));})]);})(smalltalk.send(html, "_div", []));return smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_clear"]);})]);})(smalltalk.send(html, "_div", []));
+(function($rec){smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateValueTextarea", []);})(self);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_setInputEvents'),
+unescape('_selectVariable_'),
 smalltalk.method({
-selector: unescape('setInputEvents'),
-fn: function (){
+selector: unescape('selectVariable%3A'),
+fn: function (aString){
 var self=this;
-(function($rec){smalltalk.send($rec, "_onKeyUp_", [(function(){return (self['@timer']=smalltalk.send((function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);}), "_valueWithTimeout_", [(100)]));})]);return smalltalk.send($rec, "_onKeyDown_", [(function(){return (($receiver = self['@timer']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@timer'], "_clearTimeout", []);})() : nil;})]);})(self['@input']);
+smalltalk.send(self, "_selectedVariable_", [aString]);
+(function($rec){smalltalk.send($rec, "_updateVariablesList", []);smalltalk.send($rec, "_updateValueTextarea", []);return smalltalk.send($rec, "_updateButtons", []);})(self);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_renderBoxOn_'),
+unescape('_selectedVariable'),
 smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-fn: function (html){
+selector: unescape('selectedVariable'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_renderInputOn_", [html]);smalltalk.send($rec, "_renderImplementorsOn_", [html]);smalltalk.send($rec, "_renderSendersOn_", [html]);return smalltalk.send($rec, "_renderReferencedClassesOn_", [html]);})(self);
+return self['@selectedVariable'];
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_renderInputOn_'),
+unescape('_selectedVariable_'),
 smalltalk.method({
-selector: unescape('renderInputOn%3A'),
-fn: function (html){
+selector: unescape('selectedVariable%3A'),
+fn: function (aString){
 var self=this;
-(self['@input']=(function($rec){smalltalk.send($rec, "_class_", ["implementors"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_input", [])));
-smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val_", [self['@selector']]);
-smalltalk.send(self, "_setInputEvents", []);
+(self['@selectedVariable']=aString);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_renderImplementorsOn_'),
+unescape('_setLabel_'),
 smalltalk.method({
-selector: unescape('renderImplementorsOn%3A'),
-fn: function (html){
+selector: unescape('setLabel%3A'),
+fn: function (aString){
 var self=this;
-(self['@implementorsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column implementors"]));
-smalltalk.send(self, "_updateImplementorsList", []);
+(self['@label']=aString);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_renderSendersOn_'),
+unescape('_setVariables_'),
 smalltalk.method({
-selector: unescape('renderSendersOn%3A'),
-fn: function (html){
+selector: unescape('setVariables%3A'),
+fn: function (aCollection){
 var self=this;
-(self['@sendersList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column senders"]));
-smalltalk.send(self, "_updateSendersList", []);
+(self['@variables']=aCollection);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_renderReferencedClassesOn_'),
+unescape('_sourceArea'),
 smalltalk.method({
-selector: unescape('renderReferencedClassesOn%3A'),
-fn: function (html){
+selector: unescape('sourceArea'),
+fn: function (){
 var self=this;
-(self['@referencedClassesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column referenced_classes"]));
-smalltalk.send(self, "_updateReferencedClassesList", []);
+return self['@sourceArea'];
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_canBeClosed'),
+unescape('_updateButtons'),
 smalltalk.method({
-selector: unescape('canBeClosed'),
+selector: unescape('updateButtons'),
 fn: function (){
 var self=this;
-return true;
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "_notNil", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@diveButton'], "_at_put_", ["disabled", true]);})() : (function(){return smalltalk.send(self['@diveButton'], "_removeAt_", ["disabled"]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@diveButton'], "_at_put_", ["disabled", true]);}), (function(){return smalltalk.send(self['@diveButton'], "_removeAt_", ["disabled"]);})]));
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_updateImplementorsList'),
+unescape('_updateValueTextarea'),
 smalltalk.method({
-selector: unescape('updateImplementorsList'),
+selector: unescape('updateValueTextarea'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@implementorsList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Implementors%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_implementors", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_implementors", []), "_do_", [(function(each){var li=nil;
-(li=smalltalk.send(html, "_li", []));return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(li);})]);})]);
+smalltalk.send(smalltalk.send(self['@valueTextarea'], "_asJQuery", []), "_val_", [((($receiver = smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "";})() : (function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_printString", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "";}), (function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_printString", []);})]))]);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_updateSendersList'),
+unescape('_updateVariablesList'),
 smalltalk.method({
-selector: unescape('updateSendersList'),
+selector: unescape('updateVariablesList'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@sendersList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Senders%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_senders", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_senders", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);})]);
+smalltalk.send(self['@variablesList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_keys", []), "_do_", [(function(each){var li=nil;
+(li=smalltalk.send(html, "_li", []));(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_", [each]);})]);})(li);return ((($receiver = smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);})]);
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_updateReferencedClassesList'),
+unescape('_variables'),
 smalltalk.method({
-selector: unescape('updateReferencedClassesList'),
+selector: unescape('variables'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@referencedClassesList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Class%20references%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);})]);
+return self['@variables'];
 return self;}
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 
 smalltalk.addMethod(
-unescape('_search_'),
+unescape('_on_'),
 smalltalk.method({
-selector: unescape('search%3A'),
-fn: function (aString){
+selector: unescape('on%3A'),
+fn: function (anObject){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);return smalltalk.send($rec, "_open", []);})(smalltalk.send(self, "_new", []));
+return (function($rec){smalltalk.send($rec, "_inspect_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.ReferencesBrowser.klass);
+smalltalk.Inspector.klass);
 
 
-smalltalk.addClass('Debugger', smalltalk.TabWidget, ['error', 'selectedContext', 'sourceArea', 'ul', 'ul2', 'inspector', 'saveButton', 'unsavedChanges', 'selectedVariable', 'selectedVariableName', 'inspectButton'], 'IDE');
+smalltalk.addClass('ProgressBar', smalltalk.TabWidget, ['percent', 'progressDiv', 'div'], 'IDE');
 smalltalk.addMethod(
-unescape('_error'),
+unescape('_percent'),
 smalltalk.method({
-selector: unescape('error'),
+selector: unescape('percent'),
 fn: function (){
 var self=this;
-return self['@error'];
+return (($receiver = self['@percent']) == nil || $receiver == undefined) ? (function(){return (0);})() : $receiver;
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ProgressBar);
 
 smalltalk.addMethod(
-unescape('_error_'),
+unescape('_percent_'),
 smalltalk.method({
-selector: unescape('error%3A'),
-fn: function (anError){
+selector: unescape('percent%3A'),
+fn: function (aNumber){
 var self=this;
-(self['@error']=anError);
+(self['@percent']=aNumber);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ProgressBar);
 
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_renderOn_'),
 smalltalk.method({
-selector: unescape('label'),
-fn: function (){
+selector: unescape('renderOn%3A'),
+fn: function (html){
 var self=this;
-return unescape("%5BDebugger%5D");
+(self['@div']=(function($rec){smalltalk.send($rec, "_class_", ["progress_bar"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_div", [])));
+smalltalk.send(self, "_renderProgressBar", []);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ProgressBar);
 
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_renderProgressBar'),
 smalltalk.method({
-selector: unescape('source'),
+selector: unescape('renderProgressBar'),
 fn: function (){
 var self=this;
-return (($receiver = smalltalk.send(self, "_method", [])) == nil || $receiver == undefined) ? (function(){return unescape("Method%20doesn%27t%20exist%21");})() : (function(){return smalltalk.send(smalltalk.send(self, "_method", []), "_source", []);})();
+smalltalk.send(self['@div'], "_contents_", [(function(html){return (function($rec){smalltalk.send($rec, "_class_", ["progress"]);return smalltalk.send($rec, "_style_", [smalltalk.send(smalltalk.send("width:", "__comma", [smalltalk.send(smalltalk.send(self, "_percent", []), "_asString", [])]), "__comma", [unescape("%25")])]);})(smalltalk.send(html, "_div", []));})]);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ProgressBar);
 
 smalltalk.addMethod(
-unescape('_method'),
+unescape('_updatePercent_'),
 smalltalk.method({
-selector: unescape('method'),
-fn: function (){
+selector: unescape('updatePercent%3A'),
+fn: function (aNumber){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_methodAt_", [smalltalk.send(self['@selectedContext'], "_selector", [])]);
+smalltalk.send(self, "_percent_", [aNumber]);
+smalltalk.send(self, "_renderProgressBar", []);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ProgressBar);
 
-smalltalk.addMethod(
-unescape('_arguments'),
-smalltalk.method({
-selector: unescape('arguments'),
-fn: function (){
-var self=this;
-return (($receiver = smalltalk.send(self, "_method", [])) == nil || $receiver == undefined) ? (function(){return smalltalk.send(smalltalk.send(self['@selectedContext'], "_temps", []), "_collect_", [(function(each){return nil;})]);})() : (function(){return smalltalk.send(smalltalk.send(self, "_method", []), "_arguments", []);})();
-return self;}
-}),
-smalltalk.Debugger);
 
+
+smalltalk.addClass('ReferencesBrowser', smalltalk.TabWidget, ['implementors', 'senders', 'implementorsList', 'input', 'timer', 'selector', 'sendersList', 'referencedClasses', 'referencedClassesList'], 'IDE');
 smalltalk.addMethod(
-unescape('_receiver'),
+unescape('_canBeClosed'),
 smalltalk.method({
-selector: unescape('receiver'),
+selector: unescape('canBeClosed'),
 fn: function (){
 var self=this;
-return smalltalk.send(self['@selectedContext'], "_receiver", []);
+return true;
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_selectContext_'),
+unescape('_classesAndMetaclasses'),
 smalltalk.method({
-selector: unescape('selectContext%3A'),
-fn: function (aContext){
+selector: unescape('classesAndMetaclasses'),
+fn: function (){
 var self=this;
-(self['@selectedContext']=aContext);
-(self['@selectedVariable']=nil);
-(self['@selectedVariableName']=nil);
-(function($rec){smalltalk.send($rec, "_updateContextsList", []);smalltalk.send($rec, "_updateSourceArea", []);smalltalk.send($rec, "_updateInspector", []);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateStatus", []);})(self);
+return smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_collect_", [(function(each){return smalltalk.send(each, "_class", []);})])]);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_proceed'),
+unescape('_implementors'),
 smalltalk.method({
-selector: unescape('proceed'),
+selector: unescape('implementors'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_close", []);
-smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_perform_withArguments_", [smalltalk.send(self['@selectedContext'], "_selector", []), smalltalk.send(self['@selectedContext'], "_temps", [])]);
+return (($receiver = self['@implementors']) == nil || $receiver == undefined) ? (function(){return (self['@implementors']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_save'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('save'),
+selector: unescape('initialize'),
 fn: function (){
 var self=this;
-var protocol=nil;
-(protocol=smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_methodDictionary", []), "_at_", [smalltalk.send(self['@selectedContext'], "_selector", [])]), "_category", []));
-smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_compile_category_", [smalltalk.send(self['@sourceArea'], "_val", []), protocol]);
-smalltalk.send(self, "_updateStatus", []);
+smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
+(self['@selector']="");
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_selectVariable_named_'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('selectVariable%3Anamed%3A'),
-fn: function (anObject, aString){
+selector: unescape('label'),
+fn: function (){
 var self=this;
-(self['@selectedVariable']=anObject);
-(self['@selectedVariableName']=aString);
-smalltalk.send(self['@inspector'], "_contents_", [(function(html){return smalltalk.send(html, "_with_", [smalltalk.send(anObject, "_printString", [])]);})]);
-smalltalk.send(self, "_updateVariablesList", []);
+return unescape("%5BReferences%5D");
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_inspectSelectedVariable'),
+unescape('_openBrowserOn_'),
 smalltalk.method({
-selector: unescape('inspectSelectedVariable'),
-fn: function (){
+selector: unescape('openBrowserOn%3A'),
+fn: function (aMethod){
 var self=this;
-smalltalk.send(self['@selectedVariable'], "_inspect", []);
+var browser=nil;
+(browser=smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [((($receiver = smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_instanceClass", []);})() : (function(){return smalltalk.send(aMethod, "_methodClass", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_instanceClass", []);}), (function(){return smalltalk.send(aMethod, "_methodClass", []);})]))]));
+((($receiver = smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(browser, "_selectTab_", [smalltalk.symbolFor("class")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(browser, "_selectTab_", [smalltalk.symbolFor("class")]);})]));
+(function($rec){smalltalk.send($rec, "_selectProtocol_", [smalltalk.send(aMethod, "_category", [])]);return smalltalk.send($rec, "_selectMethod_", [aMethod]);})(browser);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_referencedClasses'),
 smalltalk.method({
-selector: unescape('initialize'),
+selector: unescape('referencedClasses'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
-smalltalk.send(self['@unsavedChanges'], "__eq", [false]);
+return (($receiver = self['@referencedClasses']) == nil || $receiver == undefined) ? (function(){return (self['@referencedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_renderTopPanelOn_'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('renderTopPanelOn%3A'),
+selector: unescape('renderBoxOn%3A'),
 fn: function (html){
 var self=this;
-(self['@selectedContext']=smalltalk.send(smalltalk.send(self, "_error", []), "_context", []));
-(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_class_", ["label"]);return smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(self, "_error", []), "_messageText", [])]);})(smalltalk.send(html, "_div", []));return (self['@ul']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column debugger contexts"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(smalltalk.send(self, "_error", []), "_context", []), html]);})]);})(smalltalk.send(html, "_ul", [])));})]);})(smalltalk.send(html, "_div", []));
+(function($rec){smalltalk.send($rec, "_renderInputOn_", [html]);smalltalk.send($rec, "_renderImplementorsOn_", [html]);smalltalk.send($rec, "_renderSendersOn_", [html]);return smalltalk.send($rec, "_renderReferencedClassesOn_", [html]);})(self);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_renderContext_on_'),
+unescape('_renderImplementorsOn_'),
 smalltalk.method({
-selector: unescape('renderContext%3Aon%3A'),
-fn: function (aContext, html){
+selector: unescape('renderImplementorsOn%3A'),
+fn: function (html){
 var self=this;
-var li=nil;
-(li=smalltalk.send(html, "_li", []));
-((($receiver = smalltalk.send(self['@selectedContext'], "__eq", [aContext])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));
-(function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(aContext, "_asString", [])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectContext_", [aContext]);})]);})(li);
-(($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(aContext, "_home", []), html]);})() : nil;
+(self['@implementorsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column implementors"]));
+smalltalk.send(self, "_updateImplementorsList", []);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_renderBottomPanelOn_'),
+unescape('_renderInputOn_'),
 smalltalk.method({
-selector: unescape('renderBottomPanelOn%3A'),
+selector: unescape('renderInputOn%3A'),
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode debugger"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));return smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
-(self['@ul2']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column debugger variables"]));
-(self['@inspector']=smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_column debugger inspector"]));
-smalltalk.send(self['@sourceArea'], "_onKeyUp_", [(function(){return smalltalk.send(self, "_updateStatus", []);})]);
+(self['@input']=(function($rec){smalltalk.send($rec, "_class_", ["implementors"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_input", [])));
+smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val_", [self['@selector']]);
+smalltalk.send(self, "_setInputEvents", []);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
+unescape('_renderReferencedClassesOn_'),
 smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
+selector: unescape('renderReferencedClassesOn%3A'),
 fn: function (html){
 var self=this;
-(self['@saveButton']=(function($rec){smalltalk.send($rec, "_with_", ["Save"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_save", []);})]);})(smalltalk.send(html, "_button", [])));
-(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["Proceed"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_proceed", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["Abandon"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_close", []);})]);})(smalltalk.send(html, "_button", []));
-(self['@inspectButton']=(function($rec){smalltalk.send($rec, "_class_", ["jt_button debugger inspect"]);smalltalk.send($rec, "_with_", ["Inspect"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_inspectSelectedVariable", []);})]);})(smalltalk.send(html, "_button", [])));
-(function($rec){smalltalk.send($rec, "_updateSourceArea", []);smalltalk.send($rec, "_updateStatus", []);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateInspector", []);})(self);
+(self['@referencedClassesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column referenced_classes"]));
+smalltalk.send(self, "_updateReferencedClassesList", []);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_renderBoxOn_'),
+unescape('_renderSendersOn_'),
 smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
+selector: unescape('renderSendersOn%3A'),
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
+(self['@sendersList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column senders"]));
+smalltalk.send(self, "_updateSendersList", []);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_canBeClosed'),
+unescape('_search_'),
 smalltalk.method({
-selector: unescape('canBeClosed'),
-fn: function (){
+selector: unescape('search%3A'),
+fn: function (aString){
 var self=this;
-return true;
+(function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);smalltalk.send($rec, "_updateImplementorsList", []);smalltalk.send($rec, "_updateSendersList", []);return smalltalk.send($rec, "_updateReferencedClassesList", []);})(self);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_updateContextsList'),
+unescape('_searchReferencedClassesFor_'),
 smalltalk.method({
-selector: unescape('updateContextsList'),
-fn: function (){
+selector: unescape('searchReferencedClassesFor%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.send(self['@ul'], "_contents_", [(function(html){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(smalltalk.send(self, "_error", []), "_context", []), html]);})]);
+smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_values", []), "_do_", [(function(value){return ((($receiver = smalltalk.send(smalltalk.send(value, "_referencedClasses", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})]));})]);})]);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_updateSourceArea'),
+unescape('_searchReferencesFor_'),
 smalltalk.method({
-selector: unescape('updateSourceArea'),
-fn: function (){
+selector: unescape('searchReferencesFor%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_val_", [smalltalk.send(self, "_source", [])]);
+(self['@selector']=aString);
+(self['@implementors']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+(self['@senders']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+(self['@referencedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+((($receiver = smalltalk.send(self['@selector'], "_match_", [unescape("%5E%5BA-Z%5D")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);})() : (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);}), (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})]));
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_updateStatus'),
+unescape('_searchSelectorReferencesFor_'),
 smalltalk.method({
-selector: unescape('updateStatus'),
-fn: function (){
+selector: unescape('searchSelectorReferencesFor%3A'),
+fn: function (aString){
 var self=this;
-((($receiver = smalltalk.send(smalltalk.send(self['@sourceArea'], "_val", []), "__eq", [smalltalk.send(self, "_source", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);})() : (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);}), (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})]));
+smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_keysAndValuesDo_", [(function(key, value){((($receiver = smalltalk.send(key, "__eq", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})]));return ((($receiver = smalltalk.send(smalltalk.send(value, "_messageSends", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})]));})]);})]);
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_updateInspector'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('updateInspector'),
+selector: unescape('selector'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@inspector'], "_contents_", [(function(html){return nil;})]);
+return self['@selector'];
 return self;}
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_updateVariablesList'),
+unescape('_senders'),
 smalltalk.method({
-selector: unescape('updateVariablesList'),
+selector: unescape('senders'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@ul2'], "_contents_", [(function(html){var li=nil;
-(li=(function($rec){smalltalk.send($rec, "_with_", ["self"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [smalltalk.send(self, "_receiver", []), "self"]);})]);})(smalltalk.send(html, "_li", [])));((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", ["self"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));smalltalk.send(smalltalk.send(self, "_arguments", []), "_withIndexDo_", [(function(each, index){var param=nil;
-(param=smalltalk.send(smalltalk.send(self['@selectedContext'], "_temps", []), "_at_", [index]));(li=(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [param, each]);})]);})(smalltalk.send(html, "_li", [])));return ((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_allInstanceVariableNames", []), "_do_", [(function(each){var ivar=nil;
-(ivar=smalltalk.send(smalltalk.send(self, "_receiver", []), "_instVarAt_", [each]));(li=(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [ivar, each]);})]);})(smalltalk.send(html, "_li", [])));return ((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);})]);
-(($receiver = self['@selectedVariable']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self['@inspectButton'], "_at_put_", ["disabled", true]);})() : (function(){return smalltalk.send(self['@inspectButton'], "_removeAt_", ["disabled"]);})();
+return (($receiver = self['@senders']) == nil || $receiver == undefined) ? (function(){return (self['@senders']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;}
 }),
-smalltalk.Debugger);
-
-
+smalltalk.ReferencesBrowser);
 
-smalltalk.addClass('ProgressBar', smalltalk.TabWidget, ['percent', 'progressDiv', 'div'], 'IDE');
 smalltalk.addMethod(
-unescape('_percent'),
+unescape('_setInputEvents'),
 smalltalk.method({
-selector: unescape('percent'),
+selector: unescape('setInputEvents'),
 fn: function (){
 var self=this;
-return (($receiver = self['@percent']) == nil || $receiver == undefined) ? (function(){return (0);})() : $receiver;
+(function($rec){smalltalk.send($rec, "_onKeyUp_", [(function(){return (self['@timer']=smalltalk.send((function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);}), "_valueWithTimeout_", [(100)]));})]);return smalltalk.send($rec, "_onKeyDown_", [(function(){return (($receiver = self['@timer']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@timer'], "_clearTimeout", []);})() : nil;})]);})(self['@input']);
 return self;}
 }),
-smalltalk.ProgressBar);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_percent_'),
+unescape('_updateImplementorsList'),
 smalltalk.method({
-selector: unescape('percent%3A'),
-fn: function (aNumber){
+selector: unescape('updateImplementorsList'),
+fn: function (){
 var self=this;
-(self['@percent']=aNumber);
+smalltalk.send(self['@implementorsList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Implementors%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_implementors", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_implementors", []), "_do_", [(function(each){var li=nil;
+(li=smalltalk.send(html, "_li", []));return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(li);})]);})]);
 return self;}
 }),
-smalltalk.ProgressBar);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_renderOn_'),
+unescape('_updateReferencedClassesList'),
 smalltalk.method({
-selector: unescape('renderOn%3A'),
-fn: function (html){
+selector: unescape('updateReferencedClassesList'),
+fn: function (){
 var self=this;
-(self['@div']=(function($rec){smalltalk.send($rec, "_class_", ["progress_bar"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_div", [])));
-smalltalk.send(self, "_renderProgressBar", []);
+smalltalk.send(self['@referencedClassesList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Class%20references%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);})]);
 return self;}
 }),
-smalltalk.ProgressBar);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_renderProgressBar'),
+unescape('_updateSendersList'),
 smalltalk.method({
-selector: unescape('renderProgressBar'),
+selector: unescape('updateSendersList'),
 fn: function (){
 var self=this;
-smalltalk.send(self['@div'], "_contents_", [(function(html){return (function($rec){smalltalk.send($rec, "_class_", ["progress"]);return smalltalk.send($rec, "_style_", [smalltalk.send(smalltalk.send("width:", "__comma", [smalltalk.send(smalltalk.send(self, "_percent", []), "_asString", [])]), "__comma", [unescape("%25")])]);})(smalltalk.send(html, "_div", []));})]);
+smalltalk.send(self['@sendersList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Senders%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_senders", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_senders", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);})]);
 return self;}
 }),
-smalltalk.ProgressBar);
+smalltalk.ReferencesBrowser);
+
 
 smalltalk.addMethod(
-unescape('_updatePercent_'),
+unescape('_search_'),
 smalltalk.method({
-selector: unescape('updatePercent%3A'),
-fn: function (aNumber){
+selector: unescape('search%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.send(self, "_percent_", [aNumber]);
-smalltalk.send(self, "_renderProgressBar", []);
+return (function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);return smalltalk.send($rec, "_open", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.ProgressBar);
-
+smalltalk.ReferencesBrowser.klass);
 
 
 smalltalk.addClass('TestRunner', smalltalk.TabWidget, ['selectedCategories', 'packagesList', 'selectedClasses', 'classesList', 'selectedMethods', 'progressBar', 'methodsList', 'result', 'statusDiv'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_allClasses'),
 smalltalk.method({
-selector: unescape('label'),
+selector: unescape('allClasses'),
 fn: function (){
 var self=this;
-return "SUnit";
+return smalltalk.send((smalltalk.TestCase || TestCase), "_allSubclasses", []);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_packages'),
+unescape('_classes'),
 smalltalk.method({
-selector: unescape('packages'),
+selector: unescape('classes'),
 fn: function (){
 var self=this;
-var packages=nil;
-(packages=smalltalk.send((smalltalk.Array || Array), "_new", []));
-smalltalk.send(smalltalk.send(self, "_allClasses", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(packages, "_includes_", [smalltalk.send(each, "_category", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})]));})]);
-return smalltalk.send(packages, "_sort", []);
+return smalltalk.send(smalltalk.send(smalltalk.send(self, "_allClasses", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [smalltalk.send(each, "_category", [])]);})]), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_name", [])).klass === smalltalk.Number) ? $receiver >smalltalk.send(b, "_name", []) : smalltalk.send($receiver, "__gt", [smalltalk.send(b, "_name", [])]));})]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_classes'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('classes'),
+selector: unescape('initialize'),
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(self, "_allClasses", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [smalltalk.send(each, "_category", [])]);})]), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_name", [])).klass === smalltalk.Number) ? $receiver >smalltalk.send(b, "_name", []) : smalltalk.send($receiver, "__gt", [smalltalk.send(b, "_name", [])]));})]);
+smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
+(self['@result']=smalltalk.send((smalltalk.TestResult || TestResult), "_new", []));
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_selectedCategories'),
+unescape('_isSelectedCategory_'),
 smalltalk.method({
-selector: unescape('selectedCategories'),
-fn: function (){
+selector: unescape('isSelectedCategory%3A'),
+fn: function (aCategory){
 var self=this;
-return (($receiver = self['@selectedCategories']) == nil || $receiver == undefined) ? (function(){return (self['@selectedCategories']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [aCategory]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_allClasses'),
+unescape('_isSelectedClass_'),
 smalltalk.method({
-selector: unescape('allClasses'),
-fn: function (){
+selector: unescape('isSelectedClass%3A'),
+fn: function (aClass){
 var self=this;
-return smalltalk.send((smalltalk.TestCase || TestCase), "_allSubclasses", []);
+return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_includes_", [aClass]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_selectedClasses'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('selectedClasses'),
+selector: unescape('label'),
 fn: function (){
 var self=this;
-return (($receiver = self['@selectedClasses']) == nil || $receiver == undefined) ? (function(){return (self['@selectedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return "SUnit";
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_progressBar'),
+unescape('_packages'),
 smalltalk.method({
-selector: unescape('progressBar'),
+selector: unescape('packages'),
 fn: function (){
 var self=this;
-return (($receiver = self['@progressBar']) == nil || $receiver == undefined) ? (function(){return (self['@progressBar']=smalltalk.send((smalltalk.ProgressBar || ProgressBar), "_new", []));})() : $receiver;
+var packages=nil;
+(packages=smalltalk.send((smalltalk.Array || Array), "_new", []));
+smalltalk.send(smalltalk.send(self, "_allClasses", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(packages, "_includes_", [smalltalk.send(each, "_category", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})]));})]);
+return smalltalk.send(packages, "_sort", []);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_statusInfo'),
+unescape('_performFailure_'),
 smalltalk.method({
-selector: unescape('statusInfo'),
-fn: function (){
+selector: unescape('performFailure%3A'),
+fn: function (aTestCase){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printTotal", []), "__comma", [smalltalk.send(self, "_printPasses", [])]), "__comma", [smalltalk.send(self, "_printErrors", [])]), "__comma", [smalltalk.send(self, "_printFailures", [])]);
+smalltalk.send(aTestCase, "_perform_", [smalltalk.send(aTestCase, "_selector", [])]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_result'),
+unescape('_printErrors'),
 smalltalk.method({
-selector: unescape('result'),
+selector: unescape('printErrors'),
 fn: function (){
 var self=this;
-return self['@result'];
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_size", []), "_asString", []), "__comma", [unescape("%20errors%2C%20")]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_testCases'),
+unescape('_printFailures'),
 smalltalk.method({
-selector: unescape('testCases'),
+selector: unescape('printFailures'),
 fn: function (){
 var self=this;
-var testCases=nil;
-(testCases=[]);
-smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_do_", [(function(each){return smalltalk.send(testCases, "_addAll_", [smalltalk.send(each, "_buildSuite", [])]);})]);
-return testCases;
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", []), "_asString", []), "__comma", [" failures"]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_selectAllCategories'),
+unescape('_printPasses'),
 smalltalk.method({
-selector: unescape('selectAllCategories'),
+selector: unescape('printPasses'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_packages", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(self['@selectedCategories'], "_includes_", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_add_", [each]);})]));})]);
-(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+return smalltalk.send(smalltalk.send(((($receiver = ((($receiver = smalltalk.send(smalltalk.send(self, "_result", []), "_total", [])).klass === smalltalk.Number) ? $receiver -smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_size", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_size", [])]))).klass === smalltalk.Number) ? $receiver -smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", [])])), "_asString", []), "__comma", [unescape("%20passes%2C%20")]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_toggleCategory_'),
+unescape('_printTotal'),
 smalltalk.method({
-selector: unescape('toggleCategory%3A'),
-fn: function (aCategory){
+selector: unescape('printTotal'),
+fn: function (){
 var self=this;
-((($receiver = smalltalk.send(self, "_isSelectedCategory_", [aCategory])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@selectedCategories'], "_add_", [aCategory]);})() : (function(){return smalltalk.send(self['@selectedCategories'], "_remove_", [aCategory]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedCategories'], "_add_", [aCategory]);}), (function(){return smalltalk.send(self['@selectedCategories'], "_remove_", [aCategory]);})]));
-(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_total", []), "_asString", []), "__comma", [unescape("%20runs%2C%20")]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_toggleClass_'),
+unescape('_progressBar'),
 smalltalk.method({
-selector: unescape('toggleClass%3A'),
-fn: function (aClass){
+selector: unescape('progressBar'),
+fn: function (){
 var self=this;
-((($receiver = smalltalk.send(self, "_isSelectedClass_", [aClass])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@selectedClasses'], "_add_", [aClass]);})() : (function(){return smalltalk.send(self['@selectedClasses'], "_remove_", [aClass]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedClasses'], "_add_", [aClass]);}), (function(){return smalltalk.send(self['@selectedClasses'], "_remove_", [aClass]);})]));
-smalltalk.send(self, "_updateClassesList", []);
+return (($receiver = self['@progressBar']) == nil || $receiver == undefined) ? (function(){return (self['@progressBar']=smalltalk.send((smalltalk.ProgressBar || ProgressBar), "_new", []));})() : $receiver;
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_selectAllClasses'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('selectAllClasses'),
-fn: function (){
+selector: unescape('renderBoxOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_classes", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(self['@selectedClasses'], "_includes_", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_add_", [each]);})]));})]);
-(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+(function($rec){smalltalk.send($rec, "_renderCategoriesOn_", [html]);smalltalk.send($rec, "_renderClassesOn_", [html]);return smalltalk.send($rec, "_renderResultsOn_", [html]);})(self);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_run_'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('run%3A'),
-fn: function (aCollection){
+selector: unescape('renderButtonsOn%3A'),
+fn: function (html){
 var self=this;
-(self['@result']=smalltalk.send((smalltalk.TestResult || TestResult), "_new", []));
-(function($rec){smalltalk.send($rec, "_updateStatusDiv", []);return smalltalk.send($rec, "_updateMethodsList", []);})(self);
-smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [(0)]);
-smalltalk.send(self['@result'], "_total_", [smalltalk.send(aCollection, "_size", [])]);
-smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send((function(){smalltalk.send(each, "_runCaseFor_", [self['@result']]);smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [((($receiver = ((($receiver = smalltalk.send(self['@result'], "_runs", [])).klass === smalltalk.Number) ? $receiver /smalltalk.send(self['@result'], "_total", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(self['@result'], "_total", [])]))).klass === smalltalk.Number) ? $receiver *(100) : smalltalk.send($receiver, "__star", [(100)]))]);smalltalk.send(self, "_updateStatusDiv", []);return smalltalk.send(self, "_updateMethodsList", []);}), "_valueWithTimeout_", [(100)]);})]);
+(function($rec){smalltalk.send($rec, "_with_", ["Run selected"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_run_", [smalltalk.send(self, "_testCases", [])]);})]);})(smalltalk.send(html, "_button", []));
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_performFailure_'),
+unescape('_renderCategoriesOn_'),
 smalltalk.method({
-selector: unescape('performFailure%3A'),
-fn: function (aTestCase){
+selector: unescape('renderCategoriesOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(aTestCase, "_perform_", [smalltalk.send(aTestCase, "_selector", [])]);
+(self['@packagesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit packages"]));
+smalltalk.send(self, "_updateCategoriesList", []);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_renderClassesOn_'),
 smalltalk.method({
-selector: unescape('initialize'),
-fn: function (){
+selector: unescape('renderClassesOn%3A'),
+fn: function (html){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
-(self['@result']=smalltalk.send((smalltalk.TestResult || TestResult), "_new", []));
+(self['@classesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit classes"]));
+smalltalk.send(self, "_updateClassesList", []);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_printErrors'),
+unescape('_renderErrorsOn_'),
 smalltalk.method({
-selector: unescape('printErrors'),
-fn: function (){
+selector: unescape('renderErrorsOn%3A'),
+fn: function (html){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_size", []), "_asString", []), "__comma", [unescape("%20errors%2C%20")]);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["errors"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_class", []), "_name", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_performFailure_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_printFailures'),
+unescape('_renderFailuresOn_'),
 smalltalk.method({
-selector: unescape('printFailures'),
-fn: function (){
+selector: unescape('renderFailuresOn%3A'),
+fn: function (html){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", []), "_asString", []), "__comma", [" failures"]);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["failures"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_class", []), "_name", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_performFailure_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_printPasses'),
+unescape('_renderResultsOn_'),
 smalltalk.method({
-selector: unescape('printPasses'),
-fn: function (){
+selector: unescape('renderResultsOn%3A'),
+fn: function (html){
 var self=this;
-return smalltalk.send(smalltalk.send(((($receiver = ((($receiver = smalltalk.send(smalltalk.send(self, "_result", []), "_total", [])).klass === smalltalk.Number) ? $receiver -smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_size", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_size", [])]))).klass === smalltalk.Number) ? $receiver -smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", [])])), "_asString", []), "__comma", [unescape("%20passes%2C%20")]);
+(self['@statusDiv']=smalltalk.send(html, "_div", []));
+smalltalk.send(html, "_with_", [smalltalk.send(self, "_progressBar", [])]);
+(self['@methodsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit results"]));
+smalltalk.send(self, "_updateMethodsList", []);
+smalltalk.send(self, "_updateStatusDiv", []);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_printTotal'),
+unescape('_result'),
 smalltalk.method({
-selector: unescape('printTotal'),
+selector: unescape('result'),
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_total", []), "_asString", []), "__comma", [unescape("%20runs%2C%20")]);
+return self['@result'];
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_renderBoxOn_'),
+unescape('_run_'),
 smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-fn: function (html){
+selector: unescape('run%3A'),
+fn: function (aCollection){
 var self=this;
-(function($rec){smalltalk.send($rec, "_renderCategoriesOn_", [html]);smalltalk.send($rec, "_renderClassesOn_", [html]);return smalltalk.send($rec, "_renderResultsOn_", [html]);})(self);
+(self['@result']=smalltalk.send((smalltalk.TestResult || TestResult), "_new", []));
+(function($rec){smalltalk.send($rec, "_updateStatusDiv", []);return smalltalk.send($rec, "_updateMethodsList", []);})(self);
+smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [(0)]);
+smalltalk.send(self['@result'], "_total_", [smalltalk.send(aCollection, "_size", [])]);
+smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send((function(){smalltalk.send(each, "_runCaseFor_", [self['@result']]);smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [((($receiver = ((($receiver = smalltalk.send(self['@result'], "_runs", [])).klass === smalltalk.Number) ? $receiver /smalltalk.send(self['@result'], "_total", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(self['@result'], "_total", [])]))).klass === smalltalk.Number) ? $receiver *(100) : smalltalk.send($receiver, "__star", [(100)]))]);smalltalk.send(self, "_updateStatusDiv", []);return smalltalk.send(self, "_updateMethodsList", []);}), "_valueWithTimeout_", [(100)]);})]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
+unescape('_selectAllCategories'),
 smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
-fn: function (html){
+selector: unescape('selectAllCategories'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_with_", ["Run selected"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_run_", [smalltalk.send(self, "_testCases", [])]);})]);})(smalltalk.send(html, "_button", []));
+smalltalk.send(smalltalk.send(self, "_packages", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(self['@selectedCategories'], "_includes_", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_add_", [each]);})]));})]);
+(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_renderCategoriesOn_'),
+unescape('_selectAllClasses'),
 smalltalk.method({
-selector: unescape('renderCategoriesOn%3A'),
-fn: function (html){
+selector: unescape('selectAllClasses'),
+fn: function (){
 var self=this;
-(self['@packagesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit packages"]));
-smalltalk.send(self, "_updateCategoriesList", []);
+smalltalk.send(smalltalk.send(self, "_classes", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(self['@selectedClasses'], "_includes_", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_add_", [each]);})]));})]);
+(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_renderClassesOn_'),
+unescape('_selectedCategories'),
 smalltalk.method({
-selector: unescape('renderClassesOn%3A'),
-fn: function (html){
+selector: unescape('selectedCategories'),
+fn: function (){
 var self=this;
-(self['@classesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit classes"]));
-smalltalk.send(self, "_updateClassesList", []);
+return (($receiver = self['@selectedCategories']) == nil || $receiver == undefined) ? (function(){return (self['@selectedCategories']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_renderResultsOn_'),
+unescape('_selectedClasses'),
 smalltalk.method({
-selector: unescape('renderResultsOn%3A'),
-fn: function (html){
+selector: unescape('selectedClasses'),
+fn: function (){
 var self=this;
-(self['@statusDiv']=smalltalk.send(html, "_div", []));
-smalltalk.send(html, "_with_", [smalltalk.send(self, "_progressBar", [])]);
-(self['@methodsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit results"]));
-smalltalk.send(self, "_updateMethodsList", []);
-smalltalk.send(self, "_updateStatusDiv", []);
+return (($receiver = self['@selectedClasses']) == nil || $receiver == undefined) ? (function(){return (self['@selectedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_renderFailuresOn_'),
+unescape('_statusInfo'),
 smalltalk.method({
-selector: unescape('renderFailuresOn%3A'),
-fn: function (html){
+selector: unescape('statusInfo'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["failures"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_class", []), "_name", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_performFailure_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printTotal", []), "__comma", [smalltalk.send(self, "_printPasses", [])]), "__comma", [smalltalk.send(self, "_printErrors", [])]), "__comma", [smalltalk.send(self, "_printFailures", [])]);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_renderErrorsOn_'),
+unescape('_testCases'),
 smalltalk.method({
-selector: unescape('renderErrorsOn%3A'),
-fn: function (html){
+selector: unescape('testCases'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["errors"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_class", []), "_name", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_performFailure_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);
+var testCases=nil;
+(testCases=[]);
+smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_do_", [(function(each){return smalltalk.send(testCases, "_addAll_", [smalltalk.send(each, "_buildSuite", [])]);})]);
+return testCases;
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_isSelectedClass_'),
+unescape('_toggleCategory_'),
 smalltalk.method({
-selector: unescape('isSelectedClass%3A'),
-fn: function (aClass){
+selector: unescape('toggleCategory%3A'),
+fn: function (aCategory){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_includes_", [aClass]);
+((($receiver = smalltalk.send(self, "_isSelectedCategory_", [aCategory])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@selectedCategories'], "_add_", [aCategory]);})() : (function(){return smalltalk.send(self['@selectedCategories'], "_remove_", [aCategory]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedCategories'], "_add_", [aCategory]);}), (function(){return smalltalk.send(self['@selectedCategories'], "_remove_", [aCategory]);})]));
+(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
 return self;}
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_isSelectedCategory_'),
+unescape('_toggleClass_'),
 smalltalk.method({
-selector: unescape('isSelectedCategory%3A'),
-fn: function (aCategory){
+selector: unescape('toggleClass%3A'),
+fn: function (aClass){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [aCategory]);
+((($receiver = smalltalk.send(self, "_isSelectedClass_", [aClass])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@selectedClasses'], "_add_", [aClass]);})() : (function(){return smalltalk.send(self['@selectedClasses'], "_remove_", [aClass]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedClasses'], "_add_", [aClass]);}), (function(){return smalltalk.send(self['@selectedClasses'], "_remove_", [aClass]);})]));
+smalltalk.send(self, "_updateClassesList", []);
 return self;}
 }),
 smalltalk.TestRunner);
@@ -3231,131 +3262,100 @@ smalltalk.TestRunner);
 
 
 
-smalltalk.addClass('IDETranscript', smalltalk.TabWidget, ['textarea'], 'IDE');
+smalltalk.addClass('Workspace', smalltalk.TabWidget, ['sourceArea'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_clearWorkspace'),
 smalltalk.method({
-selector: unescape('label'),
+selector: unescape('clearWorkspace'),
 fn: function (){
 var self=this;
-return "Transcript";
+smalltalk.send(self['@sourceArea'], "_clear", []);
 return self;}
 }),
-smalltalk.IDETranscript);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_clear'),
+unescape('_doIt'),
 smalltalk.method({
-selector: unescape('clear'),
+selector: unescape('doIt'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [""]);
+smalltalk.send(self['@sourceArea'], "_doIt", []);
 return self;}
 }),
-smalltalk.IDETranscript);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_cr'),
+unescape('_fileIn'),
 smalltalk.method({
-selector: unescape('cr'),
+selector: unescape('fileIn'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [smalltalk.send(smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val", []), "__comma", [smalltalk.send((smalltalk.String || String), "_cr", [])])]);
-return self;}
-}),
-smalltalk.IDETranscript);
-
-smalltalk.addMethod(
-unescape('_show_'),
-smalltalk.method({
-selector: unescape('show%3A'),
-fn: function (anObject){
-var self=this;
-(($receiver = self['@textarea']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self, "_open", []);})() : $receiver;
-smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [smalltalk.send(smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val", []), "__comma", [smalltalk.send(anObject, "_asString", [])])]);
+smalltalk.send(self['@sourceArea'], "_fileIn", []);
 return self;}
 }),
-smalltalk.IDETranscript);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_inspectIt'),
 smalltalk.method({
-selector: unescape('open'),
+selector: unescape('inspectIt'),
 fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_open", []);return smalltalk.send($rec, "_selectTab_", [self]);})(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []));
-return self;}
-}),
-smalltalk.IDETranscript);
-
-smalltalk.addMethod(
-unescape('_renderBoxOn_'),
-smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-fn: function (html){
-var self=this;
-(self['@textarea']=smalltalk.send(html, "_textarea", []));
-(function($rec){smalltalk.send($rec, "_class_", ["jt_transcript"]);return smalltalk.send($rec, "_at_put_", ["spellcheck", "false"]);})(self['@textarea']);
-return self;}
-}),
-smalltalk.IDETranscript);
-
-smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
-smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
-fn: function (html){
-var self=this;
-(function($rec){smalltalk.send($rec, "_with_", ["Clear transcript"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_clear", []);})]);})(smalltalk.send(html, "_button", []));
+smalltalk.send(self['@sourceArea'], "_inspectIt", []);
 return self;}
 }),
-smalltalk.IDETranscript);
-
+smalltalk.Workspace);
 
-smalltalk.IDETranscript.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('initialize'),
+selector: unescape('label'),
 fn: function (){
 var self=this;
-smalltalk.send((smalltalk.Transcript || Transcript), "_register_", [smalltalk.send(self, "_current", [])]);
+return "Workspace";
 return self;}
 }),
-smalltalk.IDETranscript.klass);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_new'),
+unescape('_printIt'),
 smalltalk.method({
-selector: unescape('new'),
+selector: unescape('printIt'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+smalltalk.send(self['@sourceArea'], "_printIt", []);
 return self;}
 }),
-smalltalk.IDETranscript.klass);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('open'),
-fn: function (){
+selector: unescape('renderBoxOn%3A'),
+fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_open", []);return smalltalk.send($rec, "_selectTab_", [smalltalk.send(self, "_current", [])]);})(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []));
+(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));
+smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);
 return self;}
 }),
-smalltalk.IDETranscript.klass);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_current'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('current'),
-fn: function (){
+selector: unescape('renderButtonsOn%3A'),
+fn: function (html){
 var self=this;
-return (($receiver = self['@current']) == nil || $receiver == undefined) ? (function(){return (self['@current']=smalltalk.send(self, "_new", [], smalltalk.TabWidget.klass));})() : $receiver;
+(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+d")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+p")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+i")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["FileIn"]);smalltalk.send($rec, "_title_", [unescape("ctrl+f")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_fileIn", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["Clear workspace"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_clearWorkspace", []);})]);})(smalltalk.send(html, "_button", []));
 return self;}
 }),
-smalltalk.IDETranscript.klass);
+smalltalk.Workspace);
+
 
 
 smalltalk.addMethod(
@@ -3393,17 +3393,11 @@ var self=this;
 var variables=nil;
 (variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 smalltalk.send(variables, "_at_put_", [unescape("%23self"), self]);
-smalltalk.send(variables, "_at_put_", [unescape("%23year"), smalltalk.send(self, "_year", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23month"), smalltalk.send(self, "_month", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23day"), smalltalk.send(self, "_day", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23hours"), smalltalk.send(self, "_hours", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23minutes"), smalltalk.send(self, "_minutes", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23seconds"), smalltalk.send(self, "_seconds", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23milliseconds"), smalltalk.send(self, "_milliseconds", [])]);
+smalltalk.send(self, "_withIndexDo_", [(function(each, i){return smalltalk.send(variables, "_at_put_", [i, each]);})]);
 (function($rec){smalltalk.send($rec, "_setLabel_", [smalltalk.send(self, "_printString", [])]);return smalltalk.send($rec, "_setVariables_", [variables]);})(anInspector);
 return self;}
 }),
-smalltalk.Date);
+smalltalk.Collection);
 
 smalltalk.addMethod(
 unescape('_inspectOn_'),
@@ -3414,11 +3408,12 @@ var self=this;
 var variables=nil;
 (variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 smalltalk.send(variables, "_at_put_", [unescape("%23self"), self]);
-smalltalk.send(self, "_withIndexDo_", [(function(each, i){return smalltalk.send(variables, "_at_put_", [i, each]);})]);
+smalltalk.send(variables, "_at_put_", [unescape("%23keys"), smalltalk.send(self, "_keys", [])]);
+smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(variables, "_at_put_", [key, value]);})]);
 (function($rec){smalltalk.send($rec, "_setLabel_", [smalltalk.send(self, "_printString", [])]);return smalltalk.send($rec, "_setVariables_", [variables]);})(anInspector);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
 unescape('_inspectOn_'),
@@ -3443,15 +3438,11 @@ var self=this;
 var variables=nil;
 (variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 smalltalk.send(variables, "_at_put_", [unescape("%23self"), self]);
-smalltalk.send(variables, "_at_put_", [unescape("%23home"), smalltalk.send(self, "_home", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23receiver"), smalltalk.send(self, "_receiver", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23selector"), smalltalk.send(self, "_selector", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23temps"), smalltalk.send(self, "_temps", [])]);
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_instanceVariableNames", []), "_do_", [(function(each){return smalltalk.send(variables, "_at_put_", [each, smalltalk.send(self, "_instVarAt_", [each])]);})]);
+smalltalk.send(self['@elements'], "_withIndexDo_", [(function(each, i){return smalltalk.send(variables, "_at_put_", [i, each]);})]);
 (function($rec){smalltalk.send($rec, "_setLabel_", [smalltalk.send(self, "_printString", [])]);return smalltalk.send($rec, "_setVariables_", [variables]);})(anInspector);
 return self;}
 }),
-smalltalk.MethodContext);
+smalltalk.Set);
 
 smalltalk.addMethod(
 unescape('_inspectOn_'),
@@ -3483,11 +3474,17 @@ var self=this;
 var variables=nil;
 (variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 smalltalk.send(variables, "_at_put_", [unescape("%23self"), self]);
-smalltalk.send(self['@elements'], "_withIndexDo_", [(function(each, i){return smalltalk.send(variables, "_at_put_", [i, each]);})]);
+smalltalk.send(variables, "_at_put_", [unescape("%23year"), smalltalk.send(self, "_year", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23month"), smalltalk.send(self, "_month", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23day"), smalltalk.send(self, "_day", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23hours"), smalltalk.send(self, "_hours", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23minutes"), smalltalk.send(self, "_minutes", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23seconds"), smalltalk.send(self, "_seconds", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23milliseconds"), smalltalk.send(self, "_milliseconds", [])]);
 (function($rec){smalltalk.send($rec, "_setLabel_", [smalltalk.send(self, "_printString", [])]);return smalltalk.send($rec, "_setVariables_", [variables]);})(anInspector);
 return self;}
 }),
-smalltalk.Set);
+smalltalk.Date);
 
 smalltalk.addMethod(
 unescape('_inspectOn_'),
@@ -3498,10 +3495,13 @@ var self=this;
 var variables=nil;
 (variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 smalltalk.send(variables, "_at_put_", [unescape("%23self"), self]);
-smalltalk.send(variables, "_at_put_", [unescape("%23keys"), smalltalk.send(self, "_keys", [])]);
-smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(variables, "_at_put_", [key, value]);})]);
+smalltalk.send(variables, "_at_put_", [unescape("%23home"), smalltalk.send(self, "_home", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23receiver"), smalltalk.send(self, "_receiver", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23selector"), smalltalk.send(self, "_selector", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23temps"), smalltalk.send(self, "_temps", [])]);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_instanceVariableNames", []), "_do_", [(function(each){return smalltalk.send(variables, "_at_put_", [each, smalltalk.send(self, "_instVarAt_", [each])]);})]);
 (function($rec){smalltalk.send($rec, "_setLabel_", [smalltalk.send(self, "_printString", [])]);return smalltalk.send($rec, "_setVariables_", [variables]);})(anInspector);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.MethodContext);
 
diff --git a/amber/src/js/IDE.js b/amber/src/js/IDE.js
index 6f5ea044eff..6043ca4e7f5 100755
--- a/amber/src/js/IDE.js
+++ b/amber/src/js/IDE.js
@@ -1,748 +1,745 @@
 smalltalk.addPackage('IDE', {});
-smalltalk.addClass('TabManager', smalltalk.Widget, ['selectedTab', 'tabs', 'opened', 'ul', 'input'], 'IDE');
+smalltalk.addClass('ClassesList', smalltalk.Widget, ['browser', 'ul', 'nodes'], 'IDE');
 smalltalk.addMethod(
-unescape('_tabs'),
+unescape('_browser'),
 smalltalk.method({
-selector: unescape('tabs'),
+selector: unescape('browser'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return (($receiver = self['@tabs']) == nil || $receiver == undefined) ? (function(){return (self['@tabs']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return self['@browser'];
 return self;},
 args: [],
-source: unescape('tabs%0A%20%20%20%20%5Etabs%20ifNil%3A%20%5Btabs%20%3A%3D%20Array%20new%5D'),
-messageSends: ["ifNil:", "new"],
-referencedClasses: ["Array"]
+source: unescape('browser%0A%09%5Ebrowser'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_labelFor_'),
+unescape('_browser_'),
 smalltalk.method({
-selector: unescape('labelFor%3A'),
+selector: unescape('browser%3A'),
 category: 'accessing',
-fn: function (aWidget){
+fn: function (aBrowser){
 var self=this;
-var label=nil;
-var maxSize=nil;
-(maxSize=(15));
-(label=smalltalk.send(smalltalk.send(aWidget, "_label", []), "_copyFrom_to_", [(0), smalltalk.send(smalltalk.send(smalltalk.send(aWidget, "_label", []), "_size", []), "_min_", [maxSize])]));
-((($receiver = ((($receiver = smalltalk.send(smalltalk.send(aWidget, "_label", []), "_size", [])).klass === smalltalk.Number) ? $receiver >maxSize : smalltalk.send($receiver, "__gt", [maxSize]))).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (label=smalltalk.send(label, "__comma", ["..."]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (label=smalltalk.send(label, "__comma", ["..."]));})]));
-return label;
+(self['@browser']=aBrowser);
 return self;},
-args: ["aWidget"],
-source: unescape('labelFor%3A%20aWidget%0A%09%7C%20label%20maxSize%20%7C%0A%09maxSize%20%3A%3D%2015.%0A%09label%20%3A%3D%20aWidget%20label%20copyFrom%3A%200%20to%3A%20%28aWidget%20label%20size%20min%3A%20maxSize%29.%0A%09aWidget%20label%20size%20%3E%20maxSize%20ifTrue%3A%20%5B%0A%09%09label%20%3A%3D%20label%2C%20%27...%27%5D.%0A%09%5Elabel'),
-messageSends: ["copyFrom:to:", "label", "min:", "size", "ifTrue:", unescape("%3E"), unescape("%2C")],
+args: ["aBrowser"],
+source: unescape('browser%3A%20aBrowser%0A%09browser%20%3A%3D%20aBrowser'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_updateBodyMargin'),
+unescape('_category'),
 smalltalk.method({
-selector: unescape('updateBodyMargin'),
-category: 'actions',
+selector: unescape('category'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_setBodyMargin_", [smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_height", [])]);
+return smalltalk.send(smalltalk.send(self, "_browser", []), "_selectedPackage", []);
 return self;},
 args: [],
-source: unescape('updateBodyMargin%0A%20%20%20%20self%20setBodyMargin%3A%20%27%23jtalk%27%20asJQuery%20height'),
-messageSends: ["setBodyMargin:", "height", "asJQuery"],
+source: unescape('category%0A%09%5Eself%20browser%20selectedPackage'),
+messageSends: ["selectedPackage", "browser"],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_updatePosition'),
+unescape('_getNodes'),
 smalltalk.method({
-selector: unescape('updatePosition'),
-category: 'actions',
+selector: unescape('getNodes'),
+category: 'accessing',
 fn: function (){
 var self=this;
-jQuery('#jtalk').css('top', '').css('bottom', '0px');
+var classes=nil;
+var children=nil;
+var others=nil;
+(classes=smalltalk.send(smalltalk.send(self, "_browser", []), "_classes", []));
+(children=[]);
+(others=[]);
+smalltalk.send(classes, "_do_", [(function(each){return ((($receiver = smalltalk.send(classes, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
+return smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassesListNode || ClassesListNode), "_on_browser_classes_level_", [each, smalltalk.send(self, "_browser", []), others, (0)]);})]);
 return self;},
 args: [],
-source: unescape('updatePosition%0A%20%20%20%20%3CjQuery%28%27%23jtalk%27%29.css%28%27top%27%2C%20%27%27%29.css%28%27bottom%27%2C%20%270px%27%29%3E'),
-messageSends: [],
-referencedClasses: []
+source: unescape('getNodes%0A%09%7C%20classes%20children%20others%20%7C%0A%09classes%20%3A%3D%20self%20browser%20classes.%0A%09children%20%3A%3D%20%23%28%29.%0A%09others%20%3A%3D%20%23%28%29.%0A%09classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%28classes%20includes%3A%20each%20superclass%29%0A%09%09%09ifFalse%3A%20%5Bchildren%20add%3A%20each%5D%0A%09%09%09ifTrue%3A%20%5Bothers%20add%3A%20each%5D%5D.%0A%09%5Echildren%20collect%3A%20%5B%3Aeach%20%7C%0A%09%09ClassesListNode%20on%3A%20each%20browser%3A%20self%20browser%20classes%3A%20others%20level%3A%200%5D'),
+messageSends: ["classes", "browser", "do:", "ifFalse:ifTrue:", "includes:", "superclass", "add:", "collect:", "on:browser:classes:level:"],
+referencedClasses: ["ClassesListNode"]
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_removeBodyMargin'),
+unescape('_nodes'),
 smalltalk.method({
-selector: unescape('removeBodyMargin'),
-category: 'actions',
+selector: unescape('nodes'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_setBodyMargin_", [(0)]);
+(($receiver = self['@nodes']) == nil || $receiver == undefined) ? (function(){return (self['@nodes']=smalltalk.send(self, "_getNodes", []));})() : $receiver;
+return self['@nodes'];
 return self;},
 args: [],
-source: unescape('removeBodyMargin%0A%20%20%20%20self%20setBodyMargin%3A%200'),
-messageSends: ["setBodyMargin:"],
-referencedClasses: []
-}),
-smalltalk.TabManager);
-
-smalltalk.addMethod(
-unescape('_setBodyMargin_'),
-smalltalk.method({
-selector: unescape('setBodyMargin%3A'),
-category: 'actions',
-fn: function (anInteger){
-var self=this;
-smalltalk.send(smalltalk.send(".jtalkBody", "_asJQuery", []), "_css_put_", [unescape("margin-bottom"), smalltalk.send(smalltalk.send(anInteger, "_asString", []), "__comma", ["px"])]);
-return self;},
-args: ["anInteger"],
-source: unescape('setBodyMargin%3A%20anInteger%0A%20%20%20%20%27.jtalkBody%27%20asJQuery%20css%3A%20%27margin-bottom%27%20put%3A%20anInteger%20asString%2C%20%27px%27'),
-messageSends: ["css:put:", "asJQuery", unescape("%2C"), "asString"],
+source: unescape('nodes%0A%09nodes%20ifNil%3A%20%5Bnodes%20%3A%3D%20self%20getNodes%5D.%0A%09%5Enodes'),
+messageSends: ["ifNil:", "getNodes"],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_onResize_'),
+unescape('_renderOn_'),
 smalltalk.method({
-selector: unescape('onResize%3A'),
-category: 'actions',
-fn: function (aBlock){
+selector: unescape('renderOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-jQuery('#jtalk').resizable({
-	handles: 'n', 
-	resize: aBlock,
-	minHeight: 230
-});
+(self['@ul']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column browser classes"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_ul", [])));
+smalltalk.send(self, "_updateNodes", []);
 return self;},
-args: ["aBlock"],
-source: unescape('onResize%3A%20aBlock%0A%20%20%20%20%3CjQuery%28%27%23jtalk%27%29.resizable%28%7B%0A%09handles%3A%20%27n%27%2C%20%0A%09resize%3A%20aBlock%2C%0A%09minHeight%3A%20230%0A%7D%29%3E'),
-messageSends: [],
+args: ["html"],
+source: unescape('renderOn%3A%20html%0A%09ul%20%3A%3D%20html%20ul%0A%09%09class%3A%20%27jt_column%20browser%20classes%27%3B%0A%09%09yourself.%0A%09self%20updateNodes'),
+messageSends: ["class:", "yourself", "ul", "updateNodes"],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_onWindowResize_'),
+unescape('_resetNodes'),
 smalltalk.method({
-selector: unescape('onWindowResize%3A'),
-category: 'actions',
-fn: function (aBlock){
+selector: unescape('resetNodes'),
+category: 'accessing',
+fn: function (){
 var self=this;
-jQuery(window).resize(aBlock);
+(self['@nodes']=nil);
 return self;},
-args: ["aBlock"],
-source: unescape('onWindowResize%3A%20aBlock%0A%20%20%20%20%3CjQuery%28window%29.resize%28aBlock%29%3E'),
+args: [],
+source: unescape('resetNodes%0A%09nodes%20%3A%3D%20nil'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_updateNodes'),
 smalltalk.method({
-selector: unescape('open'),
-category: 'actions',
+selector: unescape('updateNodes'),
+category: 'rendering',
 fn: function (){
 var self=this;
-((($receiver = self['@opened']).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_show", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_show", []);smalltalk.send(self, "_updateBodyMargin", []);smalltalk.send(self['@selectedTab'], "_show", []);return (self['@opened']=true);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_show", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_show", []);smalltalk.send(self, "_updateBodyMargin", []);smalltalk.send(self['@selectedTab'], "_show", []);return (self['@opened']=true);})]));
+smalltalk.send(self['@ul'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_nodes", []), "_do_", [(function(each){return smalltalk.send(each, "_renderOn_", [html]);})]);})]);
 return self;},
 args: [],
-source: unescape('open%0A%20%20%20%20opened%20ifFalse%3A%20%5B%0A%09%27body%27%20asJQuery%20addClass%3A%20%27jtalkBody%27.%0A%09%27%23jtalk%27%20asJQuery%20show.%0A%09ul%20asJQuery%20show.%0A%09self%20updateBodyMargin.%0A%09selectedTab%20show.%0A%09opened%20%3A%3D%20true%5D'),
-messageSends: ["ifFalse:", "addClass:", "asJQuery", "show", "updateBodyMargin"],
+source: unescape('updateNodes%0A%09ul%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09self%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%09each%20renderOn%3A%20html%5D%5D'),
+messageSends: ["contents:", "do:", "nodes", "renderOn:"],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList);
+
 
 smalltalk.addMethod(
-unescape('_close'),
+unescape('_on_'),
 smalltalk.method({
-selector: unescape('close'),
-category: 'actions',
-fn: function (){
+selector: unescape('on%3A'),
+category: 'instance creation',
+fn: function (aBrowser){
 var self=this;
-((($receiver = self['@opened']).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_hide", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_hide", []);smalltalk.send(self['@selectedTab'], "_hide", []);smalltalk.send(self, "_removeBodyMargin", []);smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["jtalkBody"]);return (self['@opened']=false);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_hide", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_hide", []);smalltalk.send(self['@selectedTab'], "_hide", []);smalltalk.send(self, "_removeBodyMargin", []);smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["jtalkBody"]);return (self['@opened']=false);})]));
+return (function($rec){smalltalk.send($rec, "_browser_", [aBrowser]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-args: [],
-source: unescape('close%0A%20%20%20%20opened%20ifTrue%3A%20%5B%0A%09%27%23jtalk%27%20asJQuery%20hide.%0A%09ul%20asJQuery%20hide.%0A%09selectedTab%20hide.%0A%09self%20removeBodyMargin.%0A%09%27body%27%20asJQuery%20removeClass%3A%20%27jtalkBody%27.%0A%09opened%20%3A%3D%20false%5D'),
-messageSends: ["ifTrue:", "hide", "asJQuery", "removeBodyMargin", "removeClass:"],
+args: ["aBrowser"],
+source: unescape('on%3A%20aBrowser%0A%09%5Eself%20new%20%0A%09%09browser%3A%20aBrowser%3B%20%0A%09%09yourself'),
+messageSends: ["browser:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesList.klass);
+
 
+smalltalk.addClass('ClassesListNode', smalltalk.Widget, ['browser', 'theClass', 'level', 'nodes'], 'IDE');
 smalltalk.addMethod(
-unescape('_newBrowserTab'),
+unescape('_browser'),
 smalltalk.method({
-selector: unescape('newBrowserTab'),
-category: 'actions',
+selector: unescape('browser'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send((smalltalk.Browser || Browser), "_open", []);
+return self['@browser'];
 return self;},
 args: [],
-source: unescape('newBrowserTab%0A%20%20%20%20Browser%20open'),
-messageSends: ["open"],
-referencedClasses: ["Browser"]
+source: unescape('browser%0A%09%5Ebrowser'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_selectTab_'),
+unescape('_browser_'),
 smalltalk.method({
-selector: unescape('selectTab%3A'),
-category: 'actions',
-fn: function (aWidget){
+selector: unescape('browser%3A'),
+category: 'accessing',
+fn: function (aBrowser){
 var self=this;
-smalltalk.send(self, "_open", []);
-(self['@selectedTab']=aWidget);
-smalltalk.send(smalltalk.send(self, "_tabs", []), "_do_", [(function(each){return smalltalk.send(each, "_hide", []);})]);
-smalltalk.send(aWidget, "_show", []);
-smalltalk.send(self, "_update", []);
+(self['@browser']=aBrowser);
 return self;},
-args: ["aWidget"],
-source: unescape('selectTab%3A%20aWidget%0A%20%20%20%20self%20open.%0A%20%20%20%20selectedTab%20%3A%3D%20aWidget.%0A%20%20%20%20self%20tabs%20do%3A%20%5B%3Aeach%20%7C%0A%09each%20hide%5D.%0A%20%20%20%20aWidget%20show.%0A%09%0A%20%20%20%20self%20update'),
-messageSends: ["open", "do:", "tabs", "hide", "show", "update"],
+args: ["aBrowser"],
+source: unescape('browser%3A%20aBrowser%0A%09browser%20%3A%3D%20aBrowser'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_closeTab_'),
+unescape('_getNodesFrom_'),
 smalltalk.method({
-selector: unescape('closeTab%3A'),
-category: 'actions',
-fn: function (aWidget){
+selector: unescape('getNodesFrom%3A'),
+category: 'accessing',
+fn: function (aCollection){
 var self=this;
-smalltalk.send(self, "_removeTab_", [aWidget]);
-smalltalk.send(self, "_selectTab_", [smalltalk.send(smalltalk.send(self, "_tabs", []), "_last", [])]);
-smalltalk.send(aWidget, "_remove", []);
-smalltalk.send(self, "_update", []);
+var children=nil;
+var others=nil;
+(children=[]);
+(others=[]);
+smalltalk.send(aCollection, "_do_", [(function(each){return ((($receiver = smalltalk.send(smalltalk.send(each, "_superclass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
+(self['@nodes']=smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassesListNode || ClassesListNode), "_on_browser_classes_level_", [each, smalltalk.send(self, "_browser", []), others, ((($receiver = smalltalk.send(self, "_level", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})]));
 return self;},
-args: ["aWidget"],
-source: unescape('closeTab%3A%20aWidget%0A%20%20%20%20self%20removeTab%3A%20aWidget.%0A%20%20%20%20self%20selectTab%3A%20self%20tabs%20last.%0A%20%20%20%20aWidget%20remove.%0A%20%20%20%20self%20update'),
-messageSends: ["removeTab:", "selectTab:", "last", "tabs", "remove", "update"],
-referencedClasses: []
+args: ["aCollection"],
+source: unescape('getNodesFrom%3A%20aCollection%0A%09%7C%20children%20others%20%7C%0A%09children%20%3A%3D%20%23%28%29.%0A%09others%20%3A%3D%20%23%28%29.%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%28each%20superclass%20%3D%20self%20theClass%29%0A%09%09%09ifTrue%3A%20%5Bchildren%20add%3A%20each%5D%0A%09%09%09ifFalse%3A%20%5Bothers%20add%3A%20each%5D%5D.%0A%09nodes%3A%3D%20children%20collect%3A%20%5B%3Aeach%20%7C%0A%09%09ClassesListNode%20on%3A%20each%20browser%3A%20self%20browser%20classes%3A%20others%20level%3A%20self%20level%20+%201%5D'),
+messageSends: ["do:", "ifTrue:ifFalse:", unescape("%3D"), "superclass", "theClass", "add:", "collect:", "on:browser:classes:level:", "browser", unescape("+"), "level"],
+referencedClasses: ["ClassesListNode"]
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_search_'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('search%3A'),
-category: 'actions',
-fn: function (aString){
+selector: unescape('label'),
+category: 'accessing',
+fn: function (){
 var self=this;
-var searchedClass=nil;
-(searchedClass=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [aString]));
-((($receiver = smalltalk.send(searchedClass, "_isClass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [searchedClass]);})() : (function(){return smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [searchedClass]);}), (function(){return smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);})]));
+var str=nil;
+(str=smalltalk.send(smalltalk.send((smalltalk.String || String), "_new", []), "_writeStream", []));
+smalltalk.send(smalltalk.send(self, "_level", []), "_timesRepeat_", [(function(){return smalltalk.send(str, "_nextPutAll_", [unescape("%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B")]);})]);
+smalltalk.send(str, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_theClass", []), "_name", [])]);
+return smalltalk.send(str, "_contents", []);
 return self;},
-args: ["aString"],
-source: unescape('search%3A%20aString%0A%09%7C%20searchedClass%20%7C%0A%09searchedClass%20%3A%3D%20Smalltalk%20current%20at%3A%20aString.%0A%09%09searchedClass%20isClass%0A%09%09%09ifTrue%3A%20%5BBrowser%20openOn%3A%20searchedClass%5D%0A%09%09%09ifFalse%3A%20%5BReferencesBrowser%20search%3A%20aString%5D'),
-messageSends: ["at:", "current", "ifTrue:ifFalse:", "isClass", "openOn:", "search:"],
-referencedClasses: ["Smalltalk", "Browser", "ReferencesBrowser"]
+args: [],
+source: unescape('label%0A%09%7C%20str%20%7C%0A%09str%20%3A%3D%20String%20new%20writeStream.%0A%09self%20level%20timesRepeat%3A%20%5B%0A%09%09str%20nextPutAll%3A%20%27%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%27%5D.%0A%09str%20nextPutAll%3A%20self%20theClass%20name.%0A%09%5Estr%20contents'),
+messageSends: ["writeStream", "new", "timesRepeat:", "level", "nextPutAll:", "name", "theClass", "contents"],
+referencedClasses: ["String"]
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_addTab_'),
+unescape('_level'),
 smalltalk.method({
-selector: unescape('addTab%3A'),
-category: 'adding/Removing',
-fn: function (aWidget){
+selector: unescape('level'),
+category: 'accessing',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_tabs", []), "_add_", [aWidget]);
-smalltalk.send(aWidget, "_appendToJQuery_", [smalltalk.send(unescape("%23jtalk"), "_asJQuery", [])]);
-smalltalk.send(aWidget, "_hide", []);
+return self['@level'];
 return self;},
-args: ["aWidget"],
-source: unescape('addTab%3A%20aWidget%0A%20%20%20%20self%20tabs%20add%3A%20aWidget.%0A%20%20%20%20aWidget%20appendToJQuery%3A%20%27%23jtalk%27%20asJQuery.%0A%20%20%20%20aWidget%20hide'),
-messageSends: ["add:", "tabs", "appendToJQuery:", "asJQuery", "hide"],
+args: [],
+source: unescape('level%0A%09%5Elevel'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_removeTab_'),
+unescape('_level_'),
 smalltalk.method({
-selector: unescape('removeTab%3A'),
-category: 'adding/Removing',
-fn: function (aWidget){
+selector: unescape('level%3A'),
+category: 'accessing',
+fn: function (anInteger){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_tabs", []), "_remove_", [aWidget]);
-smalltalk.send(self, "_update", []);
+(self['@level']=anInteger);
 return self;},
-args: ["aWidget"],
-source: unescape('removeTab%3A%20aWidget%0A%20%20%20%20self%20tabs%20remove%3A%20aWidget.%0A%20%20%20%20self%20update'),
-messageSends: ["remove:", "tabs", "update"],
+args: ["anInteger"],
+source: unescape('level%3A%20anInteger%0A%09level%20%3A%3D%20anInteger'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_nodes'),
 smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
+selector: unescape('nodes'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Widget);
-(self['@opened']=true);
-smalltalk.send((function(html){return smalltalk.send(smalltalk.send(html, "_div", []), "_id_", ["jtalk"]);}), "_appendToJQuery_", [smalltalk.send("body", "_asJQuery", [])]);
-smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);
-smalltalk.send(self, "_appendToJQuery_", [smalltalk.send(unescape("%23jtalk"), "_asJQuery", [])]);
-(function($rec){smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.IDETranscript || IDETranscript), "_current", [])]);smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.Workspace || Workspace), "_new", [])]);return smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.TestRunner || TestRunner), "_new", [])]);})(self);
-smalltalk.send(self, "_selectTab_", [smalltalk.send(smalltalk.send(self, "_tabs", []), "_last", [])]);
-(function($rec){smalltalk.send($rec, "_onResize_", [(function(){return (function($rec){smalltalk.send($rec, "_updateBodyMargin", []);return smalltalk.send($rec, "_updatePosition", []);})(self);})]);return smalltalk.send($rec, "_onWindowResize_", [(function(){return smalltalk.send(self, "_updatePosition", []);})]);})(self);
+return self['@nodes'];
 return self;},
 args: [],
-source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20opened%20%3A%3D%20true.%0A%20%20%20%20%5B%3Ahtml%20%7C%20html%20div%20id%3A%20%27jtalk%27%5D%20appendToJQuery%3A%20%27body%27%20asJQuery.%0A%20%20%20%20%27body%27%20asJQuery%20%0A%09addClass%3A%20%27jtalkBody%27.%0A%20%20%20%20self%20appendToJQuery%3A%20%27%23jtalk%27%20asJQuery.%0A%20%20%20%20self%20%0A%09addTab%3A%20IDETranscript%20current%3B%0A%09addTab%3A%20Workspace%20new%3B%0A%09addTab%3A%20TestRunner%20new.%0A%20%20%20%20self%20selectTab%3A%20self%20tabs%20last.%0A%20%20%20%20self%20%0A%09onResize%3A%20%5Bself%20updateBodyMargin%3B%20updatePosition%5D%3B%0A%09onWindowResize%3A%20%5Bself%20updatePosition%5D'),
-messageSends: ["initialize", "appendToJQuery:", "id:", "div", "asJQuery", "addClass:", "addTab:", "current", "new", "selectTab:", "last", "tabs", "onResize:", "updateBodyMargin", "updatePosition", "onWindowResize:"],
-referencedClasses: ["IDETranscript", "Workspace", "TestRunner"]
+source: unescape('nodes%0A%09%5Enodes'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
 unescape('_renderOn_'),
 smalltalk.method({
 selector: unescape('renderOn%3A'),
-category: 'rendering',
+category: '',
 fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(html, "_div", []), "_id_", ["logo"]);
-smalltalk.send(self, "_renderToolbarOn_", [html]);
-(self['@ul']=(function($rec){smalltalk.send($rec, "_id_", ["jtalkTabs"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_ul", [])));
-smalltalk.send(self, "_renderTabs", []);
+var li=nil;
+var cssClass=nil;
+(cssClass="");
+(li=smalltalk.send(smalltalk.send(html, "_li", []), "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_browser", []), "_selectClass_", [smalltalk.send(self, "_theClass", [])]);})]));
+smalltalk.send(smalltalk.send(li, "_asJQuery", []), "_html_", [smalltalk.send(self, "_label", [])]);
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_browser", []), "_selectedClass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" selected"]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" selected"]));})]));
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_theClass", []), "_comment", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" commented"]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" commented"]));})]));
+smalltalk.send(li, "_class_", [cssClass]);
+smalltalk.send(smalltalk.send(self, "_nodes", []), "_do_", [(function(each){return smalltalk.send(each, "_renderOn_", [html]);})]);
 return self;},
 args: ["html"],
-source: unescape('renderOn%3A%20html%0A%09html%20div%20id%3A%20%27logo%27.%0A%09self%20renderToolbarOn%3A%20html.%0A%09ul%20%3A%3D%20html%20ul%0A%09%09id%3A%20%27jtalkTabs%27%3B%0A%09%09yourself.%0A%09self%20renderTabs'),
-messageSends: ["id:", "div", "renderToolbarOn:", "yourself", "ul", "renderTabs"],
+source: unescape('renderOn%3A%20html%0A%09%7C%20li%20cssClass%20%7C%0A%09cssClass%20%3A%3D%20%27%27.%0A%09li%20%3A%3D%20html%20li%20%0A%09%09onClick%3A%20%5Bself%20browser%20selectClass%3A%20self%20theClass%5D.%20%0A%09li%20asJQuery%20html%3A%20self%20label.%0A%0A%09self%20browser%20selectedClass%20%3D%20self%20theClass%20ifTrue%3A%20%20%5B%0A%09%09cssClass%20%3A%3D%20cssClass%2C%20%27%20selected%27%5D.%0A%0A%09self%20theClass%20comment%20isEmpty%20ifFalse%3A%20%5B%0A%09%09cssClass%20%3A%3D%20cssClass%2C%20%27%20commented%27%5D.%0A%0A%09li%20class%3A%20cssClass.%0A%0A%09self%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09each%20renderOn%3A%20html%5D'),
+messageSends: ["onClick:", "li", "selectClass:", "browser", "theClass", "html:", "asJQuery", "label", "ifTrue:", unescape("%3D"), "selectedClass", unescape("%2C"), "ifFalse:", "isEmpty", "comment", "class:", "do:", "nodes", "renderOn:"],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_renderTabFor_on_'),
+unescape('_theClass'),
 smalltalk.method({
-selector: unescape('renderTabFor%3Aon%3A'),
-category: 'rendering',
-fn: function (aWidget, html){
+selector: unescape('theClass'),
+category: 'accessing',
+fn: function (){
 var self=this;
-var li=nil;
-(li=smalltalk.send(html, "_li", []));
-((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [aWidget])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));
-(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", [(function(){((($receiver = smalltalk.send(aWidget, "_canBeClosed", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})]));return smalltalk.send(smalltalk.send(html, "_span", []), "_with_", [smalltalk.send(self, "_labelFor_", [aWidget])]);})]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [aWidget]);})]);})(li);
+return self['@theClass'];
 return self;},
-args: ["aWidget", "html"],
-source: unescape('renderTabFor%3A%20aWidget%20on%3A%20html%0A%09%7C%20li%20%7C%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20aWidget%20ifTrue%3A%20%5B%0A%09li%20class%3A%20%27selected%27%5D.%0A%09li%20with%3A%20%5B%0A%09%09html%20span%20class%3A%20%27ltab%27.%0A%09%09html%20span%0A%09%09%09class%3A%20%27mtab%27%3B%0A%09%09%09with%3A%20%5B%0A%09%09%09%09aWidget%20canBeClosed%20ifTrue%3A%20%5B%0A%09%09%09%09%09html%20span%20%0A%09%09%09%09%09%09class%3A%20%27close%27%3B%0A%09%09%09%09%09%09with%3A%20%27x%27%3B%0A%09%09%09%09%09onClick%3A%20%5Bself%20closeTab%3A%20aWidget%5D%5D.%0A%09%09%09html%20span%20with%3A%20%28self%20labelFor%3A%20aWidget%29%5D.%0A%09%09html%20span%20class%3A%20%27rtab%27%5D%3B%0A%09onClick%3A%20%5Bself%20selectTab%3A%20aWidget%5D'),
-messageSends: ["li", "ifTrue:", unescape("%3D"), "class:", "with:", "span", "canBeClosed", "onClick:", "closeTab:", "labelFor:", "selectTab:"],
+args: [],
+source: unescape('theClass%0A%09%5EtheClass'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
 
 smalltalk.addMethod(
-unescape('_renderTabs'),
+unescape('_theClass_'),
 smalltalk.method({
-selector: unescape('renderTabs'),
-category: 'rendering',
-fn: function (){
+selector: unescape('theClass%3A'),
+category: 'accessing',
+fn: function (aClass){
 var self=this;
-smalltalk.send(self['@ul'], "_contents_", [(function(html){smalltalk.send(smalltalk.send(self, "_tabs", []), "_do_", [(function(each){return smalltalk.send(self, "_renderTabFor_on_", [each, html]);})]);return (function($rec){smalltalk.send($rec, "_class_", ["newtab"]);smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", [unescape("%20+%20")]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_newBrowserTab", []);})]);})(smalltalk.send(html, "_li", []));})]);
+(self['@theClass']=aClass);
 return self;},
-args: [],
-source: unescape('renderTabs%0A%09ul%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%20%20%20%20self%20tabs%20do%3A%20%5B%3Aeach%20%7C%0A%09%09self%20renderTabFor%3A%20each%20on%3A%20html%5D.%0A%09%20%20%20%20html%20li%0A%09%09class%3A%20%27newtab%27%3B%0A%09%09with%3A%20%5B%0A%09%09%09html%20span%20class%3A%20%27ltab%27.%0A%09%09%09html%20span%20class%3A%20%27mtab%27%3B%20with%3A%20%27%20+%20%27.%0A%09%09%09html%20span%20class%3A%20%27rtab%27%5D%3B%0A%09%09onClick%3A%20%5Bself%20newBrowserTab%5D%5D'),
-messageSends: ["contents:", "do:", "tabs", "renderTabFor:on:", "class:", "with:", "span", "onClick:", "newBrowserTab", "li"],
+args: ["aClass"],
+source: unescape('theClass%3A%20aClass%0A%09theClass%20%3A%3D%20aClass'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode);
+
 
 smalltalk.addMethod(
-unescape('_renderToolbarOn_'),
+unescape('_on_browser_classes_level_'),
 smalltalk.method({
-selector: unescape('renderToolbarOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('on%3Abrowser%3Aclasses%3Alevel%3A'),
+category: 'instance creation',
+fn: function (aClass, aBrowser, aCollection, anInteger){
 var self=this;
-(function($rec){smalltalk.send($rec, "_id_", ["jt_toolbar"]);return smalltalk.send($rec, "_with_", [(function(){(self['@input']=(function($rec){smalltalk.send($rec, "_class_", ["implementors"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_input", [])));smalltalk.send(self['@input'], "_onKeyPress_", [(function(event){return ((($receiver = smalltalk.send(smalltalk.send(event, "_keyCode", []), "__eq", [(13)])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);})]));})]);return (function($rec){smalltalk.send($rec, "_id_", ["jt_close"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_close", []);})]);})(smalltalk.send(html, "_div", []));})]);})(smalltalk.send(html, "_div", []));
+return (function($rec){smalltalk.send($rec, "_theClass_", [aClass]);smalltalk.send($rec, "_browser_", [aBrowser]);smalltalk.send($rec, "_level_", [anInteger]);smalltalk.send($rec, "_getNodesFrom_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-args: ["html"],
-source: unescape('renderToolbarOn%3A%20html%0A%09html%20div%20%0A%09%09id%3A%20%27jt_toolbar%27%3B%0A%09%09with%3A%20%5B%0A%09%09%09input%20%3A%3D%20html%20input%20%0A%09%09%09%09class%3A%20%27implementors%27%3B%0A%09%09%09%09yourself.%0A%09%09%09input%20onKeyPress%3A%20%5B%3Aevent%20%7C%0A%09%09%09%09event%20keyCode%20%3D%2013%20ifTrue%3A%20%5B%0A%09%09%09%09self%20search%3A%20input%20asJQuery%20val%5D%5D.%0A%09%09%09html%20div%20id%3A%20%27jt_close%27%3B%20onClick%3A%20%5Bself%20close%5D%5D'),
-messageSends: ["id:", "with:", "class:", "yourself", "input", "onKeyPress:", "ifTrue:", unescape("%3D"), "keyCode", "search:", "val", "asJQuery", "onClick:", "close", "div"],
+args: ["aClass", "aBrowser", "aCollection", "anInteger"],
+source: unescape('on%3A%20aClass%20browser%3A%20aBrowser%20classes%3A%20aCollection%20level%3A%20anInteger%0A%09%5Eself%20new%0A%09%09theClass%3A%20aClass%3B%0A%09%09browser%3A%20aBrowser%3B%0A%09%09level%3A%20anInteger%3B%0A%09%09getNodesFrom%3A%20aCollection%3B%0A%09%09yourself'),
+messageSends: ["theClass:", "browser:", "level:", "getNodesFrom:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.TabManager);
+smalltalk.ClassesListNode.klass);
 
+
+smalltalk.addClass('DebugErrorHandler', smalltalk.ErrorHandler, [], 'IDE');
 smalltalk.addMethod(
-unescape('_update'),
+unescape('_handleError_'),
 smalltalk.method({
-selector: unescape('update'),
-category: 'updating',
-fn: function (){
+selector: unescape('handleError%3A'),
+category: 'error handling',
+fn: function (anError){
 var self=this;
-smalltalk.send(self, "_renderTabs", []);
+smalltalk.send((function(){return (function($rec){smalltalk.send($rec, "_error_", [anError]);return smalltalk.send($rec, "_open", []);})(smalltalk.send((smalltalk.Debugger || Debugger), "_new", []));}), "_on_do_", [(smalltalk.Error || Error), (function(error){return smalltalk.send(smalltalk.send((smalltalk.ErrorHandler || ErrorHandler), "_new", []), "_handleError_", [error]);})]);
 return self;},
-args: [],
-source: unescape('update%0A%09self%20renderTabs'),
-messageSends: ["renderTabs"],
-referencedClasses: []
+args: ["anError"],
+source: unescape('handleError%3A%20anError%0A%09%5BDebugger%20new%0A%09%09error%3A%20anError%3B%0A%09%09open%5D%20on%3A%20Error%20do%3A%20%5B%3Aerror%20%7C%0A%09%09%09ErrorHandler%20new%20handleError%3A%20error%5D'),
+messageSends: ["on:do:", "error:", "open", "new", "handleError:"],
+referencedClasses: ["Debugger", "Error", "ErrorHandler"]
 }),
-smalltalk.TabManager);
+smalltalk.DebugErrorHandler);
 
 
-smalltalk.TabManager.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_current'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('current'),
-category: 'instance creation',
+selector: unescape('initialize'),
+category: 'initialization',
 fn: function (){
 var self=this;
-return (($receiver = self['@current']) == nil || $receiver == undefined) ? (function(){return (self['@current']=smalltalk.send(self, "_new", [], smalltalk.Widget.klass));})() : $receiver;
+smalltalk.send(self, "_register", []);
 return self;},
 args: [],
-source: unescape('current%0A%20%20%20%20%5Ecurrent%20ifNil%3A%20%5Bcurrent%20%3A%3D%20super%20new%5D'),
-messageSends: ["ifNil:", "new"],
+source: unescape('initialize%0A%09self%20register'),
+messageSends: ["register"],
 referencedClasses: []
 }),
-smalltalk.TabManager.klass);
+smalltalk.DebugErrorHandler.klass);
+
 
+smalltalk.addClass('SourceArea', smalltalk.Widget, ['editor', 'div', 'receiver', 'onDoIt'], 'IDE');
 smalltalk.addMethod(
-unescape('_new'),
+unescape('_clear'),
 smalltalk.method({
-selector: unescape('new'),
-category: 'instance creation',
+selector: unescape('clear'),
+category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+smalltalk.send(self, "_val_", [""]);
 return self;},
 args: [],
-source: unescape('new%0A%20%20%20%20self%20shouldNotImplement'),
-messageSends: ["shouldNotImplement"],
+source: unescape('clear%0A%20%20%20%20%20%20self%20val%3A%20%27%27'),
+messageSends: ["val:"],
 referencedClasses: []
 }),
-smalltalk.TabManager.klass);
-
+smalltalk.SourceArea);
 
-smalltalk.addClass('TabWidget', smalltalk.Widget, ['div'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_currentLine'),
 smalltalk.method({
-selector: unescape('label'),
+selector: unescape('currentLine'),
 category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
+return smalltalk.send(self['@editor'], "_getLine_", [smalltalk.send(smalltalk.send(self['@editor'], "_getCursor", []), "_line", [])]);
 return self;},
 args: [],
-source: unescape('label%0A%20%20%20%20self%20subclassResponsibility'),
-messageSends: ["subclassResponsibility"],
+source: unescape('currentLine%0A%20%20%20%20%5Eeditor%20getLine%3A%20%28editor%20getCursor%20line%29'),
+messageSends: ["getLine:", "line", "getCursor"],
 referencedClasses: []
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_currentLineOrSelection'),
 smalltalk.method({
-selector: unescape('open'),
-category: 'actions',
+selector: unescape('currentLineOrSelection'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_addTab_", [self]);
-smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_selectTab_", [self]);
+return ((($receiver = smalltalk.send(self['@editor'], "_somethingSelected", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_currentLine", []);})() : (function(){return smalltalk.send(self, "_selection", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_currentLine", []);}), (function(){return smalltalk.send(self, "_selection", []);})]));
 return self;},
 args: [],
-source: unescape('open%0A%20%20%20%20TabManager%20current%20addTab%3A%20self.%0A%20%20%20%20TabManager%20current%20selectTab%3A%20self'),
-messageSends: ["addTab:", "current", "selectTab:"],
-referencedClasses: ["TabManager"]
+source: unescape('currentLineOrSelection%0A%20%20%20%20%5Eeditor%20somethingSelected%0A%09ifFalse%3A%20%5Bself%20currentLine%5D%0A%09ifTrue%3A%20%5Bself%20selection%5D'),
+messageSends: ["ifFalse:ifTrue:", "somethingSelected", "currentLine", "selection"],
+referencedClasses: []
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_show'),
+unescape('_doIt'),
 smalltalk.method({
-selector: unescape('show'),
+selector: unescape('doIt'),
 category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_show", []);
+var result=nil;
+(result=smalltalk.send(self, "_eval_", [smalltalk.send(self, "_currentLineOrSelection", [])]));
+(($receiver = smalltalk.send(self, "_onDoIt", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(smalltalk.send(self, "_onDoIt", []), "_value", []);})() : nil;
+return result;
 return self;},
 args: [],
-source: unescape('show%0A%09div%20asJQuery%20show'),
-messageSends: ["show", "asJQuery"],
+source: unescape('doIt%0A%20%20%20%20%7C%20result%20%7C%0A%20%20%20%20result%20%3A%3D%20self%20eval%3A%20self%20currentLineOrSelection.%0A%20%20%20%20self%20onDoIt%20ifNotNil%3A%20%5Bself%20onDoIt%20value%5D.%0A%20%20%20%20%5Eresult'),
+messageSends: ["eval:", "currentLineOrSelection", "ifNotNil:", "onDoIt", "value"],
 referencedClasses: []
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_hide'),
+unescape('_editor'),
 smalltalk.method({
-selector: unescape('hide'),
-category: 'actions',
+selector: unescape('editor'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_hide", []);
+return self['@editor'];
 return self;},
 args: [],
-source: unescape('hide%0A%09div%20asJQuery%20hide'),
-messageSends: ["hide", "asJQuery"],
+source: unescape('editor%0A%09%5Eeditor'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_remove'),
+unescape('_eval_'),
 smalltalk.method({
-selector: unescape('remove'),
+selector: unescape('eval%3A'),
 category: 'actions',
-fn: function (){
+fn: function (aString){
 var self=this;
-smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_remove", []);
-return self;},
-args: [],
-source: unescape('remove%0A%09div%20asJQuery%20remove'),
-messageSends: ["remove", "asJQuery"],
-referencedClasses: []
+try{var compiler=nil;
+(compiler=smalltalk.send((smalltalk.Compiler || Compiler), "_new", []));
+smalltalk.send((function(){return smalltalk.send(compiler, "_parseExpression_", [aString]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return (function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(ex, "_messageText", [])])}})})();})]);
+(function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send(smalltalk.send(smalltalk.send(compiler, "_load_forClass_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")]), (smalltalk.DoIt || DoIt)]), "_fn", []), "_applyTo_arguments_", [smalltalk.send(self, "_receiver", []), []])}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_eval_'){return e.fn()} throw(e)}},
+args: ["aString"],
+source: unescape('eval%3A%20aString%0A%09%7C%20compiler%20%20%7C%0A%09compiler%20%3A%3D%20Compiler%20new.%0A%09%5Bcompiler%20parseExpression%3A%20aString%5D%20on%3A%20Error%20do%3A%20%5B%3Aex%20%7C%0A%09%09%5Ewindow%20alert%3A%20ex%20messageText%5D.%0A%09%5E%28compiler%20load%3A%20%27doIt%20%5E%5B%27%2C%20aString%2C%20%27%5D%20value%27%20forClass%3A%20DoIt%29%20fn%20applyTo%3A%20self%20receiver%20arguments%3A%20%23%28%29'),
+messageSends: ["new", "on:do:", "parseExpression:", "alert:", "messageText", "applyTo:arguments:", "fn", "load:forClass:", unescape("%2C"), "receiver"],
+referencedClasses: ["Compiler", "Error", "DoIt"]
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_close'),
+unescape('_fileIn'),
 smalltalk.method({
-selector: unescape('close'),
+selector: unescape('fileIn'),
 category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_closeTab_", [self]);
+smalltalk.send(smalltalk.send((smalltalk.Importer || Importer), "_new", []), "_import_", [smalltalk.send(smalltalk.send(self, "_currentLineOrSelection", []), "_readStream", [])]);
 return self;},
 args: [],
-source: unescape('close%0A%20%20%20%20TabManager%20current%20closeTab%3A%20self'),
-messageSends: ["closeTab:", "current"],
-referencedClasses: ["TabManager"]
-}),
-smalltalk.TabWidget);
-
-smalltalk.addMethod(
-unescape('_renderOn_'),
-smalltalk.method({
-selector: unescape('renderOn%3A'),
-category: 'rendering',
-fn: function (html){
-var self=this;
-(self['@div']=(function($rec){smalltalk.send($rec, "_class_", ["jtalkTool"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_div", [])));
-smalltalk.send(self, "_renderTab", []);
-return self;},
-args: ["html"],
-source: unescape('renderOn%3A%20html%0A%09div%20%3A%3D%20html%20div%0A%09%09class%3A%20%27jtalkTool%27%3B%0A%09%09yourself.%0A%09self%20renderTab'),
-messageSends: ["class:", "yourself", "div", "renderTab"],
-referencedClasses: []
-}),
-smalltalk.TabWidget);
-
-smalltalk.addMethod(
-unescape('_renderBoxOn_'),
-smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-category: 'rendering',
-fn: function (html){
-var self=this;
-
-return self;},
-args: ["html"],
-source: unescape('renderBoxOn%3A%20html'),
-messageSends: [],
-referencedClasses: []
+source: unescape('fileIn%0A%20%20%20%20Importer%20new%20import%3A%20self%20currentLineOrSelection%20readStream'),
+messageSends: ["import:", "new", "readStream", "currentLineOrSelection"],
+referencedClasses: ["Importer"]
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
+unescape('_handleKeyDown_'),
 smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('handleKeyDown%3A'),
+category: 'actions',
+fn: function (anEvent){
 var self=this;
-
+if(anEvent.ctrlKey) {
+		if(anEvent.keyCode === 80) { //ctrl+p
+			self._printIt();
+			anEvent.preventDefault();
+			return false;
+		}
+		if(anEvent.keyCode === 68) { //ctrl+d
+			self._doIt();
+			anEvent.preventDefault();
+			return false;
+		}
+		if(anEvent.keyCode === 73) { //ctrl+i
+			self._inspectIt();
+			anEvent.preventDefault();
+			return false;
+		}
+	};
 return self;},
-args: ["html"],
-source: unescape('renderButtonsOn%3A%20html'),
+args: ["anEvent"],
+source: unescape('handleKeyDown%3A%20anEvent%0A%20%20%20%20%3Cif%28anEvent.ctrlKey%29%20%7B%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2080%29%20%7B%20//ctrl+p%0A%09%09%09self._printIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2068%29%20%7B%20//ctrl+d%0A%09%09%09self._doIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2073%29%20%7B%20//ctrl+i%0A%09%09%09self._inspectIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%7D%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_update'),
+unescape('_inspectIt'),
 smalltalk.method({
-selector: unescape('update'),
-category: 'rendering',
+selector: unescape('inspectIt'),
+category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_renderTab", []);
+smalltalk.send(smalltalk.send(self, "_doIt", []), "_inspect", []);
 return self;},
 args: [],
-source: unescape('update%0A%09self%20renderTab'),
-messageSends: ["renderTab"],
+source: unescape('inspectIt%0A%20%20%20%20self%20doIt%20inspect'),
+messageSends: ["inspect", "doIt"],
 referencedClasses: []
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_renderTab'),
+unescape('_onDoIt'),
 smalltalk.method({
-selector: unescape('renderTab'),
-category: 'rendering',
+selector: unescape('onDoIt'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self['@div'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["jt_box"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderBoxOn_", [html]);})]);})(smalltalk.send(html, "_div", []));return (function($rec){smalltalk.send($rec, "_class_", ["jt_buttons"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderButtonsOn_", [html]);})]);})(smalltalk.send(html, "_div", []));})]);
+return self['@onDoIt'];
 return self;},
 args: [],
-source: unescape('renderTab%0A%09div%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%20%20%20%20html%20div%0A%09%09class%3A%20%27jt_box%27%3B%0A%09%09with%3A%20%5Bself%20renderBoxOn%3A%20html%5D.%0A%09%20%20%20%20html%20div%0A%09%09class%3A%20%27jt_buttons%27%3B%0A%09%09with%3A%20%5Bself%20renderButtonsOn%3A%20html%5D%5D'),
-messageSends: ["contents:", "class:", "with:", "renderBoxOn:", "div", "renderButtonsOn:"],
+source: unescape('onDoIt%0A%09%5EonDoIt'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TabWidget);
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_canBeClosed'),
+unescape('_onDoIt_'),
 smalltalk.method({
-selector: unescape('canBeClosed'),
-category: 'testing',
-fn: function (){
+selector: unescape('onDoIt%3A'),
+category: 'accessing',
+fn: function (aBlock){
 var self=this;
-return false;
+(self['@onDoIt']=aBlock);
 return self;},
-args: [],
-source: unescape('canBeClosed%0A%20%20%20%20%5Efalse'),
+args: ["aBlock"],
+source: unescape('onDoIt%3A%20aBlock%0A%09onDoIt%20%3A%3D%20aBlock'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TabWidget);
-
+smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_onKeyDown_'),
 smalltalk.method({
-selector: unescape('open'),
-category: 'instance creation',
-fn: function (){
+selector: unescape('onKeyDown%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_new", []), "_open", []);
+smalltalk.send(self['@div'], "_onKeyDown_", [aBlock]);
 return self;},
-args: [],
-source: unescape('open%0A%20%20%20%20%5Eself%20new%20open'),
-messageSends: ["open", "new"],
+args: ["aBlock"],
+source: unescape('onKeyDown%3A%20aBlock%0A%09div%20onKeyDown%3A%20aBlock'),
+messageSends: ["onKeyDown:"],
 referencedClasses: []
 }),
-smalltalk.TabWidget.klass);
-
+smalltalk.SourceArea);
 
-smalltalk.addClass('SourceArea', smalltalk.Widget, ['editor', 'div', 'receiver', 'onDoIt'], 'IDE');
 smalltalk.addMethod(
-unescape('_val'),
+unescape('_onKeyUp_'),
 smalltalk.method({
-selector: unescape('val'),
-category: 'accessing',
-fn: function (){
+selector: unescape('onKeyUp%3A'),
+category: 'events',
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self['@editor'], "_getValue", []);
+smalltalk.send(self['@div'], "_onKeyUp_", [aBlock]);
 return self;},
-args: [],
-source: unescape('val%0A%20%20%20%20%5Eeditor%20getValue'),
-messageSends: ["getValue"],
+args: ["aBlock"],
+source: unescape('onKeyUp%3A%20aBlock%0A%09div%20onKeyUp%3A%20aBlock'),
+messageSends: ["onKeyUp:"],
 referencedClasses: []
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_val_'),
+unescape('_print_'),
 smalltalk.method({
-selector: unescape('val%3A'),
-category: 'accessing',
+selector: unescape('print%3A'),
+category: 'actions',
 fn: function (aString){
 var self=this;
-smalltalk.send(self['@editor'], "_setValue_", [aString]);
+var start=nil;
+var stop=nil;
+(start=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
+(stop=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
+smalltalk.send(start, "_at_put_", ["line", smalltalk.send(smalltalk.send(self['@editor'], "_getCursor_", [false]), "_line", [])]);
+smalltalk.send(start, "_at_put_", ["ch", smalltalk.send(smalltalk.send(self['@editor'], "_getCursor_", [false]), "_ch", [])]);
+smalltalk.send(stop, "_at_put_", ["line", smalltalk.send(start, "_at_", ["line"])]);
+smalltalk.send(stop, "_at_put_", ["ch", ((($receiver = ((($receiver = smalltalk.send(start, "_at_", ["ch"])).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])]))).klass === smalltalk.Number) ? $receiver +(2) : smalltalk.send($receiver, "__plus", [(2)]))]);
+smalltalk.send(self['@editor'], "_replaceSelection_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self['@editor'], "_getSelection", []), "__comma", [" "]), "__comma", [aString]), "__comma", [" "])]);
+smalltalk.send(self['@editor'], "_setCursor_", [smalltalk.send(self['@editor'], "_getCursor_", [true])]);
+smalltalk.send(self['@editor'], "_setSelection_end_", [stop, start]);
 return self;},
 args: ["aString"],
-source: unescape('val%3A%20aString%0A%20%20%20%20editor%20setValue%3A%20aString'),
-messageSends: ["setValue:"],
-referencedClasses: []
+source: unescape('print%3A%20aString%0A%09%7C%20start%20stop%20%7C%0A%09start%20%3A%3D%20HashedCollection%20new.%0A%09stop%20%3A%3D%20HashedCollection%20new.%0A%09start%20at%3A%20%27line%27%20put%3A%20%28editor%20getCursor%3A%20false%29%20line.%0A%09start%20at%3A%20%27ch%27%20put%3A%20%28editor%20getCursor%3A%20false%29%20ch.%0A%09stop%20at%3A%20%27line%27%20put%3A%20%28start%20at%3A%20%27line%27%29.%0A%09stop%20at%3A%20%27ch%27%20put%3A%20%28%28start%20at%3A%20%27ch%27%29%20+%20aString%20size%20+%202%29.%0A%09editor%20replaceSelection%3A%20%28editor%20getSelection%2C%20%27%20%27%2C%20aString%2C%20%27%20%27%29.%0A%09editor%20setCursor%3A%20%28editor%20getCursor%3A%20true%29.%0A%09editor%20setSelection%3A%20stop%20end%3A%20start'),
+messageSends: ["new", "at:put:", "line", "getCursor:", "ch", "at:", unescape("+"), "size", "replaceSelection:", unescape("%2C"), "getSelection", "setCursor:", "setSelection:end:"],
+referencedClasses: ["HashedCollection"]
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_currentLine'),
+unescape('_printIt'),
 smalltalk.method({
-selector: unescape('currentLine'),
-category: 'accessing',
+selector: unescape('printIt'),
+category: 'actions',
 fn: function (){
 var self=this;
-return smalltalk.send(self['@editor'], "_getLine_", [smalltalk.send(smalltalk.send(self['@editor'], "_getCursor", []), "_line", [])]);
+smalltalk.send(self, "_print_", [smalltalk.send(smalltalk.send(self, "_doIt", []), "_printString", [])]);
 return self;},
 args: [],
-source: unescape('currentLine%0A%20%20%20%20%5Eeditor%20getLine%3A%20%28editor%20getCursor%20line%29'),
-messageSends: ["getLine:", "line", "getCursor"],
+source: unescape('printIt%0A%20%20%20%20self%20print%3A%20self%20doIt%20printString'),
+messageSends: ["print:", "printString", "doIt"],
 referencedClasses: []
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_selection'),
+unescape('_receiver'),
 smalltalk.method({
-selector: unescape('selection'),
+selector: unescape('receiver'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.send(self['@editor'], "_getSelection", []);
+return (($receiver = self['@receiver']) == nil || $receiver == undefined) ? (function(){return smalltalk.send((smalltalk.DoIt || DoIt), "_new", []);})() : $receiver;
 return self;},
 args: [],
-source: unescape('selection%0A%09%5Eeditor%20getSelection'),
-messageSends: ["getSelection"],
-referencedClasses: []
+source: unescape('receiver%0A%09%5Ereceiver%20ifNil%3A%20%5BDoIt%20new%5D'),
+messageSends: ["ifNil:", "new"],
+referencedClasses: ["DoIt"]
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_selectionEnd'),
+unescape('_receiver_'),
 smalltalk.method({
-selector: unescape('selectionEnd'),
+selector: unescape('receiver%3A'),
 category: 'accessing',
-fn: function (){
+fn: function (anObject){
 var self=this;
-return smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionEnd", []);
+(self['@receiver']=anObject);
 return self;},
-args: [],
-source: unescape('selectionEnd%0A%20%20%20%5Etextarea%20element%20selectionEnd'),
-messageSends: ["selectionEnd", "element"],
+args: ["anObject"],
+source: unescape('receiver%3A%20anObject%0A%09receiver%20%3A%3D%20anObject'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_selectionStart'),
+unescape('_renderOn_'),
 smalltalk.method({
-selector: unescape('selectionStart'),
+selector: unescape('renderOn%3A'),
+category: 'rendering',
+fn: function (html){
+var self=this;
+var textarea=nil;
+(self['@div']=smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["source"]));
+smalltalk.send(self['@div'], "_with_", [(function(){return (textarea=smalltalk.send(html, "_textarea", []));})]);
+smalltalk.send(self, "_setEditorOn_", [smalltalk.send(textarea, "_element", [])]);
+smalltalk.send(self['@div'], "_onKeyDown_", [(function(e){return smalltalk.send(self, "_handleKeyDown_", [e]);})]);
+return self;},
+args: ["html"],
+source: unescape('renderOn%3A%20html%0A%20%20%20%20%7C%20textarea%20%7C%0A%20%20%20%20div%20%3A%3D%20html%20div%20class%3A%20%27source%27.%0A%20%20%20%20div%20with%3A%20%5Btextarea%20%3A%3D%20html%20textarea%5D.%0A%20%20%20%20self%20setEditorOn%3A%20textarea%20element.%0A%20%20%20%20div%20onKeyDown%3A%20%5B%3Ae%20%7C%20self%20handleKeyDown%3A%20e%5D'),
+messageSends: ["class:", "div", "with:", "textarea", "setEditorOn:", "element", "onKeyDown:", "handleKeyDown:"],
+referencedClasses: []
+}),
+smalltalk.SourceArea);
+
+smalltalk.addMethod(
+unescape('_selection'),
+smalltalk.method({
+selector: unescape('selection'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionStart", []);
+return smalltalk.send(self['@editor'], "_getSelection", []);
 return self;},
 args: [],
-source: unescape('selectionStart%0A%20%20%20%5Etextarea%20element%20selectionStart'),
-messageSends: ["selectionStart", "element"],
+source: unescape('selection%0A%09%5Eeditor%20getSelection'),
+messageSends: ["getSelection"],
 referencedClasses: []
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_selectionStart_'),
+unescape('_selectionEnd'),
 smalltalk.method({
-selector: unescape('selectionStart%3A'),
+selector: unescape('selectionEnd'),
 category: 'accessing',
-fn: function (anInteger){
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionStart_", [anInteger]);
+return smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionEnd", []);
 return self;},
-args: ["anInteger"],
-source: unescape('selectionStart%3A%20anInteger%0A%20%20%20textarea%20element%20selectionStart%3A%20anInteger'),
-messageSends: ["selectionStart:", "element"],
+args: [],
+source: unescape('selectionEnd%0A%20%20%20%5Etextarea%20element%20selectionEnd'),
+messageSends: ["selectionEnd", "element"],
 referencedClasses: []
 }),
 smalltalk.SourceArea);
@@ -763,6 +760,38 @@ referencedClasses: []
 }),
 smalltalk.SourceArea);
 
+smalltalk.addMethod(
+unescape('_selectionStart'),
+smalltalk.method({
+selector: unescape('selectionStart'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionStart", []);
+return self;},
+args: [],
+source: unescape('selectionStart%0A%20%20%20%5Etextarea%20element%20selectionStart'),
+messageSends: ["selectionStart", "element"],
+referencedClasses: []
+}),
+smalltalk.SourceArea);
+
+smalltalk.addMethod(
+unescape('_selectionStart_'),
+smalltalk.method({
+selector: unescape('selectionStart%3A'),
+category: 'accessing',
+fn: function (anInteger){
+var self=this;
+smalltalk.send(smalltalk.send((typeof textarea == 'undefined' ? nil : textarea), "_element", []), "_selectionStart_", [anInteger]);
+return self;},
+args: ["anInteger"],
+source: unescape('selectionStart%3A%20anInteger%0A%20%20%20textarea%20element%20selectionStart%3A%20anInteger'),
+messageSends: ["selectionStart:", "element"],
+referencedClasses: []
+}),
+smalltalk.SourceArea);
+
 smalltalk.addMethod(
 unescape('_setEditorOn_'),
 smalltalk.method({
@@ -786,293 +815,237 @@ referencedClasses: []
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_editor'),
+unescape('_val'),
 smalltalk.method({
-selector: unescape('editor'),
+selector: unescape('val'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@editor'];
+return smalltalk.send(self['@editor'], "_getValue", []);
 return self;},
 args: [],
-source: unescape('editor%0A%09%5Eeditor'),
-messageSends: [],
+source: unescape('val%0A%20%20%20%20%5Eeditor%20getValue'),
+messageSends: ["getValue"],
 referencedClasses: []
 }),
 smalltalk.SourceArea);
 
 smalltalk.addMethod(
-unescape('_receiver'),
+unescape('_val_'),
 smalltalk.method({
-selector: unescape('receiver'),
+selector: unescape('val%3A'),
 category: 'accessing',
-fn: function (){
+fn: function (aString){
 var self=this;
-return (($receiver = self['@receiver']) == nil || $receiver == undefined) ? (function(){return smalltalk.send((smalltalk.DoIt || DoIt), "_new", []);})() : $receiver;
+smalltalk.send(self['@editor'], "_setValue_", [aString]);
 return self;},
-args: [],
-source: unescape('receiver%0A%09%5Ereceiver%20ifNil%3A%20%5BDoIt%20new%5D'),
-messageSends: ["ifNil:", "new"],
-referencedClasses: ["DoIt"]
+args: ["aString"],
+source: unescape('val%3A%20aString%0A%20%20%20%20editor%20setValue%3A%20aString'),
+messageSends: ["setValue:"],
+referencedClasses: []
 }),
 smalltalk.SourceArea);
 
+
+
+smalltalk.addClass('TabManager', smalltalk.Widget, ['selectedTab', 'tabs', 'opened', 'ul', 'input'], 'IDE');
 smalltalk.addMethod(
-unescape('_receiver_'),
+unescape('_addTab_'),
 smalltalk.method({
-selector: unescape('receiver%3A'),
-category: 'accessing',
-fn: function (anObject){
+selector: unescape('addTab%3A'),
+category: 'adding/Removing',
+fn: function (aWidget){
 var self=this;
-(self['@receiver']=anObject);
+smalltalk.send(smalltalk.send(self, "_tabs", []), "_add_", [aWidget]);
+smalltalk.send(aWidget, "_appendToJQuery_", [smalltalk.send(unescape("%23jtalk"), "_asJQuery", [])]);
+smalltalk.send(aWidget, "_hide", []);
 return self;},
-args: ["anObject"],
-source: unescape('receiver%3A%20anObject%0A%09receiver%20%3A%3D%20anObject'),
-messageSends: [],
+args: ["aWidget"],
+source: unescape('addTab%3A%20aWidget%0A%20%20%20%20self%20tabs%20add%3A%20aWidget.%0A%20%20%20%20aWidget%20appendToJQuery%3A%20%27%23jtalk%27%20asJQuery.%0A%20%20%20%20aWidget%20hide'),
+messageSends: ["add:", "tabs", "appendToJQuery:", "asJQuery", "hide"],
 referencedClasses: []
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_onDoIt_'),
+unescape('_close'),
 smalltalk.method({
-selector: unescape('onDoIt%3A'),
-category: 'accessing',
-fn: function (aBlock){
+selector: unescape('close'),
+category: 'actions',
+fn: function (){
 var self=this;
-(self['@onDoIt']=aBlock);
+((($receiver = self['@opened']).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_hide", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_hide", []);smalltalk.send(self['@selectedTab'], "_hide", []);smalltalk.send(self, "_removeBodyMargin", []);smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["jtalkBody"]);return (self['@opened']=false);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_hide", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_hide", []);smalltalk.send(self['@selectedTab'], "_hide", []);smalltalk.send(self, "_removeBodyMargin", []);smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["jtalkBody"]);return (self['@opened']=false);})]));
 return self;},
-args: ["aBlock"],
-source: unescape('onDoIt%3A%20aBlock%0A%09onDoIt%20%3A%3D%20aBlock'),
-messageSends: [],
+args: [],
+source: unescape('close%0A%20%20%20%20opened%20ifTrue%3A%20%5B%0A%09%27%23jtalk%27%20asJQuery%20hide.%0A%09ul%20asJQuery%20hide.%0A%09selectedTab%20hide.%0A%09self%20removeBodyMargin.%0A%09%27body%27%20asJQuery%20removeClass%3A%20%27jtalkBody%27.%0A%09opened%20%3A%3D%20false%5D'),
+messageSends: ["ifTrue:", "hide", "asJQuery", "removeBodyMargin", "removeClass:"],
 referencedClasses: []
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_onDoIt'),
+unescape('_closeTab_'),
 smalltalk.method({
-selector: unescape('onDoIt'),
-category: 'accessing',
-fn: function (){
+selector: unescape('closeTab%3A'),
+category: 'actions',
+fn: function (aWidget){
 var self=this;
-return self['@onDoIt'];
+smalltalk.send(self, "_removeTab_", [aWidget]);
+smalltalk.send(self, "_selectTab_", [smalltalk.send(smalltalk.send(self, "_tabs", []), "_last", [])]);
+smalltalk.send(aWidget, "_remove", []);
+smalltalk.send(self, "_update", []);
 return self;},
-args: [],
-source: unescape('onDoIt%0A%09%5EonDoIt'),
-messageSends: [],
+args: ["aWidget"],
+source: unescape('closeTab%3A%20aWidget%0A%20%20%20%20self%20removeTab%3A%20aWidget.%0A%20%20%20%20self%20selectTab%3A%20self%20tabs%20last.%0A%20%20%20%20aWidget%20remove.%0A%20%20%20%20self%20update'),
+messageSends: ["removeTab:", "selectTab:", "last", "tabs", "remove", "update"],
 referencedClasses: []
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_currentLineOrSelection'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('currentLineOrSelection'),
-category: 'accessing',
+selector: unescape('initialize'),
+category: 'initialization',
 fn: function (){
 var self=this;
-return ((($receiver = smalltalk.send(self['@editor'], "_somethingSelected", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_currentLine", []);})() : (function(){return smalltalk.send(self, "_selection", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_currentLine", []);}), (function(){return smalltalk.send(self, "_selection", []);})]));
+smalltalk.send(self, "_initialize", [], smalltalk.Widget);
+(self['@opened']=true);
+smalltalk.send((function(html){return smalltalk.send(smalltalk.send(html, "_div", []), "_id_", ["jtalk"]);}), "_appendToJQuery_", [smalltalk.send("body", "_asJQuery", [])]);
+smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);
+smalltalk.send(self, "_appendToJQuery_", [smalltalk.send(unescape("%23jtalk"), "_asJQuery", [])]);
+(function($rec){smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.IDETranscript || IDETranscript), "_current", [])]);smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.Workspace || Workspace), "_new", [])]);return smalltalk.send($rec, "_addTab_", [smalltalk.send((smalltalk.TestRunner || TestRunner), "_new", [])]);})(self);
+smalltalk.send(self, "_selectTab_", [smalltalk.send(smalltalk.send(self, "_tabs", []), "_last", [])]);
+(function($rec){smalltalk.send($rec, "_onResize_", [(function(){return (function($rec){smalltalk.send($rec, "_updateBodyMargin", []);return smalltalk.send($rec, "_updatePosition", []);})(self);})]);return smalltalk.send($rec, "_onWindowResize_", [(function(){return smalltalk.send(self, "_updatePosition", []);})]);})(self);
 return self;},
 args: [],
-source: unescape('currentLineOrSelection%0A%20%20%20%20%5Eeditor%20somethingSelected%0A%09ifFalse%3A%20%5Bself%20currentLine%5D%0A%09ifTrue%3A%20%5Bself%20selection%5D'),
-messageSends: ["ifFalse:ifTrue:", "somethingSelected", "currentLine", "selection"],
+source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20opened%20%3A%3D%20true.%0A%20%20%20%20%5B%3Ahtml%20%7C%20html%20div%20id%3A%20%27jtalk%27%5D%20appendToJQuery%3A%20%27body%27%20asJQuery.%0A%20%20%20%20%27body%27%20asJQuery%20%0A%09addClass%3A%20%27jtalkBody%27.%0A%20%20%20%20self%20appendToJQuery%3A%20%27%23jtalk%27%20asJQuery.%0A%20%20%20%20self%20%0A%09addTab%3A%20IDETranscript%20current%3B%0A%09addTab%3A%20Workspace%20new%3B%0A%09addTab%3A%20TestRunner%20new.%0A%20%20%20%20self%20selectTab%3A%20self%20tabs%20last.%0A%20%20%20%20self%20%0A%09onResize%3A%20%5Bself%20updateBodyMargin%3B%20updatePosition%5D%3B%0A%09onWindowResize%3A%20%5Bself%20updatePosition%5D'),
+messageSends: ["initialize", "appendToJQuery:", "id:", "div", "asJQuery", "addClass:", "addTab:", "current", "new", "selectTab:", "last", "tabs", "onResize:", "updateBodyMargin", "updatePosition", "onWindowResize:"],
+referencedClasses: ["IDETranscript", "Workspace", "TestRunner"]
+}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+unescape('_labelFor_'),
+smalltalk.method({
+selector: unescape('labelFor%3A'),
+category: 'accessing',
+fn: function (aWidget){
+var self=this;
+var label=nil;
+var maxSize=nil;
+(maxSize=(15));
+(label=smalltalk.send(smalltalk.send(aWidget, "_label", []), "_copyFrom_to_", [(0), smalltalk.send(smalltalk.send(smalltalk.send(aWidget, "_label", []), "_size", []), "_min_", [maxSize])]));
+((($receiver = ((($receiver = smalltalk.send(smalltalk.send(aWidget, "_label", []), "_size", [])).klass === smalltalk.Number) ? $receiver >maxSize : smalltalk.send($receiver, "__gt", [maxSize]))).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (label=smalltalk.send(label, "__comma", ["..."]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (label=smalltalk.send(label, "__comma", ["..."]));})]));
+return label;
+return self;},
+args: ["aWidget"],
+source: unescape('labelFor%3A%20aWidget%0A%09%7C%20label%20maxSize%20%7C%0A%09maxSize%20%3A%3D%2015.%0A%09label%20%3A%3D%20aWidget%20label%20copyFrom%3A%200%20to%3A%20%28aWidget%20label%20size%20min%3A%20maxSize%29.%0A%09aWidget%20label%20size%20%3E%20maxSize%20ifTrue%3A%20%5B%0A%09%09label%20%3A%3D%20label%2C%20%27...%27%5D.%0A%09%5Elabel'),
+messageSends: ["copyFrom:to:", "label", "min:", "size", "ifTrue:", unescape("%3E"), unescape("%2C")],
 referencedClasses: []
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_clear'),
+unescape('_newBrowserTab'),
 smalltalk.method({
-selector: unescape('clear'),
+selector: unescape('newBrowserTab'),
 category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_val_", [""]);
+smalltalk.send((smalltalk.Browser || Browser), "_open", []);
 return self;},
 args: [],
-source: unescape('clear%0A%20%20%20%20%20%20self%20val%3A%20%27%27'),
-messageSends: ["val:"],
-referencedClasses: []
+source: unescape('newBrowserTab%0A%20%20%20%20Browser%20open'),
+messageSends: ["open"],
+referencedClasses: ["Browser"]
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_doIt'),
+unescape('_onResize_'),
 smalltalk.method({
-selector: unescape('doIt'),
+selector: unescape('onResize%3A'),
 category: 'actions',
-fn: function (){
+fn: function (aBlock){
 var self=this;
-var result=nil;
-(result=smalltalk.send(self, "_eval_", [smalltalk.send(self, "_currentLineOrSelection", [])]));
-(($receiver = smalltalk.send(self, "_onDoIt", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(smalltalk.send(self, "_onDoIt", []), "_value", []);})() : nil;
-return result;
+jQuery('#jtalk').resizable({
+	handles: 'n', 
+	resize: aBlock,
+	minHeight: 230
+});
 return self;},
-args: [],
-source: unescape('doIt%0A%20%20%20%20%7C%20result%20%7C%0A%20%20%20%20result%20%3A%3D%20self%20eval%3A%20self%20currentLineOrSelection.%0A%20%20%20%20self%20onDoIt%20ifNotNil%3A%20%5Bself%20onDoIt%20value%5D.%0A%20%20%20%20%5Eresult'),
-messageSends: ["eval:", "currentLineOrSelection", "ifNotNil:", "onDoIt", "value"],
+args: ["aBlock"],
+source: unescape('onResize%3A%20aBlock%0A%20%20%20%20%3CjQuery%28%27%23jtalk%27%29.resizable%28%7B%0A%09handles%3A%20%27n%27%2C%20%0A%09resize%3A%20aBlock%2C%0A%09minHeight%3A%20230%0A%7D%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_eval_'),
+unescape('_onWindowResize_'),
 smalltalk.method({
-selector: unescape('eval%3A'),
+selector: unescape('onWindowResize%3A'),
 category: 'actions',
-fn: function (aString){
+fn: function (aBlock){
 var self=this;
-try{var compiler=nil;
-(compiler=smalltalk.send((smalltalk.Compiler || Compiler), "_new", []));
-smalltalk.send((function(){return smalltalk.send(compiler, "_parseExpression_", [aString]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return (function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(ex, "_messageText", [])])}})})();})]);
-(function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send(smalltalk.send(smalltalk.send(compiler, "_load_forClass_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")]), (smalltalk.DoIt || DoIt)]), "_fn", []), "_applyTo_arguments_", [smalltalk.send(self, "_receiver", []), []])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_eval_'){return e.fn()} throw(e)}},
-args: ["aString"],
-source: unescape('eval%3A%20aString%0A%09%7C%20compiler%20%20%7C%0A%09compiler%20%3A%3D%20Compiler%20new.%0A%09%5Bcompiler%20parseExpression%3A%20aString%5D%20on%3A%20Error%20do%3A%20%5B%3Aex%20%7C%0A%09%09%5Ewindow%20alert%3A%20ex%20messageText%5D.%0A%09%5E%28compiler%20load%3A%20%27doIt%20%5E%5B%27%2C%20aString%2C%20%27%5D%20value%27%20forClass%3A%20DoIt%29%20fn%20applyTo%3A%20self%20receiver%20arguments%3A%20%23%28%29'),
-messageSends: ["new", "on:do:", "parseExpression:", "alert:", "messageText", "applyTo:arguments:", "fn", "load:forClass:", unescape("%2C"), "receiver"],
-referencedClasses: ["Compiler", "Error", "DoIt"]
-}),
-smalltalk.SourceArea);
-
-smalltalk.addMethod(
-unescape('_handleKeyDown_'),
-smalltalk.method({
-selector: unescape('handleKeyDown%3A'),
-category: 'actions',
-fn: function (anEvent){
-var self=this;
-if(anEvent.ctrlKey) {
-		if(anEvent.keyCode === 80) { //ctrl+p
-			self._printIt();
-			anEvent.preventDefault();
-			return false;
-		}
-		if(anEvent.keyCode === 68) { //ctrl+d
-			self._doIt();
-			anEvent.preventDefault();
-			return false;
-		}
-		if(anEvent.keyCode === 73) { //ctrl+i
-			self._inspectIt();
-			anEvent.preventDefault();
-			return false;
-		}
-	};
+jQuery(window).resize(aBlock);
 return self;},
-args: ["anEvent"],
-source: unescape('handleKeyDown%3A%20anEvent%0A%20%20%20%20%3Cif%28anEvent.ctrlKey%29%20%7B%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2080%29%20%7B%20//ctrl+p%0A%09%09%09self._printIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2068%29%20%7B%20//ctrl+d%0A%09%09%09self._doIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2073%29%20%7B%20//ctrl+i%0A%09%09%09self._inspectIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%7D%3E'),
+args: ["aBlock"],
+source: unescape('onWindowResize%3A%20aBlock%0A%20%20%20%20%3CjQuery%28window%29.resize%28aBlock%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.SourceArea);
-
-smalltalk.addMethod(
-unescape('_inspectIt'),
-smalltalk.method({
-selector: unescape('inspectIt'),
-category: 'actions',
-fn: function (){
-var self=this;
-smalltalk.send(smalltalk.send(self, "_doIt", []), "_inspect", []);
-return self;},
-args: [],
-source: unescape('inspectIt%0A%20%20%20%20self%20doIt%20inspect'),
-messageSends: ["inspect", "doIt"],
-referencedClasses: []
-}),
-smalltalk.SourceArea);
-
-smalltalk.addMethod(
-unescape('_print_'),
-smalltalk.method({
-selector: unescape('print%3A'),
-category: 'actions',
-fn: function (aString){
-var self=this;
-var start=nil;
-var stop=nil;
-(start=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
-(stop=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
-smalltalk.send(start, "_at_put_", ["line", smalltalk.send(smalltalk.send(self['@editor'], "_getCursor_", [false]), "_line", [])]);
-smalltalk.send(start, "_at_put_", ["ch", smalltalk.send(smalltalk.send(self['@editor'], "_getCursor_", [false]), "_ch", [])]);
-smalltalk.send(stop, "_at_put_", ["line", smalltalk.send(start, "_at_", ["line"])]);
-smalltalk.send(stop, "_at_put_", ["ch", ((($receiver = ((($receiver = smalltalk.send(start, "_at_", ["ch"])).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])]))).klass === smalltalk.Number) ? $receiver +(2) : smalltalk.send($receiver, "__plus", [(2)]))]);
-smalltalk.send(self['@editor'], "_replaceSelection_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self['@editor'], "_getSelection", []), "__comma", [" "]), "__comma", [aString]), "__comma", [" "])]);
-smalltalk.send(self['@editor'], "_setCursor_", [smalltalk.send(self['@editor'], "_getCursor_", [true])]);
-smalltalk.send(self['@editor'], "_setSelection_end_", [stop, start]);
-return self;},
-args: ["aString"],
-source: unescape('print%3A%20aString%0A%09%7C%20start%20stop%20%7C%0A%09start%20%3A%3D%20HashedCollection%20new.%0A%09stop%20%3A%3D%20HashedCollection%20new.%0A%09start%20at%3A%20%27line%27%20put%3A%20%28editor%20getCursor%3A%20false%29%20line.%0A%09start%20at%3A%20%27ch%27%20put%3A%20%28editor%20getCursor%3A%20false%29%20ch.%0A%09stop%20at%3A%20%27line%27%20put%3A%20%28start%20at%3A%20%27line%27%29.%0A%09stop%20at%3A%20%27ch%27%20put%3A%20%28%28start%20at%3A%20%27ch%27%29%20+%20aString%20size%20+%202%29.%0A%09editor%20replaceSelection%3A%20%28editor%20getSelection%2C%20%27%20%27%2C%20aString%2C%20%27%20%27%29.%0A%09editor%20setCursor%3A%20%28editor%20getCursor%3A%20true%29.%0A%09editor%20setSelection%3A%20stop%20end%3A%20start'),
-messageSends: ["new", "at:put:", "line", "getCursor:", "ch", "at:", unescape("+"), "size", "replaceSelection:", unescape("%2C"), "getSelection", "setCursor:", "setSelection:end:"],
-referencedClasses: ["HashedCollection"]
-}),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_printIt'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('printIt'),
+selector: unescape('open'),
 category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_print_", [smalltalk.send(smalltalk.send(self, "_doIt", []), "_printString", [])]);
+((($receiver = self['@opened']).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_show", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_show", []);smalltalk.send(self, "_updateBodyMargin", []);smalltalk.send(self['@selectedTab'], "_show", []);return (self['@opened']=true);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["jtalkBody"]);smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_show", []);smalltalk.send(smalltalk.send(self['@ul'], "_asJQuery", []), "_show", []);smalltalk.send(self, "_updateBodyMargin", []);smalltalk.send(self['@selectedTab'], "_show", []);return (self['@opened']=true);})]));
 return self;},
 args: [],
-source: unescape('printIt%0A%20%20%20%20self%20print%3A%20self%20doIt%20printString'),
-messageSends: ["print:", "printString", "doIt"],
+source: unescape('open%0A%20%20%20%20opened%20ifFalse%3A%20%5B%0A%09%27body%27%20asJQuery%20addClass%3A%20%27jtalkBody%27.%0A%09%27%23jtalk%27%20asJQuery%20show.%0A%09ul%20asJQuery%20show.%0A%09self%20updateBodyMargin.%0A%09selectedTab%20show.%0A%09opened%20%3A%3D%20true%5D'),
+messageSends: ["ifFalse:", "addClass:", "asJQuery", "show", "updateBodyMargin"],
 referencedClasses: []
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_fileIn'),
+unescape('_removeBodyMargin'),
 smalltalk.method({
-selector: unescape('fileIn'),
+selector: unescape('removeBodyMargin'),
 category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send((smalltalk.Importer || Importer), "_new", []), "_import_", [smalltalk.send(smalltalk.send(self, "_currentLineOrSelection", []), "_readStream", [])]);
+smalltalk.send(self, "_setBodyMargin_", [(0)]);
 return self;},
 args: [],
-source: unescape('fileIn%0A%20%20%20%20Importer%20new%20import%3A%20self%20currentLineOrSelection%20readStream'),
-messageSends: ["import:", "new", "readStream", "currentLineOrSelection"],
-referencedClasses: ["Importer"]
-}),
-smalltalk.SourceArea);
-
-smalltalk.addMethod(
-unescape('_onKeyUp_'),
-smalltalk.method({
-selector: unescape('onKeyUp%3A'),
-category: 'events',
-fn: function (aBlock){
-var self=this;
-smalltalk.send(self['@div'], "_onKeyUp_", [aBlock]);
-return self;},
-args: ["aBlock"],
-source: unescape('onKeyUp%3A%20aBlock%0A%09div%20onKeyUp%3A%20aBlock'),
-messageSends: ["onKeyUp:"],
+source: unescape('removeBodyMargin%0A%20%20%20%20self%20setBodyMargin%3A%200'),
+messageSends: ["setBodyMargin:"],
 referencedClasses: []
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_onKeyDown_'),
+unescape('_removeTab_'),
 smalltalk.method({
-selector: unescape('onKeyDown%3A'),
-category: 'events',
-fn: function (aBlock){
+selector: unescape('removeTab%3A'),
+category: 'adding/Removing',
+fn: function (aWidget){
 var self=this;
-smalltalk.send(self['@div'], "_onKeyDown_", [aBlock]);
+smalltalk.send(smalltalk.send(self, "_tabs", []), "_remove_", [aWidget]);
+smalltalk.send(self, "_update", []);
 return self;},
-args: ["aBlock"],
-source: unescape('onKeyDown%3A%20aBlock%0A%09div%20onKeyDown%3A%20aBlock'),
-messageSends: ["onKeyDown:"],
+args: ["aWidget"],
+source: unescape('removeTab%3A%20aWidget%0A%20%20%20%20self%20tabs%20remove%3A%20aWidget.%0A%20%20%20%20self%20update'),
+messageSends: ["remove:", "tabs", "update"],
 referencedClasses: []
 }),
-smalltalk.SourceArea);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
 unescape('_renderOn_'),
@@ -1081,313 +1054,270 @@ selector: unescape('renderOn%3A'),
 category: 'rendering',
 fn: function (html){
 var self=this;
-var textarea=nil;
-(self['@div']=smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["source"]));
-smalltalk.send(self['@div'], "_with_", [(function(){return (textarea=smalltalk.send(html, "_textarea", []));})]);
-smalltalk.send(self, "_setEditorOn_", [smalltalk.send(textarea, "_element", [])]);
-smalltalk.send(self['@div'], "_onKeyDown_", [(function(e){return smalltalk.send(self, "_handleKeyDown_", [e]);})]);
+smalltalk.send(smalltalk.send(html, "_div", []), "_id_", ["logo"]);
+smalltalk.send(self, "_renderToolbarOn_", [html]);
+(self['@ul']=(function($rec){smalltalk.send($rec, "_id_", ["jtalkTabs"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_ul", [])));
+smalltalk.send(self, "_renderTabs", []);
 return self;},
 args: ["html"],
-source: unescape('renderOn%3A%20html%0A%20%20%20%20%7C%20textarea%20%7C%0A%20%20%20%20div%20%3A%3D%20html%20div%20class%3A%20%27source%27.%0A%20%20%20%20div%20with%3A%20%5Btextarea%20%3A%3D%20html%20textarea%5D.%0A%20%20%20%20self%20setEditorOn%3A%20textarea%20element.%0A%20%20%20%20div%20onKeyDown%3A%20%5B%3Ae%20%7C%20self%20handleKeyDown%3A%20e%5D'),
-messageSends: ["class:", "div", "with:", "textarea", "setEditorOn:", "element", "onKeyDown:", "handleKeyDown:"],
-referencedClasses: []
-}),
-smalltalk.SourceArea);
-
-
-
-smalltalk.addClass('ClassesList', smalltalk.Widget, ['browser', 'ul', 'nodes'], 'IDE');
-smalltalk.addMethod(
-unescape('_category'),
-smalltalk.method({
-selector: unescape('category'),
-category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.send(smalltalk.send(self, "_browser", []), "_selectedPackage", []);
-return self;},
-args: [],
-source: unescape('category%0A%09%5Eself%20browser%20selectedPackage'),
-messageSends: ["selectedPackage", "browser"],
+source: unescape('renderOn%3A%20html%0A%09html%20div%20id%3A%20%27logo%27.%0A%09self%20renderToolbarOn%3A%20html.%0A%09ul%20%3A%3D%20html%20ul%0A%09%09id%3A%20%27jtalkTabs%27%3B%0A%09%09yourself.%0A%09self%20renderTabs'),
+messageSends: ["id:", "div", "renderToolbarOn:", "yourself", "ul", "renderTabs"],
 referencedClasses: []
 }),
-smalltalk.ClassesList);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_nodes'),
+unescape('_renderTabFor_on_'),
 smalltalk.method({
-selector: unescape('nodes'),
-category: 'accessing',
-fn: function (){
+selector: unescape('renderTabFor%3Aon%3A'),
+category: 'rendering',
+fn: function (aWidget, html){
 var self=this;
-(($receiver = self['@nodes']) == nil || $receiver == undefined) ? (function(){return (self['@nodes']=smalltalk.send(self, "_getNodes", []));})() : $receiver;
-return self['@nodes'];
+var li=nil;
+(li=smalltalk.send(html, "_li", []));
+((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [aWidget])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));
+(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", [(function(){((($receiver = smalltalk.send(aWidget, "_canBeClosed", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})]));return smalltalk.send(smalltalk.send(html, "_span", []), "_with_", [smalltalk.send(self, "_labelFor_", [aWidget])]);})]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [aWidget]);})]);})(li);
 return self;},
-args: [],
-source: unescape('nodes%0A%09nodes%20ifNil%3A%20%5Bnodes%20%3A%3D%20self%20getNodes%5D.%0A%09%5Enodes'),
-messageSends: ["ifNil:", "getNodes"],
+args: ["aWidget", "html"],
+source: unescape('renderTabFor%3A%20aWidget%20on%3A%20html%0A%09%7C%20li%20%7C%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20aWidget%20ifTrue%3A%20%5B%0A%09li%20class%3A%20%27selected%27%5D.%0A%09li%20with%3A%20%5B%0A%09%09html%20span%20class%3A%20%27ltab%27.%0A%09%09html%20span%0A%09%09%09class%3A%20%27mtab%27%3B%0A%09%09%09with%3A%20%5B%0A%09%09%09%09aWidget%20canBeClosed%20ifTrue%3A%20%5B%0A%09%09%09%09%09html%20span%20%0A%09%09%09%09%09%09class%3A%20%27close%27%3B%0A%09%09%09%09%09%09with%3A%20%27x%27%3B%0A%09%09%09%09%09onClick%3A%20%5Bself%20closeTab%3A%20aWidget%5D%5D.%0A%09%09%09html%20span%20with%3A%20%28self%20labelFor%3A%20aWidget%29%5D.%0A%09%09html%20span%20class%3A%20%27rtab%27%5D%3B%0A%09onClick%3A%20%5Bself%20selectTab%3A%20aWidget%5D'),
+messageSends: ["li", "ifTrue:", unescape("%3D"), "class:", "with:", "span", "canBeClosed", "onClick:", "closeTab:", "labelFor:", "selectTab:"],
 referencedClasses: []
 }),
-smalltalk.ClassesList);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_browser'),
+unescape('_renderTabs'),
 smalltalk.method({
-selector: unescape('browser'),
-category: 'accessing',
+selector: unescape('renderTabs'),
+category: 'rendering',
 fn: function (){
 var self=this;
-return self['@browser'];
+smalltalk.send(self['@ul'], "_contents_", [(function(html){smalltalk.send(smalltalk.send(self, "_tabs", []), "_do_", [(function(each){return smalltalk.send(self, "_renderTabFor_on_", [each, html]);})]);return (function($rec){smalltalk.send($rec, "_class_", ["newtab"]);smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", [unescape("%20+%20")]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_newBrowserTab", []);})]);})(smalltalk.send(html, "_li", []));})]);
 return self;},
 args: [],
-source: unescape('browser%0A%09%5Ebrowser'),
-messageSends: [],
+source: unescape('renderTabs%0A%09ul%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%20%20%20%20self%20tabs%20do%3A%20%5B%3Aeach%20%7C%0A%09%09self%20renderTabFor%3A%20each%20on%3A%20html%5D.%0A%09%20%20%20%20html%20li%0A%09%09class%3A%20%27newtab%27%3B%0A%09%09with%3A%20%5B%0A%09%09%09html%20span%20class%3A%20%27ltab%27.%0A%09%09%09html%20span%20class%3A%20%27mtab%27%3B%20with%3A%20%27%20+%20%27.%0A%09%09%09html%20span%20class%3A%20%27rtab%27%5D%3B%0A%09%09onClick%3A%20%5Bself%20newBrowserTab%5D%5D'),
+messageSends: ["contents:", "do:", "tabs", "renderTabFor:on:", "class:", "with:", "span", "onClick:", "newBrowserTab", "li"],
 referencedClasses: []
 }),
-smalltalk.ClassesList);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_browser_'),
+unescape('_renderToolbarOn_'),
 smalltalk.method({
-selector: unescape('browser%3A'),
-category: 'accessing',
-fn: function (aBrowser){
+selector: unescape('renderToolbarOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-(self['@browser']=aBrowser);
+(function($rec){smalltalk.send($rec, "_id_", ["jt_toolbar"]);return smalltalk.send($rec, "_with_", [(function(){(self['@input']=(function($rec){smalltalk.send($rec, "_class_", ["implementors"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_input", [])));smalltalk.send(self['@input'], "_onKeyPress_", [(function(event){return ((($receiver = smalltalk.send(smalltalk.send(event, "_keyCode", []), "__eq", [(13)])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);})]));})]);return (function($rec){smalltalk.send($rec, "_id_", ["jt_close"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_close", []);})]);})(smalltalk.send(html, "_div", []));})]);})(smalltalk.send(html, "_div", []));
 return self;},
-args: ["aBrowser"],
-source: unescape('browser%3A%20aBrowser%0A%09browser%20%3A%3D%20aBrowser'),
-messageSends: [],
+args: ["html"],
+source: unescape('renderToolbarOn%3A%20html%0A%09html%20div%20%0A%09%09id%3A%20%27jt_toolbar%27%3B%0A%09%09with%3A%20%5B%0A%09%09%09input%20%3A%3D%20html%20input%20%0A%09%09%09%09class%3A%20%27implementors%27%3B%0A%09%09%09%09yourself.%0A%09%09%09input%20onKeyPress%3A%20%5B%3Aevent%20%7C%0A%09%09%09%09event%20keyCode%20%3D%2013%20ifTrue%3A%20%5B%0A%09%09%09%09self%20search%3A%20input%20asJQuery%20val%5D%5D.%0A%09%09%09html%20div%20id%3A%20%27jt_close%27%3B%20onClick%3A%20%5Bself%20close%5D%5D'),
+messageSends: ["id:", "with:", "class:", "yourself", "input", "onKeyPress:", "ifTrue:", unescape("%3D"), "keyCode", "search:", "val", "asJQuery", "onClick:", "close", "div"],
 referencedClasses: []
 }),
-smalltalk.ClassesList);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_getNodes'),
+unescape('_search_'),
 smalltalk.method({
-selector: unescape('getNodes'),
-category: 'accessing',
-fn: function (){
+selector: unescape('search%3A'),
+category: 'actions',
+fn: function (aString){
 var self=this;
-var classes=nil;
-var children=nil;
-var others=nil;
-(classes=smalltalk.send(smalltalk.send(self, "_browser", []), "_classes", []));
-(children=[]);
-(others=[]);
-smalltalk.send(classes, "_do_", [(function(each){return ((($receiver = smalltalk.send(classes, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
-return smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassesListNode || ClassesListNode), "_on_browser_classes_level_", [each, smalltalk.send(self, "_browser", []), others, (0)]);})]);
+var searchedClass=nil;
+(searchedClass=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [aString]));
+((($receiver = smalltalk.send(searchedClass, "_isClass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [searchedClass]);})() : (function(){return smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [searchedClass]);}), (function(){return smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);})]));
 return self;},
-args: [],
-source: unescape('getNodes%0A%09%7C%20classes%20children%20others%20%7C%0A%09classes%20%3A%3D%20self%20browser%20classes.%0A%09children%20%3A%3D%20%23%28%29.%0A%09others%20%3A%3D%20%23%28%29.%0A%09classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%28classes%20includes%3A%20each%20superclass%29%0A%09%09%09ifFalse%3A%20%5Bchildren%20add%3A%20each%5D%0A%09%09%09ifTrue%3A%20%5Bothers%20add%3A%20each%5D%5D.%0A%09%5Echildren%20collect%3A%20%5B%3Aeach%20%7C%0A%09%09ClassesListNode%20on%3A%20each%20browser%3A%20self%20browser%20classes%3A%20others%20level%3A%200%5D'),
-messageSends: ["classes", "browser", "do:", "ifFalse:ifTrue:", "includes:", "superclass", "add:", "collect:", "on:browser:classes:level:"],
-referencedClasses: ["ClassesListNode"]
+args: ["aString"],
+source: unescape('search%3A%20aString%0A%09%7C%20searchedClass%20%7C%0A%09searchedClass%20%3A%3D%20Smalltalk%20current%20at%3A%20aString.%0A%09%09searchedClass%20isClass%0A%09%09%09ifTrue%3A%20%5BBrowser%20openOn%3A%20searchedClass%5D%0A%09%09%09ifFalse%3A%20%5BReferencesBrowser%20search%3A%20aString%5D'),
+messageSends: ["at:", "current", "ifTrue:ifFalse:", "isClass", "openOn:", "search:"],
+referencedClasses: ["Smalltalk", "Browser", "ReferencesBrowser"]
 }),
-smalltalk.ClassesList);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_resetNodes'),
+unescape('_selectTab_'),
 smalltalk.method({
-selector: unescape('resetNodes'),
-category: 'accessing',
-fn: function (){
+selector: unescape('selectTab%3A'),
+category: 'actions',
+fn: function (aWidget){
 var self=this;
-(self['@nodes']=nil);
+smalltalk.send(self, "_open", []);
+(self['@selectedTab']=aWidget);
+smalltalk.send(smalltalk.send(self, "_tabs", []), "_do_", [(function(each){return smalltalk.send(each, "_hide", []);})]);
+smalltalk.send(aWidget, "_show", []);
+smalltalk.send(self, "_update", []);
 return self;},
-args: [],
-source: unescape('resetNodes%0A%09nodes%20%3A%3D%20nil'),
-messageSends: [],
+args: ["aWidget"],
+source: unescape('selectTab%3A%20aWidget%0A%20%20%20%20self%20open.%0A%20%20%20%20selectedTab%20%3A%3D%20aWidget.%0A%20%20%20%20self%20tabs%20do%3A%20%5B%3Aeach%20%7C%0A%09each%20hide%5D.%0A%20%20%20%20aWidget%20show.%0A%09%0A%20%20%20%20self%20update'),
+messageSends: ["open", "do:", "tabs", "hide", "show", "update"],
 referencedClasses: []
 }),
-smalltalk.ClassesList);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_renderOn_'),
+unescape('_setBodyMargin_'),
 smalltalk.method({
-selector: unescape('renderOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('setBodyMargin%3A'),
+category: 'actions',
+fn: function (anInteger){
 var self=this;
-(self['@ul']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column browser classes"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_ul", [])));
-smalltalk.send(self, "_updateNodes", []);
+smalltalk.send(smalltalk.send(".jtalkBody", "_asJQuery", []), "_css_put_", [unescape("margin-bottom"), smalltalk.send(smalltalk.send(anInteger, "_asString", []), "__comma", ["px"])]);
 return self;},
-args: ["html"],
-source: unescape('renderOn%3A%20html%0A%09ul%20%3A%3D%20html%20ul%0A%09%09class%3A%20%27jt_column%20browser%20classes%27%3B%0A%09%09yourself.%0A%09self%20updateNodes'),
-messageSends: ["class:", "yourself", "ul", "updateNodes"],
+args: ["anInteger"],
+source: unescape('setBodyMargin%3A%20anInteger%0A%20%20%20%20%27.jtalkBody%27%20asJQuery%20css%3A%20%27margin-bottom%27%20put%3A%20anInteger%20asString%2C%20%27px%27'),
+messageSends: ["css:put:", "asJQuery", unescape("%2C"), "asString"],
 referencedClasses: []
 }),
-smalltalk.ClassesList);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_updateNodes'),
+unescape('_tabs'),
 smalltalk.method({
-selector: unescape('updateNodes'),
-category: 'rendering',
+selector: unescape('tabs'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self['@ul'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_nodes", []), "_do_", [(function(each){return smalltalk.send(each, "_renderOn_", [html]);})]);})]);
+return (($receiver = self['@tabs']) == nil || $receiver == undefined) ? (function(){return (self['@tabs']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;},
 args: [],
-source: unescape('updateNodes%0A%09ul%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09self%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%09each%20renderOn%3A%20html%5D%5D'),
-messageSends: ["contents:", "do:", "nodes", "renderOn:"],
-referencedClasses: []
-}),
-smalltalk.ClassesList);
-
-
-smalltalk.addMethod(
-unescape('_on_'),
-smalltalk.method({
-selector: unescape('on%3A'),
-category: 'instance creation',
-fn: function (aBrowser){
-var self=this;
-return (function($rec){smalltalk.send($rec, "_browser_", [aBrowser]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
-return self;},
-args: ["aBrowser"],
-source: unescape('on%3A%20aBrowser%0A%09%5Eself%20new%20%0A%09%09browser%3A%20aBrowser%3B%20%0A%09%09yourself'),
-messageSends: ["browser:", "yourself", "new"],
-referencedClasses: []
+source: unescape('tabs%0A%20%20%20%20%5Etabs%20ifNil%3A%20%5Btabs%20%3A%3D%20Array%20new%5D'),
+messageSends: ["ifNil:", "new"],
+referencedClasses: ["Array"]
 }),
-smalltalk.ClassesList.klass);
-
+smalltalk.TabManager);
 
-smalltalk.addClass('ClassesListNode', smalltalk.Widget, ['browser', 'theClass', 'level', 'nodes'], 'IDE');
 smalltalk.addMethod(
-unescape('_renderOn_'),
+unescape('_update'),
 smalltalk.method({
-selector: unescape('renderOn%3A'),
-category: '',
-fn: function (html){
+selector: unescape('update'),
+category: 'updating',
+fn: function (){
 var self=this;
-var li=nil;
-var cssClass=nil;
-(cssClass="");
-(li=smalltalk.send(smalltalk.send(html, "_li", []), "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_browser", []), "_selectClass_", [smalltalk.send(self, "_theClass", [])]);})]));
-smalltalk.send(smalltalk.send(li, "_asJQuery", []), "_html_", [smalltalk.send(self, "_label", [])]);
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_browser", []), "_selectedClass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" selected"]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" selected"]));})]));
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_theClass", []), "_comment", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" commented"]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (cssClass=smalltalk.send(cssClass, "__comma", [" commented"]));})]));
-smalltalk.send(li, "_class_", [cssClass]);
-smalltalk.send(smalltalk.send(self, "_nodes", []), "_do_", [(function(each){return smalltalk.send(each, "_renderOn_", [html]);})]);
+smalltalk.send(self, "_renderTabs", []);
 return self;},
-args: ["html"],
-source: unescape('renderOn%3A%20html%0A%09%7C%20li%20cssClass%20%7C%0A%09cssClass%20%3A%3D%20%27%27.%0A%09li%20%3A%3D%20html%20li%20%0A%09%09onClick%3A%20%5Bself%20browser%20selectClass%3A%20self%20theClass%5D.%20%0A%09li%20asJQuery%20html%3A%20self%20label.%0A%0A%09self%20browser%20selectedClass%20%3D%20self%20theClass%20ifTrue%3A%20%20%5B%0A%09%09cssClass%20%3A%3D%20cssClass%2C%20%27%20selected%27%5D.%0A%0A%09self%20theClass%20comment%20isEmpty%20ifFalse%3A%20%5B%0A%09%09cssClass%20%3A%3D%20cssClass%2C%20%27%20commented%27%5D.%0A%0A%09li%20class%3A%20cssClass.%0A%0A%09self%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09each%20renderOn%3A%20html%5D'),
-messageSends: ["onClick:", "li", "selectClass:", "browser", "theClass", "html:", "asJQuery", "label", "ifTrue:", unescape("%3D"), "selectedClass", unescape("%2C"), "ifFalse:", "isEmpty", "comment", "class:", "do:", "nodes", "renderOn:"],
+args: [],
+source: unescape('update%0A%09self%20renderTabs'),
+messageSends: ["renderTabs"],
 referencedClasses: []
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_nodes'),
+unescape('_updateBodyMargin'),
 smalltalk.method({
-selector: unescape('nodes'),
-category: 'accessing',
+selector: unescape('updateBodyMargin'),
+category: 'actions',
 fn: function (){
 var self=this;
-return self['@nodes'];
+smalltalk.send(self, "_setBodyMargin_", [smalltalk.send(smalltalk.send(unescape("%23jtalk"), "_asJQuery", []), "_height", [])]);
 return self;},
 args: [],
-source: unescape('nodes%0A%09%5Enodes'),
-messageSends: [],
+source: unescape('updateBodyMargin%0A%20%20%20%20self%20setBodyMargin%3A%20%27%23jtalk%27%20asJQuery%20height'),
+messageSends: ["setBodyMargin:", "height", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabManager);
 
 smalltalk.addMethod(
-unescape('_theClass'),
+unescape('_updatePosition'),
 smalltalk.method({
-selector: unescape('theClass'),
-category: 'accessing',
+selector: unescape('updatePosition'),
+category: 'actions',
 fn: function (){
 var self=this;
-return self['@theClass'];
+jQuery('#jtalk').css('top', '').css('bottom', '0px');
 return self;},
 args: [],
-source: unescape('theClass%0A%09%5EtheClass'),
+source: unescape('updatePosition%0A%20%20%20%20%3CjQuery%28%27%23jtalk%27%29.css%28%27top%27%2C%20%27%27%29.css%28%27bottom%27%2C%20%270px%27%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabManager);
 
+
+smalltalk.TabManager.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_theClass_'),
+unescape('_current'),
 smalltalk.method({
-selector: unescape('theClass%3A'),
-category: 'accessing',
-fn: function (aClass){
+selector: unescape('current'),
+category: 'instance creation',
+fn: function (){
 var self=this;
-(self['@theClass']=aClass);
+return (($receiver = self['@current']) == nil || $receiver == undefined) ? (function(){return (self['@current']=smalltalk.send(self, "_new", [], smalltalk.Widget.klass));})() : $receiver;
 return self;},
-args: ["aClass"],
-source: unescape('theClass%3A%20aClass%0A%09theClass%20%3A%3D%20aClass'),
-messageSends: [],
+args: [],
+source: unescape('current%0A%20%20%20%20%5Ecurrent%20ifNil%3A%20%5Bcurrent%20%3A%3D%20super%20new%5D'),
+messageSends: ["ifNil:", "new"],
 referencedClasses: []
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabManager.klass);
 
 smalltalk.addMethod(
-unescape('_browser'),
+unescape('_new'),
 smalltalk.method({
-selector: unescape('browser'),
-category: 'accessing',
+selector: unescape('new'),
+category: 'instance creation',
 fn: function (){
 var self=this;
-return self['@browser'];
+smalltalk.send(self, "_shouldNotImplement", []);
 return self;},
 args: [],
-source: unescape('browser%0A%09%5Ebrowser'),
-messageSends: [],
+source: unescape('new%0A%20%20%20%20self%20shouldNotImplement'),
+messageSends: ["shouldNotImplement"],
 referencedClasses: []
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabManager.klass);
 
+
+smalltalk.addClass('TabWidget', smalltalk.Widget, ['div'], 'IDE');
 smalltalk.addMethod(
-unescape('_browser_'),
+unescape('_canBeClosed'),
 smalltalk.method({
-selector: unescape('browser%3A'),
-category: 'accessing',
-fn: function (aBrowser){
+selector: unescape('canBeClosed'),
+category: 'testing',
+fn: function (){
 var self=this;
-(self['@browser']=aBrowser);
+return false;
 return self;},
-args: ["aBrowser"],
-source: unescape('browser%3A%20aBrowser%0A%09browser%20%3A%3D%20aBrowser'),
+args: [],
+source: unescape('canBeClosed%0A%20%20%20%20%5Efalse'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_level'),
+unescape('_close'),
 smalltalk.method({
-selector: unescape('level'),
-category: 'accessing',
+selector: unescape('close'),
+category: 'actions',
 fn: function (){
 var self=this;
-return self['@level'];
+smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_closeTab_", [self]);
 return self;},
 args: [],
-source: unescape('level%0A%09%5Elevel'),
-messageSends: [],
-referencedClasses: []
+source: unescape('close%0A%20%20%20%20TabManager%20current%20closeTab%3A%20self'),
+messageSends: ["closeTab:", "current"],
+referencedClasses: ["TabManager"]
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_level_'),
+unescape('_hide'),
 smalltalk.method({
-selector: unescape('level%3A'),
-category: 'accessing',
-fn: function (anInteger){
+selector: unescape('hide'),
+category: 'actions',
+fn: function (){
 var self=this;
-(self['@level']=anInteger);
+smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_hide", []);
 return self;},
-args: ["anInteger"],
-source: unescape('level%3A%20anInteger%0A%09level%20%3A%3D%20anInteger'),
-messageSends: [],
+args: [],
+source: unescape('hide%0A%09div%20asJQuery%20hide'),
+messageSends: ["hide", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
 unescape('_label'),
@@ -1396,488 +1326,485 @@ selector: unescape('label'),
 category: 'accessing',
 fn: function (){
 var self=this;
-var str=nil;
-(str=smalltalk.send(smalltalk.send((smalltalk.String || String), "_new", []), "_writeStream", []));
-smalltalk.send(smalltalk.send(self, "_level", []), "_timesRepeat_", [(function(){return smalltalk.send(str, "_nextPutAll_", [unescape("%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B")]);})]);
-smalltalk.send(str, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_theClass", []), "_name", [])]);
-return smalltalk.send(str, "_contents", []);
+smalltalk.send(self, "_subclassResponsibility", []);
 return self;},
 args: [],
-source: unescape('label%0A%09%7C%20str%20%7C%0A%09str%20%3A%3D%20String%20new%20writeStream.%0A%09self%20level%20timesRepeat%3A%20%5B%0A%09%09str%20nextPutAll%3A%20%27%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%27%5D.%0A%09str%20nextPutAll%3A%20self%20theClass%20name.%0A%09%5Estr%20contents'),
-messageSends: ["writeStream", "new", "timesRepeat:", "level", "nextPutAll:", "name", "theClass", "contents"],
-referencedClasses: ["String"]
+source: unescape('label%0A%20%20%20%20self%20subclassResponsibility'),
+messageSends: ["subclassResponsibility"],
+referencedClasses: []
 }),
-smalltalk.ClassesListNode);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_getNodesFrom_'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('getNodesFrom%3A'),
-category: 'accessing',
-fn: function (aCollection){
+selector: unescape('open'),
+category: 'actions',
+fn: function (){
 var self=this;
-var children=nil;
-var others=nil;
-(children=[]);
-(others=[]);
-smalltalk.send(aCollection, "_do_", [(function(each){return ((($receiver = smalltalk.send(smalltalk.send(each, "_superclass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
-(self['@nodes']=smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassesListNode || ClassesListNode), "_on_browser_classes_level_", [each, smalltalk.send(self, "_browser", []), others, ((($receiver = smalltalk.send(self, "_level", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})]));
+smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_addTab_", [self]);
+smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_selectTab_", [self]);
 return self;},
-args: ["aCollection"],
-source: unescape('getNodesFrom%3A%20aCollection%0A%09%7C%20children%20others%20%7C%0A%09children%20%3A%3D%20%23%28%29.%0A%09others%20%3A%3D%20%23%28%29.%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%28each%20superclass%20%3D%20self%20theClass%29%0A%09%09%09ifTrue%3A%20%5Bchildren%20add%3A%20each%5D%0A%09%09%09ifFalse%3A%20%5Bothers%20add%3A%20each%5D%5D.%0A%09nodes%3A%3D%20children%20collect%3A%20%5B%3Aeach%20%7C%0A%09%09ClassesListNode%20on%3A%20each%20browser%3A%20self%20browser%20classes%3A%20others%20level%3A%20self%20level%20+%201%5D'),
-messageSends: ["do:", "ifTrue:ifFalse:", unescape("%3D"), "superclass", "theClass", "add:", "collect:", "on:browser:classes:level:", "browser", unescape("+"), "level"],
-referencedClasses: ["ClassesListNode"]
+args: [],
+source: unescape('open%0A%20%20%20%20TabManager%20current%20addTab%3A%20self.%0A%20%20%20%20TabManager%20current%20selectTab%3A%20self'),
+messageSends: ["addTab:", "current", "selectTab:"],
+referencedClasses: ["TabManager"]
 }),
-smalltalk.ClassesListNode);
-
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_on_browser_classes_level_'),
+unescape('_remove'),
 smalltalk.method({
-selector: unescape('on%3Abrowser%3Aclasses%3Alevel%3A'),
-category: 'instance creation',
-fn: function (aClass, aBrowser, aCollection, anInteger){
+selector: unescape('remove'),
+category: 'actions',
+fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_theClass_", [aClass]);smalltalk.send($rec, "_browser_", [aBrowser]);smalltalk.send($rec, "_level_", [anInteger]);smalltalk.send($rec, "_getNodesFrom_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_remove", []);
 return self;},
-args: ["aClass", "aBrowser", "aCollection", "anInteger"],
-source: unescape('on%3A%20aClass%20browser%3A%20aBrowser%20classes%3A%20aCollection%20level%3A%20anInteger%0A%09%5Eself%20new%0A%09%09theClass%3A%20aClass%3B%0A%09%09browser%3A%20aBrowser%3B%0A%09%09level%3A%20anInteger%3B%0A%09%09getNodesFrom%3A%20aCollection%3B%0A%09%09yourself'),
-messageSends: ["theClass:", "browser:", "level:", "getNodesFrom:", "yourself", "new"],
+args: [],
+source: unescape('remove%0A%09div%20asJQuery%20remove'),
+messageSends: ["remove", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.ClassesListNode.klass);
-
+smalltalk.TabWidget);
 
-smalltalk.addClass('DebugErrorHandler', smalltalk.ErrorHandler, [], 'IDE');
 smalltalk.addMethod(
-unescape('_handleError_'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('handleError%3A'),
-category: 'error handling',
-fn: function (anError){
+selector: unescape('renderBoxOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-smalltalk.send((function(){return (function($rec){smalltalk.send($rec, "_error_", [anError]);return smalltalk.send($rec, "_open", []);})(smalltalk.send((smalltalk.Debugger || Debugger), "_new", []));}), "_on_do_", [(smalltalk.Error || Error), (function(error){return smalltalk.send(smalltalk.send((smalltalk.ErrorHandler || ErrorHandler), "_new", []), "_handleError_", [error]);})]);
-return self;},
-args: ["anError"],
-source: unescape('handleError%3A%20anError%0A%09%5BDebugger%20new%0A%09%09error%3A%20anError%3B%0A%09%09open%5D%20on%3A%20Error%20do%3A%20%5B%3Aerror%20%7C%0A%09%09%09ErrorHandler%20new%20handleError%3A%20error%5D'),
-messageSends: ["on:do:", "error:", "open", "new", "handleError:"],
-referencedClasses: ["Debugger", "Error", "ErrorHandler"]
-}),
-smalltalk.DebugErrorHandler);
-
 
-smalltalk.addMethod(
-unescape('_initialize'),
-smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
-fn: function (){
-var self=this;
-smalltalk.send(self, "_register", []);
 return self;},
-args: [],
-source: unescape('initialize%0A%09self%20register'),
-messageSends: ["register"],
+args: ["html"],
+source: unescape('renderBoxOn%3A%20html'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.DebugErrorHandler.klass);
-
+smalltalk.TabWidget);
 
-smalltalk.addClass('Workspace', smalltalk.TabWidget, ['sourceArea'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('label'),
-category: 'accessing',
-fn: function (){
+selector: unescape('renderButtonsOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-return "Workspace";
+
 return self;},
-args: [],
-source: unescape('label%0A%20%20%20%20%5E%27Workspace%27'),
+args: ["html"],
+source: unescape('renderButtonsOn%3A%20html'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Workspace);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_clearWorkspace'),
+unescape('_renderOn_'),
 smalltalk.method({
-selector: unescape('clearWorkspace'),
-category: 'actions',
-fn: function (){
+selector: unescape('renderOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_clear", []);
+(self['@div']=(function($rec){smalltalk.send($rec, "_class_", ["jtalkTool"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_div", [])));
+smalltalk.send(self, "_renderTab", []);
 return self;},
-args: [],
-source: unescape('clearWorkspace%0A%20%20%20%20sourceArea%20clear'),
-messageSends: ["clear"],
+args: ["html"],
+source: unescape('renderOn%3A%20html%0A%09div%20%3A%3D%20html%20div%0A%09%09class%3A%20%27jtalkTool%27%3B%0A%09%09yourself.%0A%09self%20renderTab'),
+messageSends: ["class:", "yourself", "div", "renderTab"],
 referencedClasses: []
 }),
-smalltalk.Workspace);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_doIt'),
+unescape('_renderTab'),
 smalltalk.method({
-selector: unescape('doIt'),
-category: 'actions',
+selector: unescape('renderTab'),
+category: 'rendering',
 fn: function (){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_doIt", []);
+smalltalk.send(self['@div'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["jt_box"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderBoxOn_", [html]);})]);})(smalltalk.send(html, "_div", []));return (function($rec){smalltalk.send($rec, "_class_", ["jt_buttons"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderButtonsOn_", [html]);})]);})(smalltalk.send(html, "_div", []));})]);
 return self;},
 args: [],
-source: unescape('doIt%0A%20%20%20sourceArea%20doIt'),
-messageSends: ["doIt"],
+source: unescape('renderTab%0A%09div%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%20%20%20%20html%20div%0A%09%09class%3A%20%27jt_box%27%3B%0A%09%09with%3A%20%5Bself%20renderBoxOn%3A%20html%5D.%0A%09%20%20%20%20html%20div%0A%09%09class%3A%20%27jt_buttons%27%3B%0A%09%09with%3A%20%5Bself%20renderButtonsOn%3A%20html%5D%5D'),
+messageSends: ["contents:", "class:", "with:", "renderBoxOn:", "div", "renderButtonsOn:"],
 referencedClasses: []
 }),
-smalltalk.Workspace);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_printIt'),
+unescape('_show'),
 smalltalk.method({
-selector: unescape('printIt'),
+selector: unescape('show'),
 category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_printIt", []);
+smalltalk.send(smalltalk.send(self['@div'], "_asJQuery", []), "_show", []);
 return self;},
 args: [],
-source: unescape('printIt%0A%09sourceArea%20printIt'),
-messageSends: ["printIt"],
+source: unescape('show%0A%09div%20asJQuery%20show'),
+messageSends: ["show", "asJQuery"],
 referencedClasses: []
 }),
-smalltalk.Workspace);
+smalltalk.TabWidget);
 
 smalltalk.addMethod(
-unescape('_inspectIt'),
-smalltalk.method({
-selector: unescape('inspectIt'),
-category: 'actions',
+unescape('_update'),
+smalltalk.method({
+selector: unescape('update'),
+category: 'rendering',
 fn: function (){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_inspectIt", []);
+smalltalk.send(self, "_renderTab", []);
 return self;},
 args: [],
-source: unescape('inspectIt%0A%20%20%20%20sourceArea%20inspectIt'),
-messageSends: ["inspectIt"],
+source: unescape('update%0A%09self%20renderTab'),
+messageSends: ["renderTab"],
 referencedClasses: []
 }),
-smalltalk.Workspace);
+smalltalk.TabWidget);
+
 
 smalltalk.addMethod(
-unescape('_fileIn'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('fileIn'),
-category: 'actions',
+selector: unescape('open'),
+category: 'instance creation',
 fn: function (){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_fileIn", []);
+return smalltalk.send(smalltalk.send(self, "_new", []), "_open", []);
 return self;},
 args: [],
-source: unescape('fileIn%0A%20%20%20%20sourceArea%20fileIn'),
-messageSends: ["fileIn"],
+source: unescape('open%0A%20%20%20%20%5Eself%20new%20open'),
+messageSends: ["open", "new"],
 referencedClasses: []
 }),
-smalltalk.Workspace);
+smalltalk.TabWidget.klass);
 
+
+smalltalk.addClass('Browser', smalltalk.TabWidget, ['selectedPackage', 'selectedClass', 'selectedProtocol', 'selectedMethod', 'packagesList', 'classesList', 'protocolsList', 'methodsList', 'sourceArea', 'tabsList', 'selectedTab', 'saveButton', 'classButtons', 'methodButtons', 'unsavedChanges'], 'IDE');
 smalltalk.addMethod(
-unescape('_renderBoxOn_'),
+unescape('_addInstanceVariableNamed_toClass_'),
 smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('addInstanceVariableNamed%3AtoClass%3A'),
+category: 'actions',
+fn: function (aString, aClass){
 var self=this;
-(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));
-smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);
+smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_addSubclassOf_named_instanceVariableNames_package_", [smalltalk.send(aClass, "_superclass", []), smalltalk.send(aClass, "_name", []), (function($rec){smalltalk.send($rec, "_add_", [aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_copy", [])), smalltalk.send(smalltalk.send(aClass, "_package", []), "_name", [])]);
 return self;},
-args: ["html"],
-source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20sourceArea%20%3A%3D%20SourceArea%20new.%0A%20%20%20%20sourceArea%20renderOn%3A%20html'),
-messageSends: ["new", "renderOn:"],
-referencedClasses: ["SourceArea"]
+args: ["aString", "aClass"],
+source: unescape('addInstanceVariableNamed%3A%20aString%20toClass%3A%20aClass%0A%09ClassBuilder%20new%0A%09%09addSubclassOf%3A%20aClass%20superclass%20%0A%09%09named%3A%20aClass%20name%20%0A%09%09instanceVariableNames%3A%20%28aClass%20instanceVariableNames%20copy%20add%3A%20aString%3B%20yourself%29%0A%09%09package%3A%20aClass%20package%20name'),
+messageSends: ["addSubclassOf:named:instanceVariableNames:package:", "new", "superclass", "name", "add:", "yourself", "copy", "instanceVariableNames", "package"],
+referencedClasses: ["ClassBuilder"]
 }),
-smalltalk.Workspace);
+smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
+unescape('_addNewClass'),
 smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('addNewClass'),
+category: 'actions',
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+d")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+p")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+i")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["FileIn"]);smalltalk.send($rec, "_title_", [unescape("ctrl+f")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_fileIn", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["Clear workspace"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_clearWorkspace", []);})]);})(smalltalk.send(html, "_button", []));
+var className=nil;
+(className=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["New class"]));
+((($receiver = smalltalk.send(smalltalk.send(className, "_notNil", []), "_and_", [(function(){return smalltalk.send(className, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send((smalltalk.Object || Object), "_subclass_instanceVariableNames_package_", [className, "", smalltalk.send(self, "_selectedPackage", [])]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send((smalltalk.Object || Object), "_subclass_instanceVariableNames_package_", [className, "", smalltalk.send(self, "_selectedPackage", [])]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})]));
 return self;},
-args: ["html"],
-source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20html%20button%0A%09with%3A%20%27DoIt%27%3B%0A%09title%3A%20%27ctrl+d%27%3B%0A%09onClick%3A%20%5Bself%20doIt%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27PrintIt%27%3B%0A%09title%3A%20%27ctrl+p%27%3B%0A%09onClick%3A%20%5Bself%20printIt%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27InspectIt%27%3B%0A%09title%3A%20%27ctrl+i%27%3B%0A%09onClick%3A%20%5Bself%20inspectIt%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27FileIn%27%3B%0A%09title%3A%20%27ctrl+f%27%3B%0A%09onClick%3A%20%5Bself%20fileIn%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27Clear%20workspace%27%3B%0A%09onClick%3A%20%5Bself%20clearWorkspace%5D'),
-messageSends: ["with:", "title:", "onClick:", "doIt", "button", "printIt", "inspectIt", "fileIn", "clearWorkspace"],
-referencedClasses: []
+args: [],
+source: unescape('addNewClass%0A%09%7C%20className%20%7C%0A%09className%20%3A%3D%20window%20prompt%3A%20%27New%20class%27.%0A%09%28className%20notNil%20and%3A%20%5BclassName%20notEmpty%5D%29%20ifTrue%3A%20%5B%0A%09%09Object%20subclass%3A%20className%20instanceVariableNames%3A%20%27%27%20package%3A%20self%20selectedPackage.%0A%20%20%20%20%20%20%20%20%20%20%09%20self%20%0A%09%09%09resetClassesList%3B%0A%09%09%09updateClassesList.%0A%09%09self%20selectClass%3A%20%28Smalltalk%20current%20at%3A%20className%29%5D'),
+messageSends: ["prompt:", "ifTrue:", "and:", "notNil", "notEmpty", "subclass:instanceVariableNames:package:", "selectedPackage", "resetClassesList", "updateClassesList", "selectClass:", "at:", "current"],
+referencedClasses: ["Object", "Smalltalk"]
 }),
-smalltalk.Workspace);
-
-
+smalltalk.Browser);
 
-smalltalk.addClass('Browser', smalltalk.TabWidget, ['selectedPackage', 'selectedClass', 'selectedProtocol', 'selectedMethod', 'packagesList', 'classesList', 'protocolsList', 'methodsList', 'sourceArea', 'tabsList', 'selectedTab', 'saveButton', 'classButtons', 'methodButtons', 'unsavedChanges'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_addNewProtocol'),
 smalltalk.method({
-selector: unescape('label'),
-category: 'accessing',
+selector: unescape('addNewProtocol'),
+category: 'actions',
 fn: function (){
 var self=this;
-return (($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return unescape("Browser%20%28nil%29");})() : (function(){return smalltalk.send("Browser: ", "__comma", [smalltalk.send(self['@selectedClass'], "_name", [])]);})();
+var newProtocol=nil;
+(newProtocol=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["New method protocol"]));
+((($receiver = smalltalk.send(smalltalk.send(newProtocol, "_notNil", []), "_and_", [(function(){return smalltalk.send(newProtocol, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self['@selectedMethod'], "_category_", [newProtocol]);return smalltalk.send(self, "_setMethodProtocol_", [newProtocol]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self['@selectedMethod'], "_category_", [newProtocol]);return smalltalk.send(self, "_setMethodProtocol_", [newProtocol]);})]));
 return self;},
 args: [],
-source: unescape('label%0A%20%20%20%20%5EselectedClass%20%0A%09ifNil%3A%20%5B%27Browser%20%28nil%29%27%5D%0A%09ifNotNil%3A%20%5B%27Browser%3A%20%27%2C%20selectedClass%20name%5D'),
-messageSends: ["ifNil:ifNotNil:", unescape("%2C"), "name"],
+source: unescape('addNewProtocol%0A%20%20%20%20%7C%20newProtocol%20%7C%0A%20%20%20%20newProtocol%20%3A%3D%20window%20prompt%3A%20%27New%20method%20protocol%27.%0A%20%20%20%20%28newProtocol%20notNil%20and%3A%20%5BnewProtocol%20notEmpty%5D%29%20ifTrue%3A%20%5B%0A%09selectedMethod%20category%3A%20newProtocol.%0A%09self%20setMethodProtocol%3A%20newProtocol%5D'),
+messageSends: ["prompt:", "ifTrue:", "and:", "notNil", "notEmpty", "category:", "setMethodProtocol:"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_packages'),
+unescape('_ajaxPutAt_data_'),
 smalltalk.method({
-selector: unescape('packages'),
-category: 'accessing',
-fn: function (){
+selector: unescape('ajaxPutAt%3Adata%3A'),
+category: 'network',
+fn: function (anURL, aString){
 var self=this;
-var packages=nil;
-(packages=smalltalk.send((smalltalk.Array || Array), "_new", []));
-smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(packages, "_includes_", [smalltalk.send(each, "_category", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})]));})]);
-return smalltalk.send(packages, "_sort", []);
+smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_ajax_options_", [anURL, smalltalk.HashedCollection._fromPairs_([smalltalk.send("type", "__minus_gt", ["PUT"]),smalltalk.send("data", "__minus_gt", [aString]),smalltalk.send("contentType", "__minus_gt", [unescape("text/plain%3Bcharset%3DUTF-8")]),smalltalk.send("error", "__minus_gt", [(function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send("PUT request failed at:  ", "__comma", [anURL])]);})])])]);
 return self;},
-args: [],
-source: unescape('packages%0A%20%20%20%20%7C%20packages%20%7C%0A%20%20%20%20packages%20%3A%3D%20Array%20new.%0A%20%20%20%20Smalltalk%20current%20classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%28packages%20includes%3A%20each%20category%29%20ifFalse%3A%20%5B%0A%09%20%20%20%20packages%20add%3A%20each%20category%5D%5D.%0A%20%20%20%20%5Epackages%20sort'),
-messageSends: ["new", "do:", "classes", "current", "ifFalse:", "includes:", "category", "add:", "sort"],
-referencedClasses: ["Array", "Smalltalk"]
+args: ["anURL", "aString"],
+source: unescape('ajaxPutAt%3A%20anURL%20data%3A%20aString%0A%09jQuery%20%0A%09%09ajax%3A%20anURL%09options%3A%20%23%7B%09%27type%27%20-%3E%20%27PUT%27.%0A%09%09%09%09%09%09%09%09%27data%27%20-%3E%20aString.%0A%09%09%09%09%09%09%09%09%27contentType%27%20-%3E%20%27text/plain%3Bcharset%3DUTF-8%27.%0A%09%09%09%09%09%09%09%09%27error%27%20-%3E%20%5Bwindow%20alert%3A%20%27PUT%20request%20failed%20at%3A%20%20%27%2C%20anURL%5D%20%7D'),
+messageSends: ["ajax:options:", unescape("-%3E"), "alert:", unescape("%2C")],
+referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_classes'),
+unescape('_canBeClosed'),
 smalltalk.method({
-selector: unescape('classes'),
-category: 'accessing',
+selector: unescape('canBeClosed'),
+category: 'testing',
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(each, "_category", []), "__eq", [self['@selectedPackage']]);})]), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_name", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(b, "_name", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(b, "_name", [])]));})]), "_asSet", []);
+return true;
 return self;},
 args: [],
-source: unescape('classes%0A%20%20%20%20%5E%28%28Smalltalk%20current%20classes%20%0A%09select%3A%20%5B%3Aeach%20%7C%20each%20category%20%3D%20selectedPackage%5D%29%0A%09sort%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20name%20%3C%20b%20name%5D%29%20asSet'),
-messageSends: ["asSet", "sort:", "select:", "classes", "current", unescape("%3D"), "category", unescape("%3C"), "name"],
-referencedClasses: ["Smalltalk"]
+source: unescape('canBeClosed%0A%09%5Etrue'),
+messageSends: [],
+referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_protocols'),
+unescape('_cancelChanges'),
 smalltalk.method({
-selector: unescape('protocols'),
-category: 'accessing',
+selector: unescape('cancelChanges'),
+category: 'actions',
 fn: function (){
 var self=this;
-try{var klass=nil;
-(($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return []}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return []}})})();})]));(klass=((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return self['@selectedClass'];})() : (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return self['@selectedClass'];}), (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})])));((($receiver = smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_with_", ["not yet classified"])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_with_", ["not yet classified"])}})})();})]));return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send(klass, "_protocols", [])}})})();})() : nil;
-(function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_new", [])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_protocols'){return e.fn()} throw(e)}},
+return ((($receiver = self['@unsavedChanges']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [unescape("Cancel%20changes%3F")]);})() : (function(){return true;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [unescape("Cancel%20changes%3F")]);}), (function(){return true;})]));
+return self;},
 args: [],
-source: unescape('protocols%0A%20%20%20%20%7C%20klass%20%7C%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5B%5E%23%28%29%5D.%0A%09klass%20%3A%3D%20selectedTab%20%3D%20%23instance%0A%09%20%20%20%20ifTrue%3A%20%5BselectedClass%5D%0A%09%20%20%20%20ifFalse%3A%20%5BselectedClass%20class%5D.%0A%09klass%20methodDictionary%20isEmpty%20ifTrue%3A%20%5B%0A%09%20%20%20%20%5EArray%20with%3A%20%27not%20yet%20classified%27%5D.%0A%09%5Eklass%20protocols%5D.%0A%20%20%20%20%5EArray%20new'),
-messageSends: ["ifNotNil:", "ifTrue:", unescape("%3D"), "ifTrue:ifFalse:", "class", "isEmpty", "methodDictionary", "with:", "protocols", "new"],
-referencedClasses: ["Array"]
+source: unescape('cancelChanges%0A%20%20%20%20%5EunsavedChanges%20%0A%09ifTrue%3A%20%5Bwindow%20confirm%3A%20%27Cancel%20changes%3F%27%5D%0A%09ifFalse%3A%20%5Btrue%5D'),
+messageSends: ["ifTrue:ifFalse:", "confirm:"],
+referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_methods'),
+unescape('_classCommentSource'),
 smalltalk.method({
-selector: unescape('methods'),
+selector: unescape('classCommentSource'),
 category: 'accessing',
 fn: function (){
 var self=this;
-try{var klass=nil;
-((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return []}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return []}})})();})]));
-(($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return (klass=((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return self['@selectedClass'];})() : (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return self['@selectedClass'];}), (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})])));})() : nil;
-(function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return smalltalk.send((($receiver = self['@selectedProtocol']) == nil || $receiver == undefined) ? (function(){return (($receiver = klass) == nil || $receiver == undefined) ? (function(){return [];})() : (function(){return smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_values", []);})();})() : (function(){return smalltalk.send(smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_values", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(each, "_category", []), "__eq", [self['@selectedProtocol']]);})]);})(), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_selector", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(b, "_selector", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(b, "_selector", [])]));})])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_methods'){return e.fn()} throw(e)}},
+return smalltalk.send(self['@selectedClass'], "_comment", []);
+return self;},
 args: [],
-source: unescape('methods%0A%20%20%20%20%7C%20klass%20%7C%0A%20%20%20%20selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5B%5E%23%28%29%5D.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09klass%20%3A%3D%20selectedTab%20%3D%20%23instance%0A%09%20%20%20%20ifTrue%3A%20%5BselectedClass%5D%0A%09%20%20%20%20ifFalse%3A%20%5BselectedClass%20class%5D%5D.%0A%20%20%20%20%5E%28selectedProtocol%20%0A%09ifNil%3A%20%5B%0A%09%20%20%20%20klass%20%0A%09%09ifNil%3A%20%5B%23%28%29%5D%20%0A%09%09ifNotNil%3A%20%5Bklass%20methodDictionary%20values%5D%5D%0A%09ifNotNil%3A%20%5B%0A%09%20%20%20%20klass%20methodDictionary%20values%20select%3A%20%5B%3Aeach%20%7C%0A%09%09each%20category%20%3D%20selectedProtocol%5D%5D%29%20sort%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20selector%20%3C%20b%20selector%5D'),
-messageSends: ["ifTrue:", unescape("%3D"), "ifNotNil:", "ifTrue:ifFalse:", "class", "sort:", "ifNil:ifNotNil:", "values", "methodDictionary", "select:", "category", unescape("%3C"), "selector"],
+source: unescape('classCommentSource%0A%20%20%20%20%5EselectedClass%20comment'),
+messageSends: ["comment"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_classDeclarationSource'),
 smalltalk.method({
-selector: unescape('source'),
+selector: unescape('classDeclarationSource'),
 category: 'accessing',
 fn: function (){
 var self=this;
-try{((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_source', fn: function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_declarationSource", []);})() : (function(){return smalltalk.send(self, "_methodSource", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_declarationSource", []);}), (function(){return smalltalk.send(self, "_methodSource", []);})]))}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '_source', fn: function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_declarationSource", []);})() : (function(){return smalltalk.send(self, "_methodSource", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_declarationSource", []);}), (function(){return smalltalk.send(self, "_methodSource", []);})]))}})})();})]));
-(function(){throw({name: 'stReturn', selector: '_source', fn: function(){return (($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return "";})() : (function(){return smalltalk.send(self, "_classCommentSource", []);})()}})})();
+try{var stream=nil;
+(stream=smalltalk.send("", "_writeStream", []));
+(($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return (function(){throw({name: 'stReturn', selector: '_classDeclarationSource', fn: function(){return smalltalk.send(self, "_classDeclarationTemplate", [])}})})();})() : $receiver;
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@selectedClass'], "_superclass", []), "_asString", [])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%20subclass%3A%20%23")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@selectedClass'], "_name", [])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send((smalltalk.String || String), "_lf", []), "__comma", [smalltalk.send((smalltalk.String || String), "_tab", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("instanceVariableNames%3A%20%27")]);})(stream);
+smalltalk.send(smalltalk.send(self['@selectedClass'], "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(stream, "_nextPutAll_", [" "]);})]);
+(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])]), "__comma", [smalltalk.send((smalltalk.String || String), "_tab", [])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("package%3A%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@selectedClass'], "_category", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%27")]);})(stream);
+(function(){throw({name: 'stReturn', selector: '_classDeclarationSource', fn: function(){return smalltalk.send(stream, "_contents", [])}})})();
 return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_source'){return e.fn()} throw(e)}},
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_classDeclarationSource'){return e.fn()} throw(e)}},
 args: [],
-source: unescape('source%0A%20%20%20%20selectedTab%20%3D%20%23comment%20ifFalse%3A%20%5B%0A%09%5E%28selectedProtocol%20notNil%20or%3A%20%5BselectedMethod%20notNil%5D%29%0A%09%20%20%20%20ifFalse%3A%20%5Bself%20declarationSource%5D%0A%09%20%20%20%20ifTrue%3A%20%5Bself%20methodSource%5D%5D.%0A%20%20%20%20%5EselectedClass%0A%09ifNil%3A%20%5B%27%27%5D%0A%09ifNotNil%3A%20%5Bself%20classCommentSource%5D'),
-messageSends: ["ifFalse:", unescape("%3D"), "ifFalse:ifTrue:", "or:", "notNil", "declarationSource", "methodSource", "ifNil:ifNotNil:", "classCommentSource"],
-referencedClasses: []
+source: unescape('classDeclarationSource%0A%09%7C%20stream%20%7C%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09selectedClass%20ifNil%3A%20%5B%5Eself%20classDeclarationTemplate%5D.%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20superclass%20asString%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%20subclass%3A%20%23%27%3B%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20name%3B%0A%09%20%20%20%20nextPutAll%3A%20String%20lf%2C%20String%20tab%3B%0A%09%20%20%20%20nextPutAll%3A%20%27instanceVariableNames%3A%20%27%27%27.%0A%09selectedClass%20instanceVariableNames%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%5D%20%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%20%27%5D.%0A%09stream%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%2C%20String%20lf%2C%20String%20tab%3B%0A%09%20%20%20%20nextPutAll%3A%20%27package%3A%20%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20category%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27.%0A%09%5Estream%20contents'),
+messageSends: ["writeStream", "ifNil:", "classDeclarationTemplate", "nextPutAll:", "asString", "superclass", "name", unescape("%2C"), "lf", "tab", "do:separatedBy:", "instanceVariableNames", "category", "contents"],
+referencedClasses: ["String"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_methodSource'),
+unescape('_classDeclarationTemplate'),
 smalltalk.method({
-selector: unescape('methodSource'),
+selector: unescape('classDeclarationTemplate'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return (($receiver = self['@selectedMethod']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self, "_dummyMethodSource", []);})() : (function(){return smalltalk.send(self['@selectedMethod'], "_source", []);})();
+return smalltalk.send(smalltalk.send(unescape("Object%20subclass%3A%20%23NameOfSubclass%0A%09instanceVariableNames%3A%20%27%27%0A%09package%3A%20%27"), "__comma", [smalltalk.send(self, "_selectedPackage", [])]), "__comma", [unescape("%27")]);
 return self;},
 args: [],
-source: unescape('methodSource%0A%20%20%20%20%5EselectedMethod%0A%09ifNil%3A%20%5Bself%20dummyMethodSource%5D%0A%09ifNotNil%3A%20%5BselectedMethod%20source%5D'),
-messageSends: ["ifNil:ifNotNil:", "dummyMethodSource", "source"],
+source: unescape('classDeclarationTemplate%0A%09%5E%27Object%20subclass%3A%20%23NameOfSubclass%0A%09instanceVariableNames%3A%20%27%27%27%27%0A%09package%3A%20%27%27%27%2C%20self%20selectedPackage%2C%20%27%27%27%27'),
+messageSends: [unescape("%2C"), "selectedPackage"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_dummyMethodSource'),
+unescape('_classes'),
 smalltalk.method({
-selector: unescape('dummyMethodSource'),
+selector: unescape('classes'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return unescape("messageSelectorAndArgumentNames%0A%09%22comment%20stating%20purpose%20of%20message%22%0A%0A%09%7C%20temporary%20variable%20names%20%7C%0A%09statements");
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(each, "_category", []), "__eq", [self['@selectedPackage']]);})]), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_name", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(b, "_name", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(b, "_name", [])]));})]), "_asSet", []);
 return self;},
 args: [],
-source: unescape('dummyMethodSource%0A%20%20%20%20%5E%27messageSelectorAndArgumentNames%0A%09%22comment%20stating%20purpose%20of%20message%22%0A%0A%09%7C%20temporary%20variable%20names%20%7C%0A%09statements%27'),
-messageSends: [],
-referencedClasses: []
+source: unescape('classes%0A%20%20%20%20%5E%28%28Smalltalk%20current%20classes%20%0A%09select%3A%20%5B%3Aeach%20%7C%20each%20category%20%3D%20selectedPackage%5D%29%0A%09sort%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20name%20%3C%20b%20name%5D%29%20asSet'),
+messageSends: ["asSet", "sort:", "select:", "classes", "current", unescape("%3D"), "category", unescape("%3C"), "name"],
+referencedClasses: ["Smalltalk"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_declarationSource'),
+unescape('_commitPackage'),
 smalltalk.method({
-selector: unescape('declarationSource'),
-category: 'accessing',
+selector: unescape('commitPackage'),
+category: 'actions',
 fn: function (){
 var self=this;
-return ((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_classDeclarationSource", []);})() : (function(){return smalltalk.send(self, "_metaclassDeclarationSource", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_classDeclarationSource", []);}), (function(){return smalltalk.send(self, "_metaclassDeclarationSource", []);})]));
+(($receiver = self['@selectedPackage']) != nil && $receiver != undefined) ? (function(){var package=nil;
+(package=smalltalk.send((smalltalk.Package || Package), "_named_", [self['@selectedPackage']]));return smalltalk.send([smalltalk.send((smalltalk.Exporter || Exporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathJs", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".js"])]),smalltalk.send((smalltalk.StrippedExporter || StrippedExporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathJs", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".deploy.js"])]),smalltalk.send((smalltalk.ChunkExporter || ChunkExporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathSt", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".st"])])], "_do_", [(function(commitStrategy){var fileContents=nil;
+(fileContents=smalltalk.send(smalltalk.send(smalltalk.send(commitStrategy, "_key", []), "_new", []), "_exportPackage_", [self['@selectedPackage']]));return smalltalk.send(self, "_ajaxPutAt_data_", [smalltalk.send(commitStrategy, "_value", []), fileContents]);})]);})() : nil;
 return self;},
 args: [],
-source: unescape('declarationSource%0A%20%20%20%20%5EselectedTab%20%3D%20%23instance%0A%09ifTrue%3A%20%5Bself%20classDeclarationSource%5D%0A%09ifFalse%3A%20%5Bself%20metaclassDeclarationSource%5D'),
-messageSends: ["ifTrue:ifFalse:", unescape("%3D"), "classDeclarationSource", "metaclassDeclarationSource"],
-referencedClasses: []
+source: unescape('commitPackage%0A%09selectedPackage%20ifNotNil%3A%20%5B%20%7Cpackage%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09%09%20package%20%3A%3D%20Package%20named%3A%20selectedPackage.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09%09%20%7B%09Exporter%20%09%09%09-%3E%20%28package%20commitPathJs%2C%20%27/%27%2C%20selectedPackage%2C%20%27.js%27%29.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09StrippedExporter%20%09-%3E%20%28package%20commitPathJs%2C%20%27/%27%2C%20selectedPackage%2C%20%27.deploy.js%27%29.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09%09%20ChunkExporter%20%09%09-%3E%20%28package%20commitPathSt%2C%20%27/%27%2C%20selectedPackage%2C%20%27.st%27%29%20%09%09%09%7D%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09%09do%3A%20%5B%3AcommitStrategy%7C%20%7CfileContents%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09fileContents%20%3A%3D%20%28commitStrategy%20key%20new%20exportPackage%3A%20selectedPackage%29.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20ajaxPutAt%3A%20commitStrategy%20value%20data%3A%20%20fileContents%5D%0A%20%20%20%20%20%20%20%20%20%09%09%09%09%09%09%5D'),
+messageSends: ["ifNotNil:", "named:", "do:", unescape("-%3E"), unescape("%2C"), "commitPathJs", "commitPathSt", "exportPackage:", "new", "key", "ajaxPutAt:data:", "value"],
+referencedClasses: ["Package", "Exporter", "StrippedExporter", "ChunkExporter"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_classDeclarationSource'),
+unescape('_compile'),
 smalltalk.method({
-selector: unescape('classDeclarationSource'),
-category: 'accessing',
+selector: unescape('compile'),
+category: 'actions',
 fn: function (){
 var self=this;
-try{var stream=nil;
-(stream=smalltalk.send("", "_writeStream", []));
-(($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return (function(){throw({name: 'stReturn', selector: '_classDeclarationSource', fn: function(){return smalltalk.send(self, "_classDeclarationTemplate", [])}})})();})() : $receiver;
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@selectedClass'], "_superclass", []), "_asString", [])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%20subclass%3A%20%23")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@selectedClass'], "_name", [])]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send((smalltalk.String || String), "_lf", []), "__comma", [smalltalk.send((smalltalk.String || String), "_tab", [])])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("instanceVariableNames%3A%20%27")]);})(stream);
-smalltalk.send(smalltalk.send(self['@selectedClass'], "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(stream, "_nextPutAll_", [" "]);})]);
-(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])]), "__comma", [smalltalk.send((smalltalk.String || String), "_tab", [])])]);smalltalk.send($rec, "_nextPutAll_", [unescape("package%3A%20%27")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@selectedClass'], "_category", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%27")]);})(stream);
-(function(){throw({name: 'stReturn', selector: '_classDeclarationSource', fn: function(){return smalltalk.send(stream, "_contents", [])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_classDeclarationSource'){return e.fn()} throw(e)}},
+smalltalk.send(self, "_disableSaveButton", []);
+((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_compileClassComment", []);})() : nil;})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_compileDefinition", []);})() : (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_compileDefinition", []);}), (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_compileClassComment", []);})() : nil;}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_compileDefinition", []);})() : (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_compileDefinition", []);}), (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})]));})]));
+return self;},
 args: [],
-source: unescape('classDeclarationSource%0A%09%7C%20stream%20%7C%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09selectedClass%20ifNil%3A%20%5B%5Eself%20classDeclarationTemplate%5D.%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20superclass%20asString%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%20subclass%3A%20%23%27%3B%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20name%3B%0A%09%20%20%20%20nextPutAll%3A%20String%20lf%2C%20String%20tab%3B%0A%09%20%20%20%20nextPutAll%3A%20%27instanceVariableNames%3A%20%27%27%27.%0A%09selectedClass%20instanceVariableNames%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%5D%20%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%20%27%5D.%0A%09stream%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%2C%20String%20lf%2C%20String%20tab%3B%0A%09%20%20%20%20nextPutAll%3A%20%27package%3A%20%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20category%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27.%0A%09%5Estream%20contents'),
-messageSends: ["writeStream", "ifNil:", "classDeclarationTemplate", "nextPutAll:", "asString", "superclass", "name", unescape("%2C"), "lf", "tab", "do:separatedBy:", "instanceVariableNames", "category", "contents"],
-referencedClasses: ["String"]
+source: unescape('compile%0A%20%20%20%20self%20disableSaveButton.%0A%20%20%20%20selectedTab%20%3D%20%23comment%20%0A%09ifTrue%3A%20%5B%0A%09%09%09selectedClass%20ifNotNil%3A%20%5B%0A%09%09%09%09self%20compileClassComment%5D%5D%0A%09ifFalse%3A%20%5B%0A%09%09%09%28selectedProtocol%20notNil%20or%3A%20%5BselectedMethod%20notNil%5D%29%0A%09%09%09%09ifFalse%3A%20%5Bself%20compileDefinition%5D%0A%09%09%09%09ifTrue%3A%20%5Bself%20compileMethodDefinition%5D%5D'),
+messageSends: ["disableSaveButton", "ifTrue:ifFalse:", unescape("%3D"), "ifNotNil:", "compileClassComment", "ifFalse:ifTrue:", "or:", "notNil", "compileDefinition", "compileMethodDefinition"],
+referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_metaclassDeclarationSource'),
+unescape('_compileClassComment'),
 smalltalk.method({
-selector: unescape('metaclassDeclarationSource'),
-category: 'accessing',
+selector: unescape('compileClassComment'),
+category: 'actions',
 fn: function (){
-var self=this;
-var stream=nil;
-(stream=smalltalk.send("", "_writeStream", []));
-(($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@selectedClass'], "_asString", [])]);smalltalk.send($rec, "_nextPutAll_", [" class "]);return smalltalk.send($rec, "_nextPutAll_", [unescape("instanceVariableNames%3A%20%27")]);})(stream);smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(stream, "_nextPutAll_", [" "]);})]);return smalltalk.send(stream, "_nextPutAll_", [unescape("%27")]);})() : nil;
-return smalltalk.send(stream, "_contents", []);
+var self=this;
+smalltalk.send(self['@selectedClass'], "_comment_", [smalltalk.send(self['@sourceArea'], "_val", [])]);
 return self;},
 args: [],
-source: unescape('metaclassDeclarationSource%0A%20%20%20%20%7C%20stream%20%7C%0A%20%20%20%20stream%20%3A%3D%20%27%27%20writeStream.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20asString%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%20class%20%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27instanceVariableNames%3A%20%27%27%27.%0A%09selectedClass%20class%20instanceVariableNames%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%20%27%5D.%0A%09stream%20nextPutAll%3A%20%27%27%27%27%5D.%0A%20%20%20%20%5Estream%20contents'),
-messageSends: ["writeStream", "ifNotNil:", "nextPutAll:", "asString", "do:separatedBy:", "instanceVariableNames", "class", "contents"],
+source: unescape('compileClassComment%0A%20%20%20%20selectedClass%20comment%3A%20sourceArea%20val'),
+messageSends: ["comment:", "val"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_classCommentSource'),
+unescape('_compileDefinition'),
 smalltalk.method({
-selector: unescape('classCommentSource'),
-category: 'accessing',
+selector: unescape('compileDefinition'),
+category: 'actions',
 fn: function (){
 var self=this;
-return smalltalk.send(self['@selectedClass'], "_comment", []);
+var newClass=nil;
+(newClass=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [smalltalk.send(self['@sourceArea'], "_val", [])]));
+(function($rec){smalltalk.send($rec, "_resetClassesList", []);smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+smalltalk.send(self, "_selectClass_", [newClass]);
 return self;},
 args: [],
-source: unescape('classCommentSource%0A%20%20%20%20%5EselectedClass%20comment'),
-messageSends: ["comment"],
-referencedClasses: []
+source: unescape('compileDefinition%0A%20%20%20%20%7C%20newClass%20%7C%0A%20%20%20%20newClass%20%3A%3D%20Compiler%20new%20loadExpression%3A%20sourceArea%20val.%0A%20%20%20%20self%20%0A%09resetClassesList%3B%0A%09updateCategoriesList%3B%0A%09updateClassesList.%0A%20%20%20%20self%20selectClass%3A%20newClass'),
+messageSends: ["loadExpression:", "new", "val", "resetClassesList", "updateCategoriesList", "updateClassesList", "selectClass:"],
+referencedClasses: ["Compiler"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_selectedClass'),
+unescape('_compileMethodDefinition'),
 smalltalk.method({
-selector: unescape('selectedClass'),
-category: 'accessing',
+selector: unescape('compileMethodDefinition'),
+category: 'actions',
 fn: function (){
 var self=this;
-return self['@selectedClass'];
+((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [self['@selectedClass']]);})() : (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [smalltalk.send(self['@selectedClass'], "_class", [])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [self['@selectedClass']]);}), (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [smalltalk.send(self['@selectedClass'], "_class", [])]);})]));
 return self;},
 args: [],
-source: unescape('selectedClass%0A%09%5EselectedClass'),
-messageSends: [],
+source: unescape('compileMethodDefinition%0A%20%20%20%20selectedTab%20%3D%20%23instance%0A%09ifTrue%3A%20%5Bself%20compileMethodDefinitionFor%3A%20selectedClass%5D%0A%09ifFalse%3A%20%5Bself%20compileMethodDefinitionFor%3A%20selectedClass%20class%5D'),
+messageSends: ["ifTrue:ifFalse:", unescape("%3D"), "compileMethodDefinitionFor:", "class"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_classDeclarationTemplate'),
+unescape('_compileMethodDefinitionFor_'),
 smalltalk.method({
-selector: unescape('classDeclarationTemplate'),
-category: 'accessing',
+selector: unescape('compileMethodDefinitionFor%3A'),
+category: 'actions',
+fn: function (aClass){
+var self=this;
+try{var compiler=nil;
+var method=nil;
+var source=nil;
+var node=nil;
+(source=smalltalk.send(self['@sourceArea'], "_val", []));
+(($receiver = self['@selectedProtocol']) == nil || $receiver == undefined) ? (function(){return (self['@selectedProtocol']=smalltalk.send(self['@selectedMethod'], "_category", []));})() : $receiver;
+(compiler=smalltalk.send((smalltalk.Compiler || Compiler), "_new", []));
+smalltalk.send(compiler, "_source_", [source]);
+(node=smalltalk.send(compiler, "_parse_", [source]));
+((($receiver = smalltalk.send(node, "_isParseFailure", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(smalltalk.send(smalltalk.send("PARSE ERROR: ", "__comma", [smalltalk.send(node, "_reason", [])]), "__comma", [unescape("%2C%20position%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(node, "_position", []), "_asString", [])])])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(smalltalk.send(smalltalk.send("PARSE ERROR: ", "__comma", [smalltalk.send(node, "_reason", [])]), "__comma", [unescape("%2C%20position%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(node, "_position", []), "_asString", [])])])}})})();})]));
+smalltalk.send(compiler, "_currentClass_", [aClass]);
+(method=smalltalk.send(compiler, "_eval_", [smalltalk.send(compiler, "_compileNode_", [node])]));
+smalltalk.send(method, "_category_", [self['@selectedProtocol']]);
+smalltalk.send(smalltalk.send(compiler, "_unknownVariables", []), "_do_", [(function(each){return (($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_at_", [each])) == nil || $receiver == undefined) ? (function(){return ((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send(unescape("Declare%20%27"), "__comma", [each]), "__comma", [unescape("%27%20as%20instance%20variable%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_addInstanceVariableNamed_toClass_", [each, aClass]);return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [aClass])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_addInstanceVariableNamed_toClass_", [each, aClass]);return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [aClass])}})})();})]));})() : $receiver;})]);
+smalltalk.send(aClass, "_addCompiledMethod_", [method]);
+smalltalk.send(compiler, "_setupClass_", [aClass]);
+smalltalk.send(self, "_updateMethodsList", []);
+smalltalk.send(self, "_selectMethod_", [method]);
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_compileMethodDefinitionFor_'){return e.fn()} throw(e)}},
+args: ["aClass"],
+source: unescape('compileMethodDefinitionFor%3A%20aClass%0A%20%20%20%20%7C%20compiler%20method%20source%20node%20%7C%20%0A%20%20%20%20source%20%3A%3D%20sourceArea%20val.%0A%20%20%20%20selectedProtocol%20ifNil%3A%20%5BselectedProtocol%20%3A%3D%20selectedMethod%20category%5D.%0A%20%20%20%20compiler%20%3A%3D%20Compiler%20new.%0A%20%20%20%20compiler%20source%3A%20source.%0A%20%20%20%20node%20%3A%3D%20compiler%20parse%3A%20source.%0A%20%20%20%20node%20isParseFailure%20ifTrue%3A%20%5B%0A%09%5Ewindow%20alert%3A%20%27PARSE%20ERROR%3A%20%27%2C%20node%20reason%2C%20%27%2C%20position%3A%20%27%2C%20node%20position%20asString%5D.%0A%20%20%20%20compiler%20currentClass%3A%20aClass.%0A%20%20%20%20method%20%3A%3D%20compiler%20eval%3A%20%28compiler%20compileNode%3A%20node%29.%0A%20%20%20%20method%20category%3A%20selectedProtocol.%0A%20%20%20%20compiler%20unknownVariables%20do%3A%20%5B%3Aeach%20%7C%0A%20%20%20%20%20%20%20%20%20%22Do%20not%20try%20to%20redeclare%20javascript%27s%20objects%22%0A%20%20%20%20%20%20%20%20%20%28window%20at%3A%20each%29%20ifNil%3A%20%5B%0A%09%20%09%28window%20confirm%3A%20%27Declare%20%27%27%27%2C%20each%2C%20%27%27%27%20as%20instance%20variable%3F%27%29%20ifTrue%3A%20%5B%0A%09%09%09self%20addInstanceVariableNamed%3A%20each%20toClass%3A%20aClass.%0A%09%09%09%5Eself%20compileMethodDefinitionFor%3A%20aClass%5D%5D%5D.%0A%20%20%20%20aClass%20addCompiledMethod%3A%20method.%0A%20%20%20%20compiler%20setupClass%3A%20aClass.%0A%20%20%20%20self%20updateMethodsList.%0A%20%20%20%20self%20selectMethod%3A%20method'),
+messageSends: ["val", "ifNil:", "category", "new", "source:", "parse:", "ifTrue:", "isParseFailure", "alert:", unescape("%2C"), "reason", "asString", "position", "currentClass:", "eval:", "compileNode:", "category:", "do:", "unknownVariables", "at:", "confirm:", "addInstanceVariableNamed:toClass:", "compileMethodDefinitionFor:", "addCompiledMethod:", "setupClass:", "updateMethodsList", "selectMethod:"],
+referencedClasses: ["Compiler"]
+}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+unescape('_copyClass'),
+smalltalk.method({
+selector: unescape('copyClass'),
+category: 'actions',
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(unescape("Object%20subclass%3A%20%23NameOfSubclass%0A%09instanceVariableNames%3A%20%27%27%0A%09package%3A%20%27"), "__comma", [smalltalk.send(self, "_selectedPackage", [])]), "__comma", [unescape("%27")]);
+var className=nil;
+(className=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["Copy class"]));
+((($receiver = smalltalk.send(smalltalk.send(className, "_notNil", []), "_and_", [(function(){return smalltalk.send(className, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_copyClass_named_", [smalltalk.send(self, "_selectedClass", []), className]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_copyClass_named_", [smalltalk.send(self, "_selectedClass", []), className]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})]));
 return self;},
 args: [],
-source: unescape('classDeclarationTemplate%0A%09%5E%27Object%20subclass%3A%20%23NameOfSubclass%0A%09instanceVariableNames%3A%20%27%27%27%27%0A%09package%3A%20%27%27%27%2C%20self%20selectedPackage%2C%20%27%27%27%27'),
-messageSends: [unescape("%2C"), "selectedPackage"],
-referencedClasses: []
+source: unescape('copyClass%0A%09%7C%20className%20%7C%0A%09className%20%3A%3D%20window%20prompt%3A%20%27Copy%20class%27.%0A%09%28className%20notNil%20and%3A%20%5BclassName%20notEmpty%5D%29%20ifTrue%3A%20%5B%0A%09%09ClassBuilder%20new%20copyClass%3A%20self%20selectedClass%20named%3A%20className.%0A%20%20%20%20%20%20%20%20%20%20%09%20self%20%0A%09%09%09resetClassesList%3B%0A%09%09%09updateClassesList.%0A%09%09self%20selectClass%3A%20%28Smalltalk%20current%20at%3A%20className%29%5D'),
+messageSends: ["prompt:", "ifTrue:", "and:", "notNil", "notEmpty", "copyClass:named:", "new", "selectedClass", "resetClassesList", "updateClassesList", "selectClass:", "at:", "current"],
+referencedClasses: ["ClassBuilder", "Smalltalk"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_selectedPackage'),
+unescape('_declarationSource'),
 smalltalk.method({
-selector: unescape('selectedPackage'),
+selector: unescape('declarationSource'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@selectedPackage'];
+return ((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_classDeclarationSource", []);})() : (function(){return smalltalk.send(self, "_metaclassDeclarationSource", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_classDeclarationSource", []);}), (function(){return smalltalk.send(self, "_metaclassDeclarationSource", []);})]));
 return self;},
 args: [],
-source: unescape('selectedPackage%0A%09%5EselectedPackage'),
-messageSends: [],
+source: unescape('declarationSource%0A%20%20%20%20%5EselectedTab%20%3D%20%23instance%0A%09ifTrue%3A%20%5Bself%20classDeclarationSource%5D%0A%09ifFalse%3A%20%5Bself%20metaclassDeclarationSource%5D'),
+messageSends: ["ifTrue:ifFalse:", unescape("%3D"), "classDeclarationSource", "metaclassDeclarationSource"],
 referencedClasses: []
 }),
 smalltalk.Browser);
@@ -1900,33 +1827,56 @@ referencedClasses: []
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_hideClassButtons'),
+unescape('_dummyMethodSource'),
 smalltalk.method({
-selector: unescape('hideClassButtons'),
-category: 'actions',
+selector: unescape('dummyMethodSource'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@classButtons'], "_asJQuery", []), "_hide", []);
+return unescape("messageSelectorAndArgumentNames%0A%09%22comment%20stating%20purpose%20of%20message%22%0A%0A%09%7C%20temporary%20variable%20names%20%7C%0A%09statements");
 return self;},
 args: [],
-source: unescape('hideClassButtons%0A%20%20%20%20classButtons%20asJQuery%20hide'),
-messageSends: ["hide", "asJQuery"],
+source: unescape('dummyMethodSource%0A%20%20%20%20%5E%27messageSelectorAndArgumentNames%0A%09%22comment%20stating%20purpose%20of%20message%22%0A%0A%09%7C%20temporary%20variable%20names%20%7C%0A%09statements%27'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_showClassButtons'),
+unescape('_handleSourceAreaKeyDown_'),
 smalltalk.method({
-selector: unescape('showClassButtons'),
+selector: unescape('handleSourceAreaKeyDown%3A'),
+category: 'actions',
+fn: function (anEvent){
+var self=this;
+if(anEvent.ctrlKey) {
+		if(anEvent.keyCode === 83) { //ctrl+s
+			self._compile();
+			anEvent.preventDefault();
+			return false;
+		}
+	}
+	;
+return self;},
+args: ["anEvent"],
+source: unescape('handleSourceAreaKeyDown%3A%20anEvent%0A%09%20%3Cif%28anEvent.ctrlKey%29%20%7B%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2083%29%20%7B%20//ctrl+s%0A%09%09%09self._compile%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%7D%0A%09%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+unescape('_hideClassButtons'),
+smalltalk.method({
+selector: unescape('hideClassButtons'),
 category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@classButtons'], "_asJQuery", []), "_show", []);
+smalltalk.send(smalltalk.send(self['@classButtons'], "_asJQuery", []), "_hide", []);
 return self;},
 args: [],
-source: unescape('showClassButtons%0A%20%20%20%20classButtons%20asJQuery%20show'),
-messageSends: ["show", "asJQuery"],
+source: unescape('hideClassButtons%0A%20%20%20%20classButtons%20asJQuery%20hide'),
+messageSends: ["hide", "asJQuery"],
 referencedClasses: []
 }),
 smalltalk.Browser);
@@ -1948,136 +1898,130 @@ referencedClasses: []
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_showMethodButtons'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('showMethodButtons'),
-category: 'actions',
+selector: unescape('initialize'),
+category: 'initialization',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@methodButtons'], "_asJQuery", []), "_show", []);
+smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
+(self['@selectedTab']=smalltalk.symbolFor("instance"));
+(self['@selectedPackage']=smalltalk.send(smalltalk.send(self, "_packages", []), "_first", []));
+(self['@unsavedChanges']=false);
 return self;},
 args: [],
-source: unescape('showMethodButtons%0A%20%20%20%20methodButtons%20asJQuery%20show'),
-messageSends: ["show", "asJQuery"],
+source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20selectedTab%20%3A%3D%20%23instance.%0A%20%20%20%20selectedPackage%20%3A%3D%20self%20packages%20first.%0A%20%20%20%20unsavedChanges%20%3A%3D%20false'),
+messageSends: ["initialize", "first", "packages"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_compile'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('compile'),
-category: 'actions',
+selector: unescape('label'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_disableSaveButton", []);
-((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_compileClassComment", []);})() : nil;})() : (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_compileDefinition", []);})() : (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_compileDefinition", []);}), (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_compileClassComment", []);})() : nil;}), (function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_compileDefinition", []);})() : (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_compileDefinition", []);}), (function(){return smalltalk.send(self, "_compileMethodDefinition", []);})]));})]));
+return (($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return unescape("Browser%20%28nil%29");})() : (function(){return smalltalk.send("Browser: ", "__comma", [smalltalk.send(self['@selectedClass'], "_name", [])]);})();
 return self;},
 args: [],
-source: unescape('compile%0A%20%20%20%20self%20disableSaveButton.%0A%20%20%20%20selectedTab%20%3D%20%23comment%20%0A%09ifTrue%3A%20%5B%0A%09%09%09selectedClass%20ifNotNil%3A%20%5B%0A%09%09%09%09self%20compileClassComment%5D%5D%0A%09ifFalse%3A%20%5B%0A%09%09%09%28selectedProtocol%20notNil%20or%3A%20%5BselectedMethod%20notNil%5D%29%0A%09%09%09%09ifFalse%3A%20%5Bself%20compileDefinition%5D%0A%09%09%09%09ifTrue%3A%20%5Bself%20compileMethodDefinition%5D%5D'),
-messageSends: ["disableSaveButton", "ifTrue:ifFalse:", unescape("%3D"), "ifNotNil:", "compileClassComment", "ifFalse:ifTrue:", "or:", "notNil", "compileDefinition", "compileMethodDefinition"],
+source: unescape('label%0A%20%20%20%20%5EselectedClass%20%0A%09ifNil%3A%20%5B%27Browser%20%28nil%29%27%5D%0A%09ifNotNil%3A%20%5B%27Browser%3A%20%27%2C%20selectedClass%20name%5D'),
+messageSends: ["ifNil:ifNotNil:", unescape("%2C"), "name"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_compileClassComment'),
+unescape('_metaclassDeclarationSource'),
 smalltalk.method({
-selector: unescape('compileClassComment'),
-category: 'actions',
+selector: unescape('metaclassDeclarationSource'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self['@selectedClass'], "_comment_", [smalltalk.send(self['@sourceArea'], "_val", [])]);
+var stream=nil;
+(stream=smalltalk.send("", "_writeStream", []));
+(($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self['@selectedClass'], "_asString", [])]);smalltalk.send($rec, "_nextPutAll_", [" class "]);return smalltalk.send($rec, "_nextPutAll_", [unescape("instanceVariableNames%3A%20%27")]);})(stream);smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedClass'], "_class", []), "_instanceVariableNames", []), "_do_separatedBy_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [each]);}), (function(){return smalltalk.send(stream, "_nextPutAll_", [" "]);})]);return smalltalk.send(stream, "_nextPutAll_", [unescape("%27")]);})() : nil;
+return smalltalk.send(stream, "_contents", []);
 return self;},
 args: [],
-source: unescape('compileClassComment%0A%20%20%20%20selectedClass%20comment%3A%20sourceArea%20val'),
-messageSends: ["comment:", "val"],
+source: unescape('metaclassDeclarationSource%0A%20%20%20%20%7C%20stream%20%7C%0A%20%20%20%20stream%20%3A%3D%20%27%27%20writeStream.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20asString%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%20class%20%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27instanceVariableNames%3A%20%27%27%27.%0A%09selectedClass%20class%20instanceVariableNames%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%20%27%5D.%0A%09stream%20nextPutAll%3A%20%27%27%27%27%5D.%0A%20%20%20%20%5Estream%20contents'),
+messageSends: ["writeStream", "ifNotNil:", "nextPutAll:", "asString", "do:separatedBy:", "instanceVariableNames", "class", "contents"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_compileMethodDefinition'),
+unescape('_methodSource'),
 smalltalk.method({
-selector: unescape('compileMethodDefinition'),
-category: 'actions',
+selector: unescape('methodSource'),
+category: 'accessing',
 fn: function (){
 var self=this;
-((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [self['@selectedClass']]);})() : (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [smalltalk.send(self['@selectedClass'], "_class", [])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [self['@selectedClass']]);}), (function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [smalltalk.send(self['@selectedClass'], "_class", [])]);})]));
+return (($receiver = self['@selectedMethod']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self, "_dummyMethodSource", []);})() : (function(){return smalltalk.send(self['@selectedMethod'], "_source", []);})();
 return self;},
 args: [],
-source: unescape('compileMethodDefinition%0A%20%20%20%20selectedTab%20%3D%20%23instance%0A%09ifTrue%3A%20%5Bself%20compileMethodDefinitionFor%3A%20selectedClass%5D%0A%09ifFalse%3A%20%5Bself%20compileMethodDefinitionFor%3A%20selectedClass%20class%5D'),
-messageSends: ["ifTrue:ifFalse:", unescape("%3D"), "compileMethodDefinitionFor:", "class"],
+source: unescape('methodSource%0A%20%20%20%20%5EselectedMethod%0A%09ifNil%3A%20%5Bself%20dummyMethodSource%5D%0A%09ifNotNil%3A%20%5BselectedMethod%20source%5D'),
+messageSends: ["ifNil:ifNotNil:", "dummyMethodSource", "source"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_compileMethodDefinitionFor_'),
+unescape('_methods'),
 smalltalk.method({
-selector: unescape('compileMethodDefinitionFor%3A'),
-category: 'actions',
-fn: function (aClass){
+selector: unescape('methods'),
+category: 'accessing',
+fn: function (){
 var self=this;
-try{var compiler=nil;
-var method=nil;
-var source=nil;
-var node=nil;
-(source=smalltalk.send(self['@sourceArea'], "_val", []));
-(($receiver = self['@selectedProtocol']) == nil || $receiver == undefined) ? (function(){return (self['@selectedProtocol']=smalltalk.send(self['@selectedMethod'], "_category", []));})() : $receiver;
-(compiler=smalltalk.send((smalltalk.Compiler || Compiler), "_new", []));
-smalltalk.send(compiler, "_source_", [source]);
-(node=smalltalk.send(compiler, "_parse_", [source]));
-((($receiver = smalltalk.send(node, "_isParseFailure", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(smalltalk.send(smalltalk.send("PARSE ERROR: ", "__comma", [smalltalk.send(node, "_reason", [])]), "__comma", [unescape("%2C%20position%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(node, "_position", []), "_asString", [])])])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send(smalltalk.send(smalltalk.send("PARSE ERROR: ", "__comma", [smalltalk.send(node, "_reason", [])]), "__comma", [unescape("%2C%20position%3A%20")]), "__comma", [smalltalk.send(smalltalk.send(node, "_position", []), "_asString", [])])])}})})();})]));
-smalltalk.send(compiler, "_currentClass_", [aClass]);
-(method=smalltalk.send(compiler, "_eval_", [smalltalk.send(compiler, "_compileNode_", [node])]));
-smalltalk.send(method, "_category_", [self['@selectedProtocol']]);
-smalltalk.send(smalltalk.send(compiler, "_unknownVariables", []), "_do_", [(function(each){return (($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_at_", [each])) == nil || $receiver == undefined) ? (function(){return ((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send(unescape("Declare%20%27"), "__comma", [each]), "__comma", [unescape("%27%20as%20instance%20variable%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self, "_addInstanceVariableNamed_toClass_", [each, aClass]);return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [aClass])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self, "_addInstanceVariableNamed_toClass_", [each, aClass]);return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return smalltalk.send(self, "_compileMethodDefinitionFor_", [aClass])}})})();})]));})() : $receiver;})]);
-smalltalk.send(aClass, "_addCompiledMethod_", [method]);
-smalltalk.send(compiler, "_setupClass_", [aClass]);
-smalltalk.send(self, "_updateMethodsList", []);
-smalltalk.send(self, "_selectMethod_", [method]);
+try{var klass=nil;
+((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return []}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return []}})})();})]));
+(($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){return (klass=((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return self['@selectedClass'];})() : (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return self['@selectedClass'];}), (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})])));})() : nil;
+(function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return smalltalk.send((($receiver = self['@selectedProtocol']) == nil || $receiver == undefined) ? (function(){return (($receiver = klass) == nil || $receiver == undefined) ? (function(){return [];})() : (function(){return smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_values", []);})();})() : (function(){return smalltalk.send(smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_values", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(each, "_category", []), "__eq", [self['@selectedProtocol']]);})]);})(), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_selector", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(b, "_selector", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(b, "_selector", [])]));})])}})})();
 return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_compileMethodDefinitionFor_'){return e.fn()} throw(e)}},
-args: ["aClass"],
-source: unescape('compileMethodDefinitionFor%3A%20aClass%0A%20%20%20%20%7C%20compiler%20method%20source%20node%20%7C%20%0A%20%20%20%20source%20%3A%3D%20sourceArea%20val.%0A%20%20%20%20selectedProtocol%20ifNil%3A%20%5BselectedProtocol%20%3A%3D%20selectedMethod%20category%5D.%0A%20%20%20%20compiler%20%3A%3D%20Compiler%20new.%0A%20%20%20%20compiler%20source%3A%20source.%0A%20%20%20%20node%20%3A%3D%20compiler%20parse%3A%20source.%0A%20%20%20%20node%20isParseFailure%20ifTrue%3A%20%5B%0A%09%5Ewindow%20alert%3A%20%27PARSE%20ERROR%3A%20%27%2C%20node%20reason%2C%20%27%2C%20position%3A%20%27%2C%20node%20position%20asString%5D.%0A%20%20%20%20compiler%20currentClass%3A%20aClass.%0A%20%20%20%20method%20%3A%3D%20compiler%20eval%3A%20%28compiler%20compileNode%3A%20node%29.%0A%20%20%20%20method%20category%3A%20selectedProtocol.%0A%20%20%20%20compiler%20unknownVariables%20do%3A%20%5B%3Aeach%20%7C%0A%20%20%20%20%20%20%20%20%20%22Do%20not%20try%20to%20redeclare%20javascript%27s%20objects%22%0A%20%20%20%20%20%20%20%20%20%28window%20at%3A%20each%29%20ifNil%3A%20%5B%0A%09%20%09%28window%20confirm%3A%20%27Declare%20%27%27%27%2C%20each%2C%20%27%27%27%20as%20instance%20variable%3F%27%29%20ifTrue%3A%20%5B%0A%09%09%09self%20addInstanceVariableNamed%3A%20each%20toClass%3A%20aClass.%0A%09%09%09%5Eself%20compileMethodDefinitionFor%3A%20aClass%5D%5D%5D.%0A%20%20%20%20aClass%20addCompiledMethod%3A%20method.%0A%20%20%20%20compiler%20setupClass%3A%20aClass.%0A%20%20%20%20self%20updateMethodsList.%0A%20%20%20%20self%20selectMethod%3A%20method'),
-messageSends: ["val", "ifNil:", "category", "new", "source:", "parse:", "ifTrue:", "isParseFailure", "alert:", unescape("%2C"), "reason", "asString", "position", "currentClass:", "eval:", "compileNode:", "category:", "do:", "unknownVariables", "at:", "confirm:", "addInstanceVariableNamed:toClass:", "compileMethodDefinitionFor:", "addCompiledMethod:", "setupClass:", "updateMethodsList", "selectMethod:"],
-referencedClasses: ["Compiler"]
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_methods'){return e.fn()} throw(e)}},
+args: [],
+source: unescape('methods%0A%20%20%20%20%7C%20klass%20%7C%0A%20%20%20%20selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5B%5E%23%28%29%5D.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09klass%20%3A%3D%20selectedTab%20%3D%20%23instance%0A%09%20%20%20%20ifTrue%3A%20%5BselectedClass%5D%0A%09%20%20%20%20ifFalse%3A%20%5BselectedClass%20class%5D%5D.%0A%20%20%20%20%5E%28selectedProtocol%20%0A%09ifNil%3A%20%5B%0A%09%20%20%20%20klass%20%0A%09%09ifNil%3A%20%5B%23%28%29%5D%20%0A%09%09ifNotNil%3A%20%5Bklass%20methodDictionary%20values%5D%5D%0A%09ifNotNil%3A%20%5B%0A%09%20%20%20%20klass%20methodDictionary%20values%20select%3A%20%5B%3Aeach%20%7C%0A%09%09each%20category%20%3D%20selectedProtocol%5D%5D%29%20sort%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20selector%20%3C%20b%20selector%5D'),
+messageSends: ["ifTrue:", unescape("%3D"), "ifNotNil:", "ifTrue:ifFalse:", "class", "sort:", "ifNil:ifNotNil:", "values", "methodDictionary", "select:", "category", unescape("%3C"), "selector"],
+referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_compileDefinition'),
+unescape('_packages'),
 smalltalk.method({
-selector: unescape('compileDefinition'),
-category: 'actions',
+selector: unescape('packages'),
+category: 'accessing',
 fn: function (){
 var self=this;
-var newClass=nil;
-(newClass=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_loadExpression_", [smalltalk.send(self['@sourceArea'], "_val", [])]));
-(function($rec){smalltalk.send($rec, "_resetClassesList", []);smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
-smalltalk.send(self, "_selectClass_", [newClass]);
+var packages=nil;
+(packages=smalltalk.send((smalltalk.Array || Array), "_new", []));
+smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(packages, "_includes_", [smalltalk.send(each, "_category", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})]));})]);
+return smalltalk.send(packages, "_sort", []);
 return self;},
 args: [],
-source: unescape('compileDefinition%0A%20%20%20%20%7C%20newClass%20%7C%0A%20%20%20%20newClass%20%3A%3D%20Compiler%20new%20loadExpression%3A%20sourceArea%20val.%0A%20%20%20%20self%20%0A%09resetClassesList%3B%0A%09updateCategoriesList%3B%0A%09updateClassesList.%0A%20%20%20%20self%20selectClass%3A%20newClass'),
-messageSends: ["loadExpression:", "new", "val", "resetClassesList", "updateCategoriesList", "updateClassesList", "selectClass:"],
-referencedClasses: ["Compiler"]
+source: unescape('packages%0A%20%20%20%20%7C%20packages%20%7C%0A%20%20%20%20packages%20%3A%3D%20Array%20new.%0A%20%20%20%20Smalltalk%20current%20classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%28packages%20includes%3A%20each%20category%29%20ifFalse%3A%20%5B%0A%09%20%20%20%20packages%20add%3A%20each%20category%5D%5D.%0A%20%20%20%20%5Epackages%20sort'),
+messageSends: ["new", "do:", "classes", "current", "ifFalse:", "includes:", "category", "add:", "sort"],
+referencedClasses: ["Array", "Smalltalk"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_cancelChanges'),
+unescape('_protocols'),
 smalltalk.method({
-selector: unescape('cancelChanges'),
-category: 'actions',
+selector: unescape('protocols'),
+category: 'accessing',
 fn: function (){
 var self=this;
-return ((($receiver = self['@unsavedChanges']).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [unescape("Cancel%20changes%3F")]);})() : (function(){return true;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [unescape("Cancel%20changes%3F")]);}), (function(){return true;})]));
-return self;},
+try{var klass=nil;
+(($receiver = self['@selectedClass']) != nil && $receiver != undefined) ? (function(){((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return []}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return []}})})();})]));(klass=((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return self['@selectedClass'];})() : (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return self['@selectedClass'];}), (function(){return smalltalk.send(self['@selectedClass'], "_class", []);})])));((($receiver = smalltalk.send(smalltalk.send(klass, "_methodDictionary", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_with_", ["not yet classified"])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_with_", ["not yet classified"])}})})();})]));return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send(klass, "_protocols", [])}})})();})() : nil;
+(function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return smalltalk.send((smalltalk.Array || Array), "_new", [])}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_protocols'){return e.fn()} throw(e)}},
 args: [],
-source: unescape('cancelChanges%0A%20%20%20%20%5EunsavedChanges%20%0A%09ifTrue%3A%20%5Bwindow%20confirm%3A%20%27Cancel%20changes%3F%27%5D%0A%09ifFalse%3A%20%5Btrue%5D'),
-messageSends: ["ifTrue:ifFalse:", "confirm:"],
-referencedClasses: []
+source: unescape('protocols%0A%20%20%20%20%7C%20klass%20%7C%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5B%5E%23%28%29%5D.%0A%09klass%20%3A%3D%20selectedTab%20%3D%20%23instance%0A%09%20%20%20%20ifTrue%3A%20%5BselectedClass%5D%0A%09%20%20%20%20ifFalse%3A%20%5BselectedClass%20class%5D.%0A%09klass%20methodDictionary%20isEmpty%20ifTrue%3A%20%5B%0A%09%20%20%20%20%5EArray%20with%3A%20%27not%20yet%20classified%27%5D.%0A%09%5Eklass%20protocols%5D.%0A%20%20%20%20%5EArray%20new'),
+messageSends: ["ifNotNil:", "ifTrue:", unescape("%3D"), "ifTrue:ifFalse:", "class", "isEmpty", "methodDictionary", "with:", "protocols", "new"],
+referencedClasses: ["Array"]
 }),
 smalltalk.Browser);
 
@@ -2114,182 +2058,156 @@ referencedClasses: []
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_setMethodProtocol_'),
-smalltalk.method({
-selector: unescape('setMethodProtocol%3A'),
-category: 'actions',
-fn: function (aString){
-var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_protocols", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_addNewProtocol", []);})() : (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_addNewProtocol", []);}), (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_protocols", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_addNewProtocol", []);})() : (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_addNewProtocol", []);}), (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));})]));
-return self;},
-args: ["aString"],
-source: unescape('setMethodProtocol%3A%20aString%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09%28self%20protocols%20includes%3A%20aString%29%0A%09%20%20%20%20ifFalse%3A%20%5Bself%20addNewProtocol%5D%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09selectedMethod%20category%3A%20aString.%0A%09%09selectedProtocol%20%3A%3D%20aString.%0A%09%09selectedMethod%20%3A%3D%20selectedMethod.%0A%09%09self%20%0A%09%09%20%20%20%20updateProtocolsList%3B%0A%09%09%20%20%20%20updateMethodsList%3B%0A%09%09%20%20%20%20updateSourceAndButtons%5D%5D'),
-messageSends: ["ifTrue:", "cancelChanges", "ifFalse:ifTrue:", "includes:", "protocols", "addNewProtocol", "category:", "updateProtocolsList", "updateMethodsList", "updateSourceAndButtons"],
-referencedClasses: []
-}),
-smalltalk.Browser);
-
-smalltalk.addMethod(
-unescape('_addNewProtocol'),
+unescape('_removePackage'),
 smalltalk.method({
-selector: unescape('addNewProtocol'),
+selector: unescape('removePackage'),
 category: 'actions',
 fn: function (){
 var self=this;
-var newProtocol=nil;
-(newProtocol=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["New method protocol"]));
-((($receiver = smalltalk.send(smalltalk.send(newProtocol, "_notNil", []), "_and_", [(function(){return smalltalk.send(newProtocol, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self['@selectedMethod'], "_category_", [newProtocol]);return smalltalk.send(self, "_setMethodProtocol_", [newProtocol]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self['@selectedMethod'], "_category_", [newProtocol]);return smalltalk.send(self, "_setMethodProtocol_", [newProtocol]);})]));
+((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send("Do you really want to remove the whole package ", "__comma", [self['@selectedPackage']]), "__comma", [unescape("%20with%20all%20its%20classes%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removePackage_", [self['@selectedPackage']]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removePackage_", [self['@selectedPackage']]);return smalltalk.send(self, "_updateCategoriesList", []);})]));
 return self;},
 args: [],
-source: unescape('addNewProtocol%0A%20%20%20%20%7C%20newProtocol%20%7C%0A%20%20%20%20newProtocol%20%3A%3D%20window%20prompt%3A%20%27New%20method%20protocol%27.%0A%20%20%20%20%28newProtocol%20notNil%20and%3A%20%5BnewProtocol%20notEmpty%5D%29%20ifTrue%3A%20%5B%0A%09selectedMethod%20category%3A%20newProtocol.%0A%09self%20setMethodProtocol%3A%20newProtocol%5D'),
-messageSends: ["prompt:", "ifTrue:", "and:", "notNil", "notEmpty", "category:", "setMethodProtocol:"],
-referencedClasses: []
+source: unescape('removePackage%0A%0A%20%20%28window%20confirm%3A%20%27Do%20you%20really%20want%20to%20remove%20the%20whole%20package%20%27%2C%20selectedPackage%2C%20%27%20with%20all%20its%20classes%3F%27%29%0A%09ifTrue%3A%20%5B%0A%09%20%20%20%20Smalltalk%20current%20removePackage%3A%20selectedPackage.%0A%09%20%20%20%20self%20updateCategoriesList%5D'),
+messageSends: ["ifTrue:", "confirm:", unescape("%2C"), "removePackage:", "current", "updateCategoriesList"],
+referencedClasses: ["Smalltalk"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_selectCategory_'),
+unescape('_renameClass'),
 smalltalk.method({
-selector: unescape('selectCategory%3A'),
+selector: unescape('renameClass'),
 category: 'actions',
-fn: function (aCategory){
+fn: function (){
 var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedPackage']=aCategory);(self['@selectedClass']=(self['@selectedProtocol']=(self['@selectedMethod']=nil)));smalltalk.send(self, "_resetClassesList", []);return (function($rec){smalltalk.send($rec, "_updateCategoriesList", []);smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedPackage']=aCategory);(self['@selectedClass']=(self['@selectedProtocol']=(self['@selectedMethod']=nil)));smalltalk.send(self, "_resetClassesList", []);return (function($rec){smalltalk.send($rec, "_updateCategoriesList", []);smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
+var newName=nil;
+(newName=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", [smalltalk.send("Rename class ", "__comma", [smalltalk.send(self['@selectedClass'], "_name", [])])]));
+((($receiver = smalltalk.send(smalltalk.send(newName, "_notNil", []), "_and_", [(function(){return smalltalk.send(newName, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self['@selectedClass'], "_rename_", [newName]);return (function($rec){smalltalk.send($rec, "_updateClassesList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self['@selectedClass'], "_rename_", [newName]);return (function($rec){smalltalk.send($rec, "_updateClassesList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
 return self;},
-args: ["aCategory"],
-source: unescape('selectCategory%3A%20aCategory%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedPackage%20%3A%3D%20aCategory.%0A%09selectedClass%20%3A%3D%20selectedProtocol%20%3A%3D%20selectedMethod%20%3A%3D%20%20nil.%0A%09self%20resetClassesList.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList%3B%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D'),
-messageSends: ["ifTrue:", "cancelChanges", "resetClassesList", "updateCategoriesList", "updateClassesList", "updateProtocolsList", "updateMethodsList", "updateSourceAndButtons"],
+args: [],
+source: unescape('renameClass%0A%20%20%20%20%7C%20newName%20%7C%0A%20%20%20%20newName%20%3A%3D%20window%20prompt%3A%20%27Rename%20class%20%27%2C%20selectedClass%20name.%0A%20%20%20%20%28newName%20notNil%20and%3A%20%5BnewName%20notEmpty%5D%29%20ifTrue%3A%20%5B%0A%09selectedClass%20rename%3A%20newName.%0A%09self%20%0A%09%09updateClassesList%3B%0A%09%09updateSourceAndButtons%5D'),
+messageSends: ["prompt:", unescape("%2C"), "name", "ifTrue:", "and:", "notNil", "notEmpty", "rename:", "updateClassesList", "updateSourceAndButtons"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_selectClass_'),
+unescape('_renamePackage'),
 smalltalk.method({
-selector: unescape('selectClass%3A'),
+selector: unescape('renamePackage'),
 category: 'actions',
-fn: function (aClass){
+fn: function (){
 var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedClass']=aClass);(self['@selectedProtocol']=(self['@selectedMethod']=nil));return (function($rec){smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedClass']=aClass);(self['@selectedProtocol']=(self['@selectedMethod']=nil));return (function($rec){smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
+var newName=nil;
+(newName=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", [smalltalk.send("Rename package ", "__comma", [self['@selectedPackage']])]));
+(($receiver = newName) != nil && $receiver != undefined) ? (function(){return ((($receiver = smalltalk.send(newName, "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})]));})() : nil;
 return self;},
-args: ["aClass"],
-source: unescape('selectClass%3A%20aClass%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedClass%20%3A%3D%20aClass.%0A%09selectedProtocol%20%3A%3D%20selectedMethod%20%3A%3D%20nil.%0A%09self%20%0A%09%20%20%20%20updateClassesList%3B%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D'),
-messageSends: ["ifTrue:", "cancelChanges", "updateClassesList", "updateProtocolsList", "updateMethodsList", "updateSourceAndButtons"],
-referencedClasses: []
+args: [],
+source: unescape('renamePackage%0A%0A%20%20%7C%20newName%20%7C%0A%20%20newName%20%3A%3D%20window%20prompt%3A%20%27Rename%20package%20%27%2C%20selectedPackage.%0A%20%20newName%20ifNotNil%3A%20%5B%0A%20%20%20%20newName%20notEmpty%20ifTrue%3A%20%5B%0A%09Smalltalk%20current%20renamePackage%3A%20selectedPackage%20to%3A%20newName.%0A%09self%20updateCategoriesList%5D%5D'),
+messageSends: ["prompt:", unescape("%2C"), "ifNotNil:", "ifTrue:", "notEmpty", "renamePackage:to:", "current", "updateCategoriesList"],
+referencedClasses: ["Smalltalk"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_selectProtocol_'),
+unescape('_renderBottomPanelOn_'),
 smalltalk.method({
-selector: unescape('selectProtocol%3A'),
-category: 'actions',
-fn: function (aString){
+selector: unescape('renderBottomPanelOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedProtocol']=aString);(self['@selectedMethod']=nil);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedProtocol']=aString);(self['@selectedMethod']=nil);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
+(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);smalltalk.send(self['@sourceArea'], "_onKeyDown_", [(function(e){return smalltalk.send(self, "_handleSourceAreaKeyDown_", [e]);})]);return smalltalk.send(self['@sourceArea'], "_onKeyUp_", [(function(){return smalltalk.send(self, "_updateStatus", []);})]);})]);})(smalltalk.send(html, "_div", []));
 return self;},
-args: ["aString"],
-source: unescape('selectProtocol%3A%20aString%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedProtocol%20%3A%3D%20aString.%0A%09selectedMethod%20%3A%3D%20nil.%0A%09self%20%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D'),
-messageSends: ["ifTrue:", "cancelChanges", "updateProtocolsList", "updateMethodsList", "updateSourceAndButtons"],
-referencedClasses: []
+args: ["html"],
+source: unescape('renderBottomPanelOn%3A%20html%0A%20%20%20%20html%20div%0A%09class%3A%20%27jt_sourceCode%27%3B%0A%09with%3A%20%5B%0A%09%20%20%20%20sourceArea%20%3A%3D%20SourceArea%20new.%0A%09%20%20%20%20sourceArea%20renderOn%3A%20html.%0A%20%20%20%20%20%20%20%20%20%20%20%20sourceArea%20onKeyDown%3A%20%5B%3Ae%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20handleSourceAreaKeyDown%3A%20e%5D.%0A%09%20%20%20%20sourceArea%20onKeyUp%3A%20%5Bself%20updateStatus%5D%5D'),
+messageSends: ["class:", "with:", "new", "renderOn:", "onKeyDown:", "handleSourceAreaKeyDown:", "onKeyUp:", "updateStatus", "div"],
+referencedClasses: ["SourceArea"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_selectMethod_'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('selectMethod%3A'),
-category: 'actions',
-fn: function (aMethod){
+selector: unescape('renderBoxOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedMethod']=aMethod);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedMethod']=aMethod);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
+(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);smalltalk.send($rec, "_renderTabsOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
 return self;},
-args: ["aMethod"],
-source: unescape('selectMethod%3A%20aMethod%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedMethod%20%3A%3D%20aMethod.%0A%09self%20%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D'),
-messageSends: ["ifTrue:", "cancelChanges", "updateProtocolsList", "updateMethodsList", "updateSourceAndButtons"],
+args: ["html"],
+source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20self%20%0A%09renderTopPanelOn%3A%20html%3B%0A%09renderTabsOn%3A%20html%3B%0A%09renderBottomPanelOn%3A%20html'),
+messageSends: ["renderTopPanelOn:", "renderTabsOn:", "renderBottomPanelOn:"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_selectTab_'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('selectTab%3A'),
-category: 'actions',
-fn: function (aString){
+selector: unescape('renderButtonsOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedTab']=aString);smalltalk.send(self, "_selectProtocol_", [nil]);return smalltalk.send(self, "_updateTabsList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedTab']=aString);smalltalk.send(self, "_selectProtocol_", [nil]);return smalltalk.send(self, "_updateTabsList", []);})]));
+(self['@saveButton']=smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["Save"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_compile", []);})]);})(self['@saveButton']);
+(self['@methodButtons']=smalltalk.send(html, "_span", []));
+(self['@classButtons']=smalltalk.send(html, "_span", []));
+(function($rec){smalltalk.send($rec, "_class_", ["right"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_doIt", []);})]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_printIt", []);})]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));})]);})(smalltalk.send(html, "_div", []));
+smalltalk.send(self, "_updateSourceAndButtons", []);
 return self;},
-args: ["aString"],
-source: unescape('selectTab%3A%20aString%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedTab%20%3A%3D%20aString.%0A%09self%20selectProtocol%3A%20nil.%0A%09self%20updateTabsList%5D'),
-messageSends: ["ifTrue:", "cancelChanges", "selectProtocol:", "updateTabsList"],
+args: ["html"],
+source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20saveButton%20%3A%3D%20html%20button.%0A%20%20%20%20saveButton%20%0A%09with%3A%20%27Save%27%3B%0A%09onClick%3A%20%5Bself%20compile%5D.%0A%20%20%20%20methodButtons%20%3A%3D%20html%20span.%0A%20%20%20%20classButtons%20%3A%3D%20html%20span.%0A%20%20%20%20html%20div%20%0A%09class%3A%20%27right%27%3B%0A%09with%3A%20%5B%0A%09%09html%20button%0A%09%09%09with%3A%20%27DoIt%27%3B%0A%09%09%09onClick%3A%20%5BsourceArea%20doIt%5D.%0A%09%09html%20button%0A%09%09%09with%3A%20%27PrintIt%27%3B%0A%09%09%09onClick%3A%20%5BsourceArea%20printIt%5D.%0A%09%09html%20button%20with%3A%20%27InspectIt%27%3B%0A%09%09%09onClick%3A%20%5BsourceArea%20inspectIt%5D%5D.%20%0A%20%20%20%20self%20updateSourceAndButtons'),
+messageSends: ["button", "with:", "onClick:", "compile", "span", "class:", "doIt", "printIt", "inspectIt", "div", "updateSourceAndButtons"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renameClass'),
+unescape('_renderTabsOn_'),
 smalltalk.method({
-selector: unescape('renameClass'),
-category: 'actions',
-fn: function (){
+selector: unescape('renderTabsOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-var newName=nil;
-(newName=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", [smalltalk.send("Rename class ", "__comma", [smalltalk.send(self['@selectedClass'], "_name", [])])]));
-((($receiver = smalltalk.send(smalltalk.send(newName, "_notNil", []), "_and_", [(function(){return smalltalk.send(newName, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(self['@selectedClass'], "_rename_", [newName]);return (function($rec){smalltalk.send($rec, "_updateClassesList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(self['@selectedClass'], "_rename_", [newName]);return (function($rec){smalltalk.send($rec, "_updateClassesList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
+(self['@tabsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_tabs jt_browser"]));
+smalltalk.send(self, "_updateTabsList", []);
 return self;},
-args: [],
-source: unescape('renameClass%0A%20%20%20%20%7C%20newName%20%7C%0A%20%20%20%20newName%20%3A%3D%20window%20prompt%3A%20%27Rename%20class%20%27%2C%20selectedClass%20name.%0A%20%20%20%20%28newName%20notNil%20and%3A%20%5BnewName%20notEmpty%5D%29%20ifTrue%3A%20%5B%0A%09selectedClass%20rename%3A%20newName.%0A%09self%20%0A%09%09updateClassesList%3B%0A%09%09updateSourceAndButtons%5D'),
-messageSends: ["prompt:", unescape("%2C"), "name", "ifTrue:", "and:", "notNil", "notEmpty", "rename:", "updateClassesList", "updateSourceAndButtons"],
+args: ["html"],
+source: unescape('renderTabsOn%3A%20html%0A%20%20%20%20tabsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_tabs%20jt_browser%27.%0A%20%20%20%20self%20updateTabsList.'),
+messageSends: ["class:", "ul", "updateTabsList"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_addInstanceVariableNamed_toClass_'),
-smalltalk.method({
-selector: unescape('addInstanceVariableNamed%3AtoClass%3A'),
-category: 'actions',
-fn: function (aString, aClass){
-var self=this;
-smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_addSubclassOf_named_instanceVariableNames_package_", [smalltalk.send(aClass, "_superclass", []), smalltalk.send(aClass, "_name", []), (function($rec){smalltalk.send($rec, "_add_", [aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(smalltalk.send(aClass, "_instanceVariableNames", []), "_copy", [])), smalltalk.send(smalltalk.send(aClass, "_package", []), "_name", [])]);
-return self;},
-args: ["aString", "aClass"],
-source: unescape('addInstanceVariableNamed%3A%20aString%20toClass%3A%20aClass%0A%09ClassBuilder%20new%0A%09%09addSubclassOf%3A%20aClass%20superclass%20%0A%09%09named%3A%20aClass%20name%20%0A%09%09instanceVariableNames%3A%20%28aClass%20instanceVariableNames%20copy%20add%3A%20aString%3B%20yourself%29%0A%09%09package%3A%20aClass%20package%20name'),
-messageSends: ["addSubclassOf:named:instanceVariableNames:package:", "new", "superclass", "name", "add:", "yourself", "copy", "instanceVariableNames", "package"],
-referencedClasses: ["ClassBuilder"]
-}),
-smalltalk.Browser);
-
-smalltalk.addMethod(
-unescape('_searchReferencesOf_'),
+unescape('_renderTopPanelOn_'),
 smalltalk.method({
-selector: unescape('searchReferencesOf%3A'),
-category: 'actions',
-fn: function (aString){
+selector: unescape('renderTopPanelOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);
+(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(self['@packagesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser packages"]));(function($rec){smalltalk.send($rec, "_class_", ["jt_packagesButtons"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_title_", ["Commit classes in this package to disk"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_commitPackage", []);})]);return smalltalk.send($rec, "_with_", ["Commit"]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_title_", ["Rename package"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_renamePackage", []);})]);return smalltalk.send($rec, "_with_", ["Rename"]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_title_", ["Remove this package from the system"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_removePackage", []);})]);return smalltalk.send($rec, "_with_", ["Remove"]);})(smalltalk.send(html, "_button", []));})]);})(smalltalk.send(html, "_div", []));(self['@classesList']=smalltalk.send((smalltalk.ClassesList || ClassesList), "_on_", [self]));smalltalk.send(self['@classesList'], "_renderOn_", [html]);(self['@protocolsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser protocols"]));(self['@methodsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser methods"]));(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);return smalltalk.send($rec, "_updateMethodsList", []);})(self);return smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_clear"]);})]);})(smalltalk.send(html, "_div", []));
 return self;},
-args: ["aString"],
-source: unescape('searchReferencesOf%3A%20aString%0A%09ReferencesBrowser%20search%3A%20aString'),
-messageSends: ["search:"],
-referencedClasses: ["ReferencesBrowser"]
+args: ["html"],
+source: unescape('renderTopPanelOn%3A%20html%0A%09html%20div%20%0A%09%09class%3A%20%27top%27%3B%20%0A%09%09with%3A%20%5B%0A%09%09%09packagesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20browser%20packages%27.%0A%20%20%20%20%20%20%20%20%20%20%09%09html%20div%20class%3A%20%27jt_packagesButtons%27%3B%20with%3A%20%5B%0A%09%09%09%09html%20button%20%0A%09%09%09%09%09title%3A%20%27Commit%20classes%20in%20this%20package%20to%20disk%27%3B%0A%09%09%09%09%09onClick%3A%20%5Bself%20commitPackage%5D%3B%0A%09%09%09%09%09with%3A%20%27Commit%27.%0A%20%20%20%20%20%20%20%20%09%09%09html%20button%0A%09%09%09%09%09title%3A%20%27Rename%20package%27%3B%0A%09%09%09%09%09onClick%3A%20%5Bself%20renamePackage%5D%3B%0A%09%09%09%09%09with%3A%20%27Rename%27.%0A%20%20%20%20%20%20%20%20%09%09%09html%20button%0A%09%09%09%09%09title%3A%20%27Remove%20this%20package%20from%20the%20system%27%3B%0A%09%09%09%09%09onClick%3A%20%5Bself%20removePackage%5D%3B%0A%09%09%09%09%09with%3A%20%27Remove%27%5D.%0A%09%09%09classesList%20%3A%3D%20ClassesList%20on%3A%20self.%0A%09%09%09classesList%20renderOn%3A%20html.%0A%09%09%09protocolsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20browser%20protocols%27.%0A%09%09%09methodsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20browser%20methods%27.%0A%09%09%09self%0A%09%09%09%09updateCategoriesList%3B%0A%09%09%09%09updateClassesList%3B%0A%09%09%09%09updateProtocolsList%3B%0A%09%09%09%09updateMethodsList.%0A%09%09%09html%20div%20class%3A%20%27jt_clear%27%5D'),
+messageSends: ["class:", "with:", "ul", "title:", "onClick:", "commitPackage", "button", "renamePackage", "removePackage", "div", "on:", "renderOn:", "updateCategoriesList", "updateClassesList", "updateProtocolsList", "updateMethodsList"],
+referencedClasses: ["ClassesList"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_searchClassReferences'),
+unescape('_resetClassesList'),
 smalltalk.method({
-selector: unescape('searchClassReferences'),
-category: 'actions',
+selector: unescape('resetClassesList'),
+category: 'updating',
 fn: function (){
 var self=this;
-smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [smalltalk.send(self['@selectedClass'], "_name", [])]);
+smalltalk.send(self['@classesList'], "_resetNodes", []);
 return self;},
 args: [],
-source: unescape('searchClassReferences%0A%09ReferencesBrowser%20search%3A%20selectedClass%20name'),
-messageSends: ["search:", "name"],
-referencedClasses: ["ReferencesBrowser"]
+source: unescape('resetClassesList%0A%09classesList%20resetNodes'),
+messageSends: ["resetNodes"],
+referencedClasses: []
 }),
 smalltalk.Browser);
 
@@ -2312,249 +2230,211 @@ referencedClasses: ["Smalltalk"]
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_handleSourceAreaKeyDown_'),
-smalltalk.method({
-selector: unescape('handleSourceAreaKeyDown%3A'),
-category: 'actions',
-fn: function (anEvent){
-var self=this;
-if(anEvent.ctrlKey) {
-		if(anEvent.keyCode === 83) { //ctrl+s
-			self._compile();
-			anEvent.preventDefault();
-			return false;
-		}
-	}
-	;
-return self;},
-args: ["anEvent"],
-source: unescape('handleSourceAreaKeyDown%3A%20anEvent%0A%09%20%3Cif%28anEvent.ctrlKey%29%20%7B%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2083%29%20%7B%20//ctrl+s%0A%09%09%09self._compile%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%7D%0A%09%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Browser);
-
-smalltalk.addMethod(
-unescape('_commitPackage'),
+unescape('_searchClassReferences'),
 smalltalk.method({
-selector: unescape('commitPackage'),
+selector: unescape('searchClassReferences'),
 category: 'actions',
 fn: function (){
 var self=this;
-(($receiver = self['@selectedPackage']) != nil && $receiver != undefined) ? (function(){var package=nil;
-(package=smalltalk.send((smalltalk.Package || Package), "_named_", [self['@selectedPackage']]));return smalltalk.send([smalltalk.send((smalltalk.Exporter || Exporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathJs", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".js"])]),smalltalk.send((smalltalk.StrippedExporter || StrippedExporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathJs", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".deploy.js"])]),smalltalk.send((smalltalk.ChunkExporter || ChunkExporter), "__minus_gt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(package, "_commitPathSt", []), "__comma", [unescape("/")]), "__comma", [self['@selectedPackage']]), "__comma", [".st"])])], "_do_", [(function(commitStrategy){var fileContents=nil;
-(fileContents=smalltalk.send(smalltalk.send(smalltalk.send(commitStrategy, "_key", []), "_new", []), "_exportPackage_", [self['@selectedPackage']]));return smalltalk.send(self, "_ajaxPutAt_data_", [smalltalk.send(commitStrategy, "_value", []), fileContents]);})]);})() : nil;
+smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [smalltalk.send(self['@selectedClass'], "_name", [])]);
 return self;},
 args: [],
-source: unescape('commitPackage%0A%09selectedPackage%20ifNotNil%3A%20%5B%20%7Cpackage%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09%09%20package%20%3A%3D%20Package%20named%3A%20selectedPackage.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09%09%20%7B%09Exporter%20%09%09%09-%3E%20%28package%20commitPathJs%2C%20%27/%27%2C%20selectedPackage%2C%20%27.js%27%29.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09StrippedExporter%20%09-%3E%20%28package%20commitPathJs%2C%20%27/%27%2C%20selectedPackage%2C%20%27.deploy.js%27%29.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09%09%20ChunkExporter%20%09%09-%3E%20%28package%20commitPathSt%2C%20%27/%27%2C%20selectedPackage%2C%20%27.st%27%29%20%09%09%09%7D%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09%09do%3A%20%5B%3AcommitStrategy%7C%20%7CfileContents%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09fileContents%20%3A%3D%20%28commitStrategy%20key%20new%20exportPackage%3A%20selectedPackage%29.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09self%20ajaxPutAt%3A%20commitStrategy%20value%20data%3A%20%20fileContents%5D%0A%20%20%20%20%20%20%20%20%20%09%09%09%09%09%09%5D'),
-messageSends: ["ifNotNil:", "named:", "do:", unescape("-%3E"), unescape("%2C"), "commitPathJs", "commitPathSt", "exportPackage:", "new", "key", "ajaxPutAt:data:", "value"],
-referencedClasses: ["Package", "Exporter", "StrippedExporter", "ChunkExporter"]
+source: unescape('searchClassReferences%0A%09ReferencesBrowser%20search%3A%20selectedClass%20name'),
+messageSends: ["search:", "name"],
+referencedClasses: ["ReferencesBrowser"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renamePackage'),
+unescape('_searchReferencesOf_'),
 smalltalk.method({
-selector: unescape('renamePackage'),
+selector: unescape('searchReferencesOf%3A'),
 category: 'actions',
-fn: function (){
-var self=this;
-var newName=nil;
-(newName=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", [smalltalk.send("Rename package ", "__comma", [self['@selectedPackage']])]));
-(($receiver = newName) != nil && $receiver != undefined) ? (function(){return ((($receiver = smalltalk.send(newName, "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})]));})() : nil;
-return self;},
-args: [],
-source: unescape('renamePackage%0A%0A%20%20%7C%20newName%20%7C%0A%20%20newName%20%3A%3D%20window%20prompt%3A%20%27Rename%20package%20%27%2C%20selectedPackage.%0A%20%20newName%20ifNotNil%3A%20%5B%0A%20%20%20%20newName%20notEmpty%20ifTrue%3A%20%5B%0A%09Smalltalk%20current%20renamePackage%3A%20selectedPackage%20to%3A%20newName.%0A%09self%20updateCategoriesList%5D%5D'),
-messageSends: ["prompt:", unescape("%2C"), "ifNotNil:", "ifTrue:", "notEmpty", "renamePackage:to:", "current", "updateCategoriesList"],
-referencedClasses: ["Smalltalk"]
+fn: function (aString){
+var self=this;
+smalltalk.send((smalltalk.ReferencesBrowser || ReferencesBrowser), "_search_", [aString]);
+return self;},
+args: ["aString"],
+source: unescape('searchReferencesOf%3A%20aString%0A%09ReferencesBrowser%20search%3A%20aString'),
+messageSends: ["search:"],
+referencedClasses: ["ReferencesBrowser"]
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_removePackage'),
+unescape('_selectCategory_'),
 smalltalk.method({
-selector: unescape('removePackage'),
+selector: unescape('selectCategory%3A'),
 category: 'actions',
-fn: function (){
+fn: function (aCategory){
 var self=this;
-((($receiver = smalltalk.send((typeof window == 'undefined' ? nil : window), "_confirm_", [smalltalk.send(smalltalk.send("Do you really want to remove the whole package ", "__comma", [self['@selectedPackage']]), "__comma", [unescape("%20with%20all%20its%20classes%3F")])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removePackage_", [self['@selectedPackage']]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removePackage_", [self['@selectedPackage']]);return smalltalk.send(self, "_updateCategoriesList", []);})]));
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedPackage']=aCategory);(self['@selectedClass']=(self['@selectedProtocol']=(self['@selectedMethod']=nil)));smalltalk.send(self, "_resetClassesList", []);return (function($rec){smalltalk.send($rec, "_updateCategoriesList", []);smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedPackage']=aCategory);(self['@selectedClass']=(self['@selectedProtocol']=(self['@selectedMethod']=nil)));smalltalk.send(self, "_resetClassesList", []);return (function($rec){smalltalk.send($rec, "_updateCategoriesList", []);smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
 return self;},
-args: [],
-source: unescape('removePackage%0A%0A%20%20%28window%20confirm%3A%20%27Do%20you%20really%20want%20to%20remove%20the%20whole%20package%20%27%2C%20selectedPackage%2C%20%27%20with%20all%20its%20classes%3F%27%29%0A%09ifTrue%3A%20%5B%0A%09%20%20%20%20Smalltalk%20current%20removePackage%3A%20selectedPackage.%0A%09%20%20%20%20self%20updateCategoriesList%5D'),
-messageSends: ["ifTrue:", "confirm:", unescape("%2C"), "removePackage:", "current", "updateCategoriesList"],
-referencedClasses: ["Smalltalk"]
+args: ["aCategory"],
+source: unescape('selectCategory%3A%20aCategory%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedPackage%20%3A%3D%20aCategory.%0A%09selectedClass%20%3A%3D%20selectedProtocol%20%3A%3D%20selectedMethod%20%3A%3D%20%20nil.%0A%09self%20resetClassesList.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList%3B%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D'),
+messageSends: ["ifTrue:", "cancelChanges", "resetClassesList", "updateCategoriesList", "updateClassesList", "updateProtocolsList", "updateMethodsList", "updateSourceAndButtons"],
+referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_addNewClass'),
+unescape('_selectClass_'),
 smalltalk.method({
-selector: unescape('addNewClass'),
+selector: unescape('selectClass%3A'),
 category: 'actions',
-fn: function (){
+fn: function (aClass){
 var self=this;
-var className=nil;
-(className=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["New class"]));
-((($receiver = smalltalk.send(smalltalk.send(className, "_notNil", []), "_and_", [(function(){return smalltalk.send(className, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send((smalltalk.Object || Object), "_subclass_instanceVariableNames_package_", [className, "", smalltalk.send(self, "_selectedPackage", [])]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send((smalltalk.Object || Object), "_subclass_instanceVariableNames_package_", [className, "", smalltalk.send(self, "_selectedPackage", [])]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})]));
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedClass']=aClass);(self['@selectedProtocol']=(self['@selectedMethod']=nil));return (function($rec){smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedClass']=aClass);(self['@selectedProtocol']=(self['@selectedMethod']=nil));return (function($rec){smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
 return self;},
-args: [],
-source: unescape('addNewClass%0A%09%7C%20className%20%7C%0A%09className%20%3A%3D%20window%20prompt%3A%20%27New%20class%27.%0A%09%28className%20notNil%20and%3A%20%5BclassName%20notEmpty%5D%29%20ifTrue%3A%20%5B%0A%09%09Object%20subclass%3A%20className%20instanceVariableNames%3A%20%27%27%20package%3A%20self%20selectedPackage.%0A%20%20%20%20%20%20%20%20%20%20%09%20self%20%0A%09%09%09resetClassesList%3B%0A%09%09%09updateClassesList.%0A%09%09self%20selectClass%3A%20%28Smalltalk%20current%20at%3A%20className%29%5D'),
-messageSends: ["prompt:", "ifTrue:", "and:", "notNil", "notEmpty", "subclass:instanceVariableNames:package:", "selectedPackage", "resetClassesList", "updateClassesList", "selectClass:", "at:", "current"],
-referencedClasses: ["Object", "Smalltalk"]
+args: ["aClass"],
+source: unescape('selectClass%3A%20aClass%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedClass%20%3A%3D%20aClass.%0A%09selectedProtocol%20%3A%3D%20selectedMethod%20%3A%3D%20nil.%0A%09self%20%0A%09%20%20%20%20updateClassesList%3B%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D'),
+messageSends: ["ifTrue:", "cancelChanges", "updateClassesList", "updateProtocolsList", "updateMethodsList", "updateSourceAndButtons"],
+referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_copyClass'),
+unescape('_selectMethod_'),
 smalltalk.method({
-selector: unescape('copyClass'),
+selector: unescape('selectMethod%3A'),
 category: 'actions',
-fn: function (){
+fn: function (aMethod){
 var self=this;
-var className=nil;
-(className=smalltalk.send((typeof window == 'undefined' ? nil : window), "_prompt_", ["Copy class"]));
-((($receiver = smalltalk.send(smalltalk.send(className, "_notNil", []), "_and_", [(function(){return smalltalk.send(className, "_notEmpty", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_copyClass_named_", [smalltalk.send(self, "_selectedClass", []), className]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_copyClass_named_", [smalltalk.send(self, "_selectedClass", []), className]);(function($rec){smalltalk.send($rec, "_resetClassesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);return smalltalk.send(self, "_selectClass_", [smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_at_", [className])]);})]));
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedMethod']=aMethod);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedMethod']=aMethod);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
 return self;},
-args: [],
-source: unescape('copyClass%0A%09%7C%20className%20%7C%0A%09className%20%3A%3D%20window%20prompt%3A%20%27Copy%20class%27.%0A%09%28className%20notNil%20and%3A%20%5BclassName%20notEmpty%5D%29%20ifTrue%3A%20%5B%0A%09%09ClassBuilder%20new%20copyClass%3A%20self%20selectedClass%20named%3A%20className.%0A%20%20%20%20%20%20%20%20%20%20%09%20self%20%0A%09%09%09resetClassesList%3B%0A%09%09%09updateClassesList.%0A%09%09self%20selectClass%3A%20%28Smalltalk%20current%20at%3A%20className%29%5D'),
-messageSends: ["prompt:", "ifTrue:", "and:", "notNil", "notEmpty", "copyClass:named:", "new", "selectedClass", "resetClassesList", "updateClassesList", "selectClass:", "at:", "current"],
-referencedClasses: ["ClassBuilder", "Smalltalk"]
+args: ["aMethod"],
+source: unescape('selectMethod%3A%20aMethod%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedMethod%20%3A%3D%20aMethod.%0A%09self%20%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D'),
+messageSends: ["ifTrue:", "cancelChanges", "updateProtocolsList", "updateMethodsList", "updateSourceAndButtons"],
+referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_selectProtocol_'),
 smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
-fn: function (){
+selector: unescape('selectProtocol%3A'),
+category: 'actions',
+fn: function (aString){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
-(self['@selectedTab']=smalltalk.symbolFor("instance"));
-(self['@selectedPackage']=smalltalk.send(smalltalk.send(self, "_packages", []), "_first", []));
-(self['@unsavedChanges']=false);
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedProtocol']=aString);(self['@selectedMethod']=nil);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedProtocol']=aString);(self['@selectedMethod']=nil);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));
 return self;},
-args: [],
-source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20selectedTab%20%3A%3D%20%23instance.%0A%20%20%20%20selectedPackage%20%3A%3D%20self%20packages%20first.%0A%20%20%20%20unsavedChanges%20%3A%3D%20false'),
-messageSends: ["initialize", "first", "packages"],
+args: ["aString"],
+source: unescape('selectProtocol%3A%20aString%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedProtocol%20%3A%3D%20aString.%0A%09selectedMethod%20%3A%3D%20nil.%0A%09self%20%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D'),
+messageSends: ["ifTrue:", "cancelChanges", "updateProtocolsList", "updateMethodsList", "updateSourceAndButtons"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_ajaxPutAt_data_'),
+unescape('_selectTab_'),
 smalltalk.method({
-selector: unescape('ajaxPutAt%3Adata%3A'),
-category: 'network',
-fn: function (anURL, aString){
+selector: unescape('selectTab%3A'),
+category: 'actions',
+fn: function (aString){
 var self=this;
-smalltalk.send((typeof jQuery == 'undefined' ? nil : jQuery), "_ajax_options_", [anURL, smalltalk.HashedCollection._fromPairs_([smalltalk.send("type", "__minus_gt", ["PUT"]),smalltalk.send("data", "__minus_gt", [aString]),smalltalk.send("contentType", "__minus_gt", [unescape("text/plain%3Bcharset%3DUTF-8")]),smalltalk.send("error", "__minus_gt", [(function(){return smalltalk.send((typeof window == 'undefined' ? nil : window), "_alert_", [smalltalk.send("PUT request failed at:  ", "__comma", [anURL])]);})])])]);
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(self['@selectedTab']=aString);smalltalk.send(self, "_selectProtocol_", [nil]);return smalltalk.send(self, "_updateTabsList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){(self['@selectedTab']=aString);smalltalk.send(self, "_selectProtocol_", [nil]);return smalltalk.send(self, "_updateTabsList", []);})]));
 return self;},
-args: ["anURL", "aString"],
-source: unescape('ajaxPutAt%3A%20anURL%20data%3A%20aString%0A%09jQuery%20%0A%09%09ajax%3A%20anURL%09options%3A%20%23%7B%09%27type%27%20-%3E%20%27PUT%27.%0A%09%09%09%09%09%09%09%09%27data%27%20-%3E%20aString.%0A%09%09%09%09%09%09%09%09%27contentType%27%20-%3E%20%27text/plain%3Bcharset%3DUTF-8%27.%0A%09%09%09%09%09%09%09%09%27error%27%20-%3E%20%5Bwindow%20alert%3A%20%27PUT%20request%20failed%20at%3A%20%20%27%2C%20anURL%5D%20%7D'),
-messageSends: ["ajax:options:", unescape("-%3E"), "alert:", unescape("%2C")],
+args: ["aString"],
+source: unescape('selectTab%3A%20aString%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedTab%20%3A%3D%20aString.%0A%09self%20selectProtocol%3A%20nil.%0A%09self%20updateTabsList%5D'),
+messageSends: ["ifTrue:", "cancelChanges", "selectProtocol:", "updateTabsList"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renderBoxOn_'),
+unescape('_selectedClass'),
 smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('selectedClass'),
+category: 'accessing',
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);smalltalk.send($rec, "_renderTabsOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
+return self['@selectedClass'];
 return self;},
-args: ["html"],
-source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20self%20%0A%09renderTopPanelOn%3A%20html%3B%0A%09renderTabsOn%3A%20html%3B%0A%09renderBottomPanelOn%3A%20html'),
-messageSends: ["renderTopPanelOn:", "renderTabsOn:", "renderBottomPanelOn:"],
+args: [],
+source: unescape('selectedClass%0A%09%5EselectedClass'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renderTopPanelOn_'),
+unescape('_selectedPackage'),
 smalltalk.method({
-selector: unescape('renderTopPanelOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('selectedPackage'),
+category: 'accessing',
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(self['@packagesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser packages"]));(function($rec){smalltalk.send($rec, "_class_", ["jt_packagesButtons"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_title_", ["Commit classes in this package to disk"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_commitPackage", []);})]);return smalltalk.send($rec, "_with_", ["Commit"]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_title_", ["Rename package"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_renamePackage", []);})]);return smalltalk.send($rec, "_with_", ["Rename"]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_title_", ["Remove this package from the system"]);smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_removePackage", []);})]);return smalltalk.send($rec, "_with_", ["Remove"]);})(smalltalk.send(html, "_button", []));})]);})(smalltalk.send(html, "_div", []));(self['@classesList']=smalltalk.send((smalltalk.ClassesList || ClassesList), "_on_", [self]));smalltalk.send(self['@classesList'], "_renderOn_", [html]);(self['@protocolsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser protocols"]));(self['@methodsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column browser methods"]));(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);smalltalk.send($rec, "_updateClassesList", []);smalltalk.send($rec, "_updateProtocolsList", []);return smalltalk.send($rec, "_updateMethodsList", []);})(self);return smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_clear"]);})]);})(smalltalk.send(html, "_div", []));
+return self['@selectedPackage'];
 return self;},
-args: ["html"],
-source: unescape('renderTopPanelOn%3A%20html%0A%09html%20div%20%0A%09%09class%3A%20%27top%27%3B%20%0A%09%09with%3A%20%5B%0A%09%09%09packagesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20browser%20packages%27.%0A%20%20%20%20%20%20%20%20%20%20%09%09html%20div%20class%3A%20%27jt_packagesButtons%27%3B%20with%3A%20%5B%0A%09%09%09%09html%20button%20%0A%09%09%09%09%09title%3A%20%27Commit%20classes%20in%20this%20package%20to%20disk%27%3B%0A%09%09%09%09%09onClick%3A%20%5Bself%20commitPackage%5D%3B%0A%09%09%09%09%09with%3A%20%27Commit%27.%0A%20%20%20%20%20%20%20%20%09%09%09html%20button%0A%09%09%09%09%09title%3A%20%27Rename%20package%27%3B%0A%09%09%09%09%09onClick%3A%20%5Bself%20renamePackage%5D%3B%0A%09%09%09%09%09with%3A%20%27Rename%27.%0A%20%20%20%20%20%20%20%20%09%09%09html%20button%0A%09%09%09%09%09title%3A%20%27Remove%20this%20package%20from%20the%20system%27%3B%0A%09%09%09%09%09onClick%3A%20%5Bself%20removePackage%5D%3B%0A%09%09%09%09%09with%3A%20%27Remove%27%5D.%0A%09%09%09classesList%20%3A%3D%20ClassesList%20on%3A%20self.%0A%09%09%09classesList%20renderOn%3A%20html.%0A%09%09%09protocolsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20browser%20protocols%27.%0A%09%09%09methodsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20browser%20methods%27.%0A%09%09%09self%0A%09%09%09%09updateCategoriesList%3B%0A%09%09%09%09updateClassesList%3B%0A%09%09%09%09updateProtocolsList%3B%0A%09%09%09%09updateMethodsList.%0A%09%09%09html%20div%20class%3A%20%27jt_clear%27%5D'),
-messageSends: ["class:", "with:", "ul", "title:", "onClick:", "commitPackage", "button", "renamePackage", "removePackage", "div", "on:", "renderOn:", "updateCategoriesList", "updateClassesList", "updateProtocolsList", "updateMethodsList"],
-referencedClasses: ["ClassesList"]
+args: [],
+source: unescape('selectedPackage%0A%09%5EselectedPackage'),
+messageSends: [],
+referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renderTabsOn_'),
+unescape('_setMethodProtocol_'),
 smalltalk.method({
-selector: unescape('renderTabsOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('setMethodProtocol%3A'),
+category: 'actions',
+fn: function (aString){
 var self=this;
-(self['@tabsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_tabs jt_browser"]));
-smalltalk.send(self, "_updateTabsList", []);
+((($receiver = smalltalk.send(self, "_cancelChanges", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_protocols", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_addNewProtocol", []);})() : (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_addNewProtocol", []);}), (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_protocols", []), "_includes_", [aString])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_addNewProtocol", []);})() : (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_addNewProtocol", []);}), (function(){smalltalk.send(self['@selectedMethod'], "_category_", [aString]);(self['@selectedProtocol']=aString);(self['@selectedMethod']=self['@selectedMethod']);return (function($rec){smalltalk.send($rec, "_updateProtocolsList", []);smalltalk.send($rec, "_updateMethodsList", []);return smalltalk.send($rec, "_updateSourceAndButtons", []);})(self);})]));})]));
 return self;},
-args: ["html"],
-source: unescape('renderTabsOn%3A%20html%0A%20%20%20%20tabsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_tabs%20jt_browser%27.%0A%20%20%20%20self%20updateTabsList.'),
-messageSends: ["class:", "ul", "updateTabsList"],
+args: ["aString"],
+source: unescape('setMethodProtocol%3A%20aString%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09%28self%20protocols%20includes%3A%20aString%29%0A%09%20%20%20%20ifFalse%3A%20%5Bself%20addNewProtocol%5D%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09selectedMethod%20category%3A%20aString.%0A%09%09selectedProtocol%20%3A%3D%20aString.%0A%09%09selectedMethod%20%3A%3D%20selectedMethod.%0A%09%09self%20%0A%09%09%20%20%20%20updateProtocolsList%3B%0A%09%09%20%20%20%20updateMethodsList%3B%0A%09%09%20%20%20%20updateSourceAndButtons%5D%5D'),
+messageSends: ["ifTrue:", "cancelChanges", "ifFalse:ifTrue:", "includes:", "protocols", "addNewProtocol", "category:", "updateProtocolsList", "updateMethodsList", "updateSourceAndButtons"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renderBottomPanelOn_'),
+unescape('_showClassButtons'),
 smalltalk.method({
-selector: unescape('renderBottomPanelOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('showClassButtons'),
+category: 'actions',
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);smalltalk.send(self['@sourceArea'], "_onKeyDown_", [(function(e){return smalltalk.send(self, "_handleSourceAreaKeyDown_", [e]);})]);return smalltalk.send(self['@sourceArea'], "_onKeyUp_", [(function(){return smalltalk.send(self, "_updateStatus", []);})]);})]);})(smalltalk.send(html, "_div", []));
+smalltalk.send(smalltalk.send(self['@classButtons'], "_asJQuery", []), "_show", []);
 return self;},
-args: ["html"],
-source: unescape('renderBottomPanelOn%3A%20html%0A%20%20%20%20html%20div%0A%09class%3A%20%27jt_sourceCode%27%3B%0A%09with%3A%20%5B%0A%09%20%20%20%20sourceArea%20%3A%3D%20SourceArea%20new.%0A%09%20%20%20%20sourceArea%20renderOn%3A%20html.%0A%20%20%20%20%20%20%20%20%20%20%20%20sourceArea%20onKeyDown%3A%20%5B%3Ae%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20handleSourceAreaKeyDown%3A%20e%5D.%0A%09%20%20%20%20sourceArea%20onKeyUp%3A%20%5Bself%20updateStatus%5D%5D'),
-messageSends: ["class:", "with:", "new", "renderOn:", "onKeyDown:", "handleSourceAreaKeyDown:", "onKeyUp:", "updateStatus", "div"],
-referencedClasses: ["SourceArea"]
+args: [],
+source: unescape('showClassButtons%0A%20%20%20%20classButtons%20asJQuery%20show'),
+messageSends: ["show", "asJQuery"],
+referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
+unescape('_showMethodButtons'),
 smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('showMethodButtons'),
+category: 'actions',
+fn: function (){
 var self=this;
-(self['@saveButton']=smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["Save"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_compile", []);})]);})(self['@saveButton']);
-(self['@methodButtons']=smalltalk.send(html, "_span", []));
-(self['@classButtons']=smalltalk.send(html, "_span", []));
-(function($rec){smalltalk.send($rec, "_class_", ["right"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_doIt", []);})]);})(smalltalk.send(html, "_button", []));(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_printIt", []);})]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));})]);})(smalltalk.send(html, "_div", []));
-smalltalk.send(self, "_updateSourceAndButtons", []);
+smalltalk.send(smalltalk.send(self['@methodButtons'], "_asJQuery", []), "_show", []);
 return self;},
-args: ["html"],
-source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20saveButton%20%3A%3D%20html%20button.%0A%20%20%20%20saveButton%20%0A%09with%3A%20%27Save%27%3B%0A%09onClick%3A%20%5Bself%20compile%5D.%0A%20%20%20%20methodButtons%20%3A%3D%20html%20span.%0A%20%20%20%20classButtons%20%3A%3D%20html%20span.%0A%20%20%20%20html%20div%20%0A%09class%3A%20%27right%27%3B%0A%09with%3A%20%5B%0A%09%09html%20button%0A%09%09%09with%3A%20%27DoIt%27%3B%0A%09%09%09onClick%3A%20%5BsourceArea%20doIt%5D.%0A%09%09html%20button%0A%09%09%09with%3A%20%27PrintIt%27%3B%0A%09%09%09onClick%3A%20%5BsourceArea%20printIt%5D.%0A%09%09html%20button%20with%3A%20%27InspectIt%27%3B%0A%09%09%09onClick%3A%20%5BsourceArea%20inspectIt%5D%5D.%20%0A%20%20%20%20self%20updateSourceAndButtons'),
-messageSends: ["button", "with:", "onClick:", "compile", "span", "class:", "doIt", "printIt", "inspectIt", "div", "updateSourceAndButtons"],
+args: [],
+source: unescape('showMethodButtons%0A%20%20%20%20methodButtons%20asJQuery%20show'),
+messageSends: ["show", "asJQuery"],
 referencedClasses: []
 }),
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_canBeClosed'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('canBeClosed'),
-category: 'testing',
+selector: unescape('source'),
+category: 'accessing',
 fn: function (){
 var self=this;
-return true;
-return self;},
+try{((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_source', fn: function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_declarationSource", []);})() : (function(){return smalltalk.send(self, "_methodSource", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_declarationSource", []);}), (function(){return smalltalk.send(self, "_methodSource", []);})]))}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '_source', fn: function(){return ((($receiver = smalltalk.send(smalltalk.send(self['@selectedProtocol'], "_notNil", []), "_or_", [(function(){return smalltalk.send(self['@selectedMethod'], "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_declarationSource", []);})() : (function(){return smalltalk.send(self, "_methodSource", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_declarationSource", []);}), (function(){return smalltalk.send(self, "_methodSource", []);})]))}})})();})]));
+(function(){throw({name: 'stReturn', selector: '_source', fn: function(){return (($receiver = self['@selectedClass']) == nil || $receiver == undefined) ? (function(){return "";})() : (function(){return smalltalk.send(self, "_classCommentSource", []);})()}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_source'){return e.fn()} throw(e)}},
 args: [],
-source: unescape('canBeClosed%0A%09%5Etrue'),
-messageSends: [],
+source: unescape('source%0A%20%20%20%20selectedTab%20%3D%20%23comment%20ifFalse%3A%20%5B%0A%09%5E%28selectedProtocol%20notNil%20or%3A%20%5BselectedMethod%20notNil%5D%29%0A%09%20%20%20%20ifFalse%3A%20%5Bself%20declarationSource%5D%0A%09%20%20%20%20ifTrue%3A%20%5Bself%20methodSource%5D%5D.%0A%20%20%20%20%5EselectedClass%0A%09ifNil%3A%20%5B%27%27%5D%0A%09ifNotNil%3A%20%5Bself%20classCommentSource%5D'),
+messageSends: ["ifFalse:", unescape("%3D"), "ifFalse:ifTrue:", "or:", "notNil", "declarationSource", "methodSource", "ifNil:ifNotNil:", "classCommentSource"],
 referencedClasses: []
 }),
 smalltalk.Browser);
@@ -2594,23 +2474,6 @@ referencedClasses: ["TabManager"]
 }),
 smalltalk.Browser);
 
-smalltalk.addMethod(
-unescape('_updateProtocolsList'),
-smalltalk.method({
-selector: unescape('updateProtocolsList'),
-category: 'updating',
-fn: function (){
-var self=this;
-smalltalk.send(self['@protocolsList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_protocols", []), "_do_", [(function(each){var li=nil;
-(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedProtocol'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectProtocol_", [each]);})]);})(li);})]);})]);
-return self;},
-args: [],
-source: unescape('updateProtocolsList%0A%20%20%20%20protocolsList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09self%20protocols%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20selectedProtocol%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%20%0A%09%09with%3A%20each%3B%0A%09%09onClick%3A%20%5Bself%20selectProtocol%3A%20each%5D%5D%5D'),
-messageSends: ["contents:", "do:", "protocols", "li", "ifTrue:", unescape("%3D"), "class:", "with:", "onClick:", "selectProtocol:"],
-referencedClasses: []
-}),
-smalltalk.Browser);
-
 smalltalk.addMethod(
 unescape('_updateMethodsList'),
 smalltalk.method({
@@ -2629,18 +2492,18 @@ referencedClasses: []
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_updateTabsList'),
+unescape('_updateProtocolsList'),
 smalltalk.method({
-selector: unescape('updateTabsList'),
+selector: unescape('updateProtocolsList'),
 category: 'updating',
 fn: function (){
 var self=this;
-smalltalk.send(self['@tabsList'], "_contents_", [(function(html){var li=nil;
-(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Instance"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("instance")]);})]);})(li);(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("class")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Class"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("class")]);})]);})(li);(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Comment"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("comment")]);})]);})(li);})]);
+smalltalk.send(self['@protocolsList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(self, "_protocols", []), "_do_", [(function(each){var li=nil;
+(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedProtocol'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectProtocol_", [each]);})]);})(li);})]);})]);
 return self;},
 args: [],
-source: unescape('updateTabsList%0A%20%20%20%20tabsList%20contents%3A%20%5B%3Ahtml%20%7C%7C%20li%20%7C%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23instance%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%5B%0A%09%09html%20span%20class%3A%20%27ltab%27.%0A%09%09html%20span%20class%3A%20%27mtab%27%3B%20with%3A%20%27Instance%27.%0A%09%09html%20span%20class%3A%20%27rtab%27%5D%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23instance%5D.%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23class%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%5B%0A%09%09html%20span%20class%3A%20%27ltab%27.%0A%09%09html%20span%20class%3A%20%27mtab%27%3B%20with%3A%20%27Class%27.%0A%09%09html%20span%20class%3A%20%27rtab%27%5D%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23class%5D.%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%5B%0A%09%09html%20span%20class%3A%20%27ltab%27.%0A%09%09html%20span%20class%3A%20%27mtab%27%3B%20with%3A%20%27Comment%27.%0A%09%09html%20span%20class%3A%20%27rtab%27%5D%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23comment%5D%5D'),
-messageSends: ["contents:", "li", "ifTrue:", unescape("%3D"), "class:", "with:", "span", "onClick:", "selectTab:"],
+source: unescape('updateProtocolsList%0A%20%20%20%20protocolsList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09self%20protocols%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20selectedProtocol%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%20%0A%09%09with%3A%20each%3B%0A%09%09onClick%3A%20%5Bself%20selectProtocol%3A%20each%5D%5D%5D'),
+messageSends: ["contents:", "do:", "protocols", "li", "ifTrue:", unescape("%3D"), "class:", "with:", "onClick:", "selectProtocol:"],
 referencedClasses: []
 }),
 smalltalk.Browser);
@@ -2686,17 +2549,18 @@ referencedClasses: []
 smalltalk.Browser);
 
 smalltalk.addMethod(
-unescape('_resetClassesList'),
+unescape('_updateTabsList'),
 smalltalk.method({
-selector: unescape('resetClassesList'),
+selector: unescape('updateTabsList'),
 category: 'updating',
 fn: function (){
 var self=this;
-smalltalk.send(self['@classesList'], "_resetNodes", []);
+smalltalk.send(self['@tabsList'], "_contents_", [(function(html){var li=nil;
+(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("instance")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Instance"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("instance")]);})]);})(li);(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("class")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));(function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Class"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("class")]);})]);})(li);(li=smalltalk.send(html, "_li", []));((($receiver = smalltalk.send(self['@selectedTab'], "__eq", [smalltalk.symbolFor("comment")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));return (function($rec){smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["ltab"]);(function($rec){smalltalk.send($rec, "_class_", ["mtab"]);return smalltalk.send($rec, "_with_", ["Comment"]);})(smalltalk.send(html, "_span", []));return smalltalk.send(smalltalk.send(html, "_span", []), "_class_", ["rtab"]);})]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [smalltalk.symbolFor("comment")]);})]);})(li);})]);
 return self;},
 args: [],
-source: unescape('resetClassesList%0A%09classesList%20resetNodes'),
-messageSends: ["resetNodes"],
+source: unescape('updateTabsList%0A%20%20%20%20tabsList%20contents%3A%20%5B%3Ahtml%20%7C%7C%20li%20%7C%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23instance%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%5B%0A%09%09html%20span%20class%3A%20%27ltab%27.%0A%09%09html%20span%20class%3A%20%27mtab%27%3B%20with%3A%20%27Instance%27.%0A%09%09html%20span%20class%3A%20%27rtab%27%5D%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23instance%5D.%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23class%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%5B%0A%09%09html%20span%20class%3A%20%27ltab%27.%0A%09%09html%20span%20class%3A%20%27mtab%27%3B%20with%3A%20%27Class%27.%0A%09%09html%20span%20class%3A%20%27rtab%27%5D%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23class%5D.%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%5B%0A%09%09html%20span%20class%3A%20%27ltab%27.%0A%09%09html%20span%20class%3A%20%27mtab%27%3B%20with%3A%20%27Comment%27.%0A%09%09html%20span%20class%3A%20%27rtab%27%5D%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23comment%5D%5D'),
+messageSends: ["contents:", "li", "ifTrue:", unescape("%3D"), "class:", "with:", "span", "onClick:", "selectTab:"],
 referencedClasses: []
 }),
 smalltalk.Browser);
@@ -2728,8 +2592,24 @@ var self=this;
 return "st";
 return self;},
 args: [],
-source: unescape('commitPathSt%0A%09%5E%27st%27'),
-messageSends: [],
+source: unescape('commitPathSt%0A%09%5E%27st%27'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Browser.klass);
+
+smalltalk.addMethod(
+unescape('_open'),
+smalltalk.method({
+selector: unescape('open'),
+category: 'convenience',
+fn: function (){
+var self=this;
+smalltalk.send(smalltalk.send(self, "_new", []), "_open", []);
+return self;},
+args: [],
+source: unescape('open%0A%20%20%20%20self%20new%20open'),
+messageSends: ["open", "new"],
 referencedClasses: []
 }),
 smalltalk.Browser.klass);
@@ -2750,185 +2630,188 @@ referencedClasses: []
 }),
 smalltalk.Browser.klass);
 
+
+smalltalk.addClass('Debugger', smalltalk.TabWidget, ['error', 'selectedContext', 'sourceArea', 'ul', 'ul2', 'inspector', 'saveButton', 'unsavedChanges', 'selectedVariable', 'selectedVariableName', 'inspectButton'], 'IDE');
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('open'),
-category: 'convenience',
+selector: unescape('arguments'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_new", []), "_open", []);
+return (($receiver = smalltalk.send(self, "_method", [])) == nil || $receiver == undefined) ? (function(){return smalltalk.send(smalltalk.send(self['@selectedContext'], "_temps", []), "_collect_", [(function(each){return nil;})]);})() : (function(){return smalltalk.send(smalltalk.send(self, "_method", []), "_arguments", []);})();
 return self;},
 args: [],
-source: unescape('open%0A%20%20%20%20self%20new%20open'),
-messageSends: ["open", "new"],
+source: unescape('arguments%0A%09%5Eself%20method%20%0A%09%09ifNil%3A%20%5BselectedContext%20temps%20collect%3A%20%5B%3Aeach%20%7C%20nil%5D%5D%0A%09%09ifNotNil%3A%20%5Bself%20method%20arguments%5D'),
+messageSends: ["ifNil:ifNotNil:", "method", "collect:", "temps", "arguments"],
 referencedClasses: []
 }),
-smalltalk.Browser.klass);
-
+smalltalk.Debugger);
 
-smalltalk.addClass('Inspector', smalltalk.TabWidget, ['label', 'variables', 'object', 'selectedVariable', 'variablesList', 'valueTextarea', 'diveButton', 'sourceArea'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_canBeClosed'),
 smalltalk.method({
-selector: unescape('label'),
-category: 'accessing',
+selector: unescape('canBeClosed'),
+category: 'testing',
 fn: function (){
 var self=this;
-return (($receiver = self['@label']) == nil || $receiver == undefined) ? (function(){return unescape("Inspector%20%28nil%29");})() : $receiver;
+return true;
 return self;},
 args: [],
-source: unescape('label%0A%09%5Elabel%20ifNil%3A%20%5B%27Inspector%20%28nil%29%27%5D'),
-messageSends: ["ifNil:"],
+source: unescape('canBeClosed%0A%20%20%20%20%5Etrue'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_variables'),
+unescape('_error'),
 smalltalk.method({
-selector: unescape('variables'),
+selector: unescape('error'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@variables'];
+return self['@error'];
 return self;},
 args: [],
-source: unescape('variables%0A%09%5Evariables'),
+source: unescape('error%0A%09%5Eerror'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_setVariables_'),
+unescape('_error_'),
 smalltalk.method({
-selector: unescape('setVariables%3A'),
+selector: unescape('error%3A'),
 category: 'accessing',
-fn: function (aCollection){
+fn: function (anError){
 var self=this;
-(self['@variables']=aCollection);
+(self['@error']=anError);
 return self;},
-args: ["aCollection"],
-source: unescape('setVariables%3A%20aCollection%0A%09variables%20%3A%3D%20aCollection'),
+args: ["anError"],
+source: unescape('error%3A%20anError%0A%09error%20%3A%3D%20anError'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_setLabel_'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('setLabel%3A'),
-category: 'accessing',
-fn: function (aString){
+selector: unescape('initialize'),
+category: 'initialization',
+fn: function (){
 var self=this;
-(self['@label']=aString);
+smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
+smalltalk.send(self['@unsavedChanges'], "__eq", [false]);
 return self;},
-args: ["aString"],
-source: unescape('setLabel%3A%20aString%0A%09label%20%3A%3D%20aString'),
-messageSends: [],
+args: [],
+source: unescape('initialize%0A%09super%20initialize.%0A%09unsavedChanges%20%3D%20false'),
+messageSends: ["initialize", unescape("%3D")],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_selectedVariable'),
+unescape('_inspectSelectedVariable'),
 smalltalk.method({
-selector: unescape('selectedVariable'),
-category: 'accessing',
+selector: unescape('inspectSelectedVariable'),
+category: 'actions',
 fn: function (){
 var self=this;
-return self['@selectedVariable'];
+smalltalk.send(self['@selectedVariable'], "_inspect", []);
 return self;},
 args: [],
-source: unescape('selectedVariable%0A%09%5EselectedVariable'),
-messageSends: [],
+source: unescape('inspectSelectedVariable%0A%09selectedVariable%20inspect'),
+messageSends: ["inspect"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_selectedVariable_'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('selectedVariable%3A'),
+selector: unescape('label'),
 category: 'accessing',
-fn: function (aString){
+fn: function (){
 var self=this;
-(self['@selectedVariable']=aString);
+return unescape("%5BDebugger%5D");
 return self;},
-args: ["aString"],
-source: unescape('selectedVariable%3A%20aString%0A%09selectedVariable%20%3A%3D%20aString'),
+args: [],
+source: unescape('label%0A%09%5E%27%5BDebugger%5D%27'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_sourceArea'),
+unescape('_method'),
 smalltalk.method({
-selector: unescape('sourceArea'),
+selector: unescape('method'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@sourceArea'];
+return smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_methodAt_", [smalltalk.send(self['@selectedContext'], "_selector", [])]);
 return self;},
 args: [],
-source: unescape('sourceArea%0A%09%5EsourceArea'),
-messageSends: [],
+source: unescape('method%0A%09%5EselectedContext%20receiver%20class%20methodAt%3A%20selectedContext%20selector'),
+messageSends: ["methodAt:", "class", "receiver", "selector"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_inspect_'),
+unescape('_proceed'),
 smalltalk.method({
-selector: unescape('inspect%3A'),
+selector: unescape('proceed'),
 category: 'actions',
-fn: function (anObject){
+fn: function (){
 var self=this;
-(self['@object']=anObject);
-(self['@variables']=[]);
-smalltalk.send(self['@object'], "_inspectOn_", [self]);
+smalltalk.send(self, "_close", []);
+smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_perform_withArguments_", [smalltalk.send(self['@selectedContext'], "_selector", []), smalltalk.send(self['@selectedContext'], "_temps", [])]);
 return self;},
-args: ["anObject"],
-source: unescape('inspect%3A%20anObject%0A%09object%20%3A%3D%20anObject.%0A%09variables%20%3A%3D%20%23%28%29.%0A%09object%20inspectOn%3A%20self'),
-messageSends: ["inspectOn:"],
+args: [],
+source: unescape('proceed%0A%09self%20close.%0A%09selectedContext%20receiver%20perform%3A%20selectedContext%20selector%20withArguments%3A%20selectedContext%20temps'),
+messageSends: ["close", "perform:withArguments:", "receiver", "selector", "temps"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_dive'),
+unescape('_receiver'),
 smalltalk.method({
-selector: unescape('dive'),
-category: 'actions',
+selector: unescape('receiver'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_inspect", []);
+return smalltalk.send(self['@selectedContext'], "_receiver", []);
 return self;},
 args: [],
-source: unescape('dive%0A%09%28self%20variables%20at%3A%20self%20selectedVariable%29%20inspect'),
-messageSends: ["inspect", "at:", "variables", "selectedVariable"],
+source: unescape('receiver%0A%09%5EselectedContext%20receiver'),
+messageSends: ["receiver"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_refresh'),
+unescape('_renderBottomPanelOn_'),
 smalltalk.method({
-selector: unescape('refresh'),
-category: 'actions',
-fn: function (){
+selector: unescape('renderBottomPanelOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_inspect_", [self['@object']]);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateValueTextarea", []);})(self);
+(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode debugger"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));return smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
+(self['@ul2']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column debugger variables"]));
+(self['@inspector']=smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_column debugger inspector"]));
+smalltalk.send(self['@sourceArea'], "_onKeyUp_", [(function(){return smalltalk.send(self, "_updateStatus", []);})]);
 return self;},
-args: [],
-source: unescape('refresh%0A%09self%20%0A%09%09inspect%3A%20object%3B%20%0A%09%09updateVariablesList%3B%0A%09%09updateValueTextarea'),
-messageSends: ["inspect:", "updateVariablesList", "updateValueTextarea"],
-referencedClasses: []
+args: ["html"],
+source: unescape('renderBottomPanelOn%3A%20html%0A%09html%20div%0A%09%09class%3A%20%27jt_sourceCode%20debugger%27%3B%0A%09%09with%3A%20%5B%0A%09%09%09sourceArea%20%3A%3D%20SourceArea%20new.%0A%09%09%09sourceArea%20renderOn%3A%20html%5D.%0A%09ul2%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20debugger%20variables%27.%0A%09inspector%20%3A%3D%20html%20div%20class%3A%20%27jt_column%20debugger%20inspector%27.%0A%09sourceArea%0A%09%09onKeyUp%3A%20%5Bself%20updateStatus%5D'),
+messageSends: ["class:", "with:", "new", "renderOn:", "div", "ul", "onKeyUp:", "updateStatus"],
+referencedClasses: ["SourceArea"]
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
 unescape('_renderBoxOn_'),
@@ -2940,347 +2823,363 @@ var self=this;
 (function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
 return self;},
 args: ["html"],
-source: unescape('renderBoxOn%3A%20html%0A%09self%20%0A%09%09renderTopPanelOn%3A%20html%3B%0A%09%09renderBottomPanelOn%3A%20html'),
+source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20self%20%0A%09renderTopPanelOn%3A%20html%3B%0A%09renderBottomPanelOn%3A%20html'),
 messageSends: ["renderTopPanelOn:", "renderBottomPanelOn:"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_renderTopPanelOn_'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('renderTopPanelOn%3A'),
+selector: unescape('renderButtonsOn%3A'),
 category: 'rendering',
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(self['@variablesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column variables"]));(self['@valueTextarea']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column value"]);return smalltalk.send($rec, "_at_put_", ["readonly", "readonly"]);})(smalltalk.send(html, "_textarea", [])));(function($rec){smalltalk.send($rec, "_class_", ["jt_tabs inspector"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_class_", ["jt_button inspector refresh"]);smalltalk.send($rec, "_with_", ["Refresh"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_refresh", []);})]);})(smalltalk.send(html, "_button", []));return (self['@diveButton']=(function($rec){smalltalk.send($rec, "_class_", ["jt_button inspector dive"]);smalltalk.send($rec, "_with_", ["Dive"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_dive", []);})]);})(smalltalk.send(html, "_button", [])));})]);})(smalltalk.send(html, "_div", []));return smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_clear"]);})]);})(smalltalk.send(html, "_div", []));
-(function($rec){smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateValueTextarea", []);})(self);
+(self['@saveButton']=(function($rec){smalltalk.send($rec, "_with_", ["Save"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_save", []);})]);})(smalltalk.send(html, "_button", [])));
+(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["Proceed"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_proceed", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["Abandon"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_close", []);})]);})(smalltalk.send(html, "_button", []));
+(self['@inspectButton']=(function($rec){smalltalk.send($rec, "_class_", ["jt_button debugger inspect"]);smalltalk.send($rec, "_with_", ["Inspect"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_inspectSelectedVariable", []);})]);})(smalltalk.send(html, "_button", [])));
+(function($rec){smalltalk.send($rec, "_updateSourceArea", []);smalltalk.send($rec, "_updateStatus", []);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateInspector", []);})(self);
 return self;},
 args: ["html"],
-source: unescape('renderTopPanelOn%3A%20html%0A%09html%20div%20%0A%09%09class%3A%20%27top%27%3B%20%0A%09%09with%3A%20%5B%0A%09%09%09variablesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20variables%27.%0A%09%09%09valueTextarea%20%3A%3D%20html%20textarea%20class%3A%20%27jt_column%20value%27%3B%20at%3A%20%27readonly%27%20put%3A%20%27readonly%27.%0A%09%09%09html%20div%20class%3A%20%27jt_tabs%20inspector%27%3B%20with%3A%20%5B%0A%09%09%09%09html%20button%0A%09%09%09%09%09class%3A%20%27jt_button%20inspector%20refresh%27%3B%0A%09%09%09%09%09with%3A%20%27Refresh%27%3B%0A%09%09%09%09%09onClick%3A%20%5Bself%20refresh%5D.%0A%09%09%09%09diveButton%20%3A%3D%20html%20button%20%0A%09%09%09%09%09class%3A%20%27jt_button%20inspector%20dive%27%3B%0A%09%09%09%09%09with%3A%20%27Dive%27%3B%20%0A%09%09%09%09%09onClick%3A%20%5Bself%20dive%5D%5D.%0A%09%09%09html%20div%20class%3A%20%27jt_clear%27%5D.%0A%09self%0A%09%09updateVariablesList%3B%0A%09%09updateValueTextarea.'),
-messageSends: ["class:", "with:", "ul", "at:put:", "textarea", "onClick:", "refresh", "button", "dive", "div", "updateVariablesList", "updateValueTextarea"],
+source: unescape('renderButtonsOn%3A%20html%0A%09saveButton%20%3A%3D%20html%20button%0A%09%09with%3A%20%27Save%27%3B%0A%09%09onClick%3A%20%5Bself%20save%5D.%0A%09html%20button%0A%09%09with%3A%20%27DoIt%27%3B%0A%09%09onClick%3A%20%5BsourceArea%20doIt%5D.%0A%09html%20button%0A%09%09with%3A%20%27PrintIt%27%3B%0A%09%09onClick%3A%20%5BsourceArea%20printIt%5D.%0A%09html%20button%0A%09%09with%3A%20%27InspectIt%27%3B%0A%09%09onClick%3A%20%5BsourceArea%20inspectIt%5D.%0A%09html%20button%20%0A%09%09with%3A%20%27Proceed%27%3B%0A%09%09onClick%3A%20%5Bself%20proceed%5D.%0A%09html%20button%0A%09%09with%3A%20%27Abandon%27%3B%0A%09%09onClick%3A%20%5Bself%20close%5D.%0A%09inspectButton%20%3A%3D%20html%20button%0A%09%09class%3A%20%27jt_button%20debugger%20inspect%27%3B%0A%09%09with%3A%20%27Inspect%27%3B%0A%09%09onClick%3A%20%5Bself%20inspectSelectedVariable%5D.%0A%09%20self%20%0A%09%09updateSourceArea%3B%0A%09%09updateStatus%3B%0A%09%09updateVariablesList%3B%0A%09%09updateInspector'),
+messageSends: ["with:", "onClick:", "save", "button", "doIt", "printIt", "inspectIt", "proceed", "close", "class:", "inspectSelectedVariable", "updateSourceArea", "updateStatus", "updateVariablesList", "updateInspector"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_renderBottomPanelOn_'),
+unescape('_renderContext_on_'),
 smalltalk.method({
-selector: unescape('renderBottomPanelOn%3A'),
+selector: unescape('renderContext%3Aon%3A'),
 category: 'rendering',
-fn: function (html){
+fn: function (aContext, html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=(function($rec){smalltalk.send($rec, "_receiver_", [self['@object']]);smalltalk.send($rec, "_onDoIt_", [(function(){return smalltalk.send(self, "_refresh", []);})]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", [])));return smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
+var li=nil;
+(li=smalltalk.send(html, "_li", []));
+((($receiver = smalltalk.send(self['@selectedContext'], "__eq", [aContext])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));
+(function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(aContext, "_asString", [])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectContext_", [aContext]);})]);})(li);
+(($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(aContext, "_home", []), html]);})() : nil;
 return self;},
-args: ["html"],
-source: unescape('renderBottomPanelOn%3A%20html%0A%20%20%20%20html%20div%0A%09class%3A%20%27jt_sourceCode%27%3B%0A%09with%3A%20%5B%0A%09%20%20%20%20sourceArea%20%3A%3D%20SourceArea%20new%0A%09%09receiver%3A%20object%3B%0A%09%09onDoIt%3A%20%5Bself%20refresh%5D%3B%0A%09%09yourself.%0A%20%20%20%20%20%20%20%20%20%20%20%20sourceArea%20renderOn%3A%20html%5D'),
-messageSends: ["class:", "with:", "receiver:", "onDoIt:", "refresh", "yourself", "new", "renderOn:", "div"],
-referencedClasses: ["SourceArea"]
+args: ["aContext", "html"],
+source: unescape('renderContext%3A%20aContext%20on%3A%20html%0A%09%7C%20li%20%7C%0A%09li%20%3A%3D%20html%20li.%0A%09selectedContext%20%3D%20aContext%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09li%20%0A%09%09with%3A%20aContext%20asString%3B%0A%09%09onClick%3A%20%5Bself%20selectContext%3A%20aContext%5D.%0A%09aContext%20home%20ifNotNil%3A%20%5Bself%20renderContext%3A%20aContext%20home%20on%3A%20html%5D'),
+messageSends: ["li", "ifTrue:", unescape("%3D"), "class:", "with:", "asString", "onClick:", "selectContext:", "ifNotNil:", "home", "renderContext:on:"],
+referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
+unescape('_renderTopPanelOn_'),
 smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
+selector: unescape('renderTopPanelOn%3A'),
 category: 'rendering',
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
-smalltalk.send(self, "_updateButtons", []);
+(self['@selectedContext']=smalltalk.send(smalltalk.send(self, "_error", []), "_context", []));
+(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_class_", ["label"]);return smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(self, "_error", []), "_messageText", [])]);})(smalltalk.send(html, "_div", []));return (self['@ul']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column debugger contexts"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(smalltalk.send(self, "_error", []), "_context", []), html]);})]);})(smalltalk.send(html, "_ul", [])));})]);})(smalltalk.send(html, "_div", []));
 return self;},
 args: ["html"],
-source: unescape('renderButtonsOn%3A%20html%0A%09html%20button%20%0A%09%09with%3A%20%27DoIt%27%3B%0A%09%09onClick%3A%20%5Bself%20sourceArea%20doIt%5D.%0A%09html%20button%20%0A%09%09with%3A%20%27PrintIt%27%3B%0A%09%09onClick%3A%20%5Bself%20sourceArea%20printIt%5D.%0A%09html%20button%20%0A%09%09with%3A%20%27InspectIt%27%3B%0A%09%09onClick%3A%20%5Bself%20sourceArea%20inspectIt%5D.%0A%09self%20updateButtons'),
-messageSends: ["with:", "onClick:", "doIt", "sourceArea", "button", "printIt", "inspectIt", "updateButtons"],
+source: unescape('renderTopPanelOn%3A%20html%0A%09selectedContext%20%3A%3D%20self%20error%20context.%0A%09html%20div%20%0A%09%09class%3A%20%27top%27%3B%20%0A%09%09with%3A%20%5B%0A%09%09%09html%20div%20%0A%09%09%09%09class%3A%20%27label%27%3B%0A%09%09%09%09with%3A%20self%20error%20messageText.%0A%09%09%09ul%20%3A%3D%20html%20ul%20%0A%09%09%09%09class%3A%20%27jt_column%20debugger%20contexts%27%3B%0A%09%09%09%09with%3A%20%5Bself%20renderContext%3A%20self%20error%20context%20on%3A%20html%5D%5D'),
+messageSends: ["context", "error", "class:", "with:", "messageText", "div", "renderContext:on:", "ul"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_canBeClosed'),
+unescape('_save'),
 smalltalk.method({
-selector: unescape('canBeClosed'),
-category: 'testing',
+selector: unescape('save'),
+category: 'actions',
 fn: function (){
 var self=this;
-return true;
+var protocol=nil;
+(protocol=smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_methodDictionary", []), "_at_", [smalltalk.send(self['@selectedContext'], "_selector", [])]), "_category", []));
+smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_compile_category_", [smalltalk.send(self['@sourceArea'], "_val", []), protocol]);
+smalltalk.send(self, "_updateStatus", []);
 return self;},
 args: [],
-source: unescape('canBeClosed%0A%09%5Etrue'),
-messageSends: [],
+source: unescape('save%0A%09%7C%20protocol%20%7C%0A%09protocol%20%3A%3D%20%28selectedContext%20receiver%20class%20methodDictionary%20at%3A%20selectedContext%20selector%29%20category.%0A%09selectedContext%20receiver%20class%20compile%3A%20sourceArea%20val%20category%3A%20protocol.%0A%09self%20updateStatus'),
+messageSends: ["category", "at:", "methodDictionary", "class", "receiver", "selector", "compile:category:", "val", "updateStatus"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_updateVariablesList'),
+unescape('_selectContext_'),
 smalltalk.method({
-selector: unescape('updateVariablesList'),
-category: 'updating',
-fn: function (){
+selector: unescape('selectContext%3A'),
+category: 'actions',
+fn: function (aContext){
 var self=this;
-smalltalk.send(self['@variablesList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_keys", []), "_do_", [(function(each){var li=nil;
-(li=smalltalk.send(html, "_li", []));(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_", [each]);})]);})(li);return ((($receiver = smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);})]);
+(self['@selectedContext']=aContext);
+(self['@selectedVariable']=nil);
+(self['@selectedVariableName']=nil);
+(function($rec){smalltalk.send($rec, "_updateContextsList", []);smalltalk.send($rec, "_updateSourceArea", []);smalltalk.send($rec, "_updateInspector", []);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateStatus", []);})(self);
 return self;},
-args: [],
-source: unescape('updateVariablesList%0A%09variablesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09self%20variables%20keys%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%09%09li%20%3A%3D%20html%20li.%0A%09%09%09li%0A%09%09%09%09with%3A%20each%3B%0A%09%09%09%09onClick%3A%20%5Bself%20selectVariable%3A%20each%5D.%0A%09%09%09self%20selectedVariable%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09%09%09li%20class%3A%20%27selected%27%5D%5D%5D'),
-messageSends: ["contents:", "do:", "keys", "variables", "li", "with:", "onClick:", "selectVariable:", "ifTrue:", unescape("%3D"), "selectedVariable", "class:"],
+args: ["aContext"],
+source: unescape('selectContext%3A%20aContext%0A%09selectedContext%20%3A%3D%20aContext.%0A%09selectedVariable%20%3A%3D%20nil.%0A%09selectedVariableName%20%3A%3D%20nil.%0A%09self%20%0A%09%09updateContextsList%3B%0A%09%09updateSourceArea%3B%0A%09%09updateInspector%3B%0A%09%09updateVariablesList%3B%0A%09%09updateStatus'),
+messageSends: ["updateContextsList", "updateSourceArea", "updateInspector", "updateVariablesList", "updateStatus"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_selectVariable_'),
+unescape('_selectVariable_named_'),
 smalltalk.method({
-selector: unescape('selectVariable%3A'),
-category: 'updating',
-fn: function (aString){
+selector: unescape('selectVariable%3Anamed%3A'),
+category: 'actions',
+fn: function (anObject, aString){
 var self=this;
-smalltalk.send(self, "_selectedVariable_", [aString]);
-(function($rec){smalltalk.send($rec, "_updateVariablesList", []);smalltalk.send($rec, "_updateValueTextarea", []);return smalltalk.send($rec, "_updateButtons", []);})(self);
+(self['@selectedVariable']=anObject);
+(self['@selectedVariableName']=aString);
+smalltalk.send(self['@inspector'], "_contents_", [(function(html){return smalltalk.send(html, "_with_", [smalltalk.send(anObject, "_printString", [])]);})]);
+smalltalk.send(self, "_updateVariablesList", []);
 return self;},
-args: ["aString"],
-source: unescape('selectVariable%3A%20aString%0A%09self%20selectedVariable%3A%20aString.%0A%09self%20%0A%09%09updateVariablesList%3B%0A%09%09updateValueTextarea%3B%0A%09%09updateButtons'),
-messageSends: ["selectedVariable:", "updateVariablesList", "updateValueTextarea", "updateButtons"],
+args: ["anObject", "aString"],
+source: unescape('selectVariable%3A%20anObject%20named%3A%20aString%0A%09selectedVariable%20%3A%3D%20anObject.%0A%09selectedVariableName%20%3A%3D%20aString.%0A%09inspector%20contents%3A%20%5B%3Ahtml%20%7C%20html%20with%3A%20anObject%20printString%5D.%0A%09self%20updateVariablesList'),
+messageSends: ["contents:", "with:", "printString", "updateVariablesList"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_updateValueTextarea'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('updateValueTextarea'),
-category: 'updating',
+selector: unescape('source'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@valueTextarea'], "_asJQuery", []), "_val_", [((($receiver = smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "";})() : (function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_printString", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "";}), (function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_printString", []);})]))]);
+return (($receiver = smalltalk.send(self, "_method", [])) == nil || $receiver == undefined) ? (function(){return unescape("Method%20doesn%27t%20exist%21");})() : (function(){return smalltalk.send(smalltalk.send(self, "_method", []), "_source", []);})();
 return self;},
 args: [],
-source: unescape('updateValueTextarea%0A%09valueTextarea%20asJQuery%20val%3A%20%28self%20selectedVariable%20isNil%0A%09%09ifTrue%3A%20%5B%27%27%5D%0A%09%09ifFalse%3A%20%5B%28self%20variables%20at%3A%20self%20selectedVariable%29%20printString%5D%29'),
-messageSends: ["val:", "asJQuery", "ifTrue:ifFalse:", "isNil", "selectedVariable", "printString", "at:", "variables"],
+source: unescape('source%0A%09%5Eself%20method%20%0A%09%09ifNil%3A%20%5B%27Method%20doesn%27%27t%20exist%21%27%5D%0A%09%09ifNotNil%3A%20%5Bself%20method%20source%5D'),
+messageSends: ["ifNil:ifNotNil:", "method", "source"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_updateButtons'),
+unescape('_updateContextsList'),
 smalltalk.method({
-selector: unescape('updateButtons'),
+selector: unescape('updateContextsList'),
 category: 'updating',
 fn: function (){
 var self=this;
-((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "_notNil", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@diveButton'], "_at_put_", ["disabled", true]);})() : (function(){return smalltalk.send(self['@diveButton'], "_removeAt_", ["disabled"]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@diveButton'], "_at_put_", ["disabled", true]);}), (function(){return smalltalk.send(self['@diveButton'], "_removeAt_", ["disabled"]);})]));
+smalltalk.send(self['@ul'], "_contents_", [(function(html){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(smalltalk.send(self, "_error", []), "_context", []), html]);})]);
 return self;},
 args: [],
-source: unescape('updateButtons%0A%09%28self%20selectedVariable%20notNil%20and%3A%20%5B%28self%20variables%20at%3A%20self%20selectedVariable%29%20notNil%5D%29%0A%09%09ifFalse%3A%20%5BdiveButton%20at%3A%20%27disabled%27%20put%3A%20true%5D%20%0A%09%09ifTrue%3A%20%5BdiveButton%20removeAt%3A%20%27disabled%27%5D'),
-messageSends: ["ifFalse:ifTrue:", "and:", "notNil", "selectedVariable", "at:", "variables", "at:put:", "removeAt:"],
+source: unescape('updateContextsList%0A%09ul%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09self%20renderContext%3A%20self%20error%20context%20on%3A%20html%5D'),
+messageSends: ["contents:", "renderContext:on:", "context", "error"],
 referencedClasses: []
 }),
-smalltalk.Inspector);
-
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_on_'),
+unescape('_updateInspector'),
 smalltalk.method({
-selector: unescape('on%3A'),
-category: 'instance creation',
-fn: function (anObject){
+selector: unescape('updateInspector'),
+category: 'updating',
+fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_inspect_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+smalltalk.send(self['@inspector'], "_contents_", [(function(html){return nil;})]);
 return self;},
-args: ["anObject"],
-source: unescape('on%3A%20anObject%0A%09%5Eself%20new%0A%09%09inspect%3A%20anObject%3B%0A%09%09yourself'),
-messageSends: ["inspect:", "yourself", "new"],
+args: [],
+source: unescape('updateInspector%0A%09inspector%20contents%3A%20%5B%3Ahtml%20%7C%5D'),
+messageSends: ["contents:"],
 referencedClasses: []
 }),
-smalltalk.Inspector.klass);
-
+smalltalk.Debugger);
 
-smalltalk.addClass('ReferencesBrowser', smalltalk.TabWidget, ['implementors', 'senders', 'implementorsList', 'input', 'timer', 'selector', 'sendersList', 'referencedClasses', 'referencedClassesList'], 'IDE');
 smalltalk.addMethod(
-unescape('_implementors'),
+unescape('_updateSourceArea'),
 smalltalk.method({
-selector: unescape('implementors'),
-category: 'accessing',
+selector: unescape('updateSourceArea'),
+category: 'updating',
 fn: function (){
 var self=this;
-return (($receiver = self['@implementors']) == nil || $receiver == undefined) ? (function(){return (self['@implementors']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+smalltalk.send(self['@sourceArea'], "_val_", [smalltalk.send(self, "_source", [])]);
 return self;},
 args: [],
-source: unescape('implementors%0A%09%5Eimplementors%20ifNil%3A%20%5Bimplementors%20%3A%3D%20Array%20new%5D'),
-messageSends: ["ifNil:", "new"],
-referencedClasses: ["Array"]
+source: unescape('updateSourceArea%0A%09%20sourceArea%20val%3A%20self%20source'),
+messageSends: ["val:", "source"],
+referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_updateStatus'),
 smalltalk.method({
-selector: unescape('label'),
-category: 'accessing',
+selector: unescape('updateStatus'),
+category: 'updating',
 fn: function (){
 var self=this;
-return unescape("%5BReferences%5D");
+((($receiver = smalltalk.send(smalltalk.send(self['@sourceArea'], "_val", []), "__eq", [smalltalk.send(self, "_source", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);})() : (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);}), (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})]));
 return self;},
 args: [],
-source: unescape('label%0A%09%5E%27%5BReferences%5D%27'),
-messageSends: [],
+source: unescape('updateStatus%0A%09sourceArea%20val%20%3D%20self%20source%0A%09%09ifTrue%3A%20%5B%0A%09%09%09saveButton%20ifNotNil%3A%20%5B%0A%09%09%09%09saveButton%20at%3A%20%27disabled%27%20put%3A%20true%5D.%0A%09%09%09unsavedChanges%20%3A%3D%20false%5D%0A%09%09ifFalse%3A%20%5B%0A%09%09%09saveButton%20ifNotNil%3A%20%5B%0A%09%09%09%09saveButton%20removeAt%3A%20%27disabled%27%5D.%0A%09%09%09unsavedChanges%20%3A%3D%20true%5D'),
+messageSends: ["ifTrue:ifFalse:", unescape("%3D"), "val", "source", "ifNotNil:", "at:put:", "removeAt:"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_updateVariablesList'),
 smalltalk.method({
-selector: unescape('selector'),
-category: 'accessing',
+selector: unescape('updateVariablesList'),
+category: 'updating',
 fn: function (){
 var self=this;
-return self['@selector'];
+smalltalk.send(self['@ul2'], "_contents_", [(function(html){var li=nil;
+(li=(function($rec){smalltalk.send($rec, "_with_", ["self"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [smalltalk.send(self, "_receiver", []), "self"]);})]);})(smalltalk.send(html, "_li", [])));((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", ["self"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));smalltalk.send(smalltalk.send(self, "_arguments", []), "_withIndexDo_", [(function(each, index){var param=nil;
+(param=smalltalk.send(smalltalk.send(self['@selectedContext'], "_temps", []), "_at_", [index]));(li=(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [param, each]);})]);})(smalltalk.send(html, "_li", [])));return ((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_allInstanceVariableNames", []), "_do_", [(function(each){var ivar=nil;
+(ivar=smalltalk.send(smalltalk.send(self, "_receiver", []), "_instVarAt_", [each]));(li=(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [ivar, each]);})]);})(smalltalk.send(html, "_li", [])));return ((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);})]);
+(($receiver = self['@selectedVariable']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self['@inspectButton'], "_at_put_", ["disabled", true]);})() : (function(){return smalltalk.send(self['@inspectButton'], "_removeAt_", ["disabled"]);})();
 return self;},
 args: [],
-source: unescape('selector%0A%09%5Eselector'),
-messageSends: [],
+source: unescape('updateVariablesList%0A%09ul2%20contents%3A%20%5B%3Ahtml%20%7C%20%7C%20li%20%7C%0A%09%09li%20%3A%3D%20html%20li%20%0A%09%09%09with%3A%20%27self%27%3B%0A%09%09%09onClick%3A%20%5Bself%20selectVariable%3A%20self%20receiver%20named%3A%20%27self%27%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectedVariableName%20%3D%20%27self%27%20ifTrue%3A%20%5B%0A%09%09%09li%20class%3A%20%27selected%27%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20arguments%20withIndexDo%3A%20%5B%3Aeach%20%3Aindex%20%7C%20%7C%20param%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20param%20%3A%3D%20selectedContext%20temps%20at%3A%20index.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20li%20%3A%3D%20html%20li%20%0A%09%09%09%09with%3A%20each%3B%0A%09%09%09%09onClick%3A%20%5Bself%20selectVariable%3A%20param%20named%3A%20each%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectedVariableName%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09%09%09li%20class%3A%20%27selected%27%5D%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20receiver%20class%20allInstanceVariableNames%20do%3A%20%5B%3Aeach%20%7C%20%7C%20ivar%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ivar%20%3A%3D%20self%20receiver%20instVarAt%3A%20each.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20li%20%3A%3D%20html%20li%20%0A%09%09%09%09with%3A%20each%3B%0A%09%09%09%09onClick%3A%20%5Bself%20selectVariable%3A%20ivar%20named%3A%20each%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectedVariableName%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09%09%09li%20class%3A%20%27selected%27%5D%5D%5D.%0A%09selectedVariable%20ifNil%3A%20%5BinspectButton%20at%3A%20%27disabled%27%20put%3A%20true%5D%20ifNotNil%3A%20%5BinspectButton%20removeAt%3A%20%27disabled%27%5D'),
+messageSends: ["contents:", "with:", "onClick:", "selectVariable:named:", "receiver", "li", "ifTrue:", unescape("%3D"), "class:", "withIndexDo:", "arguments", "at:", "temps", "do:", "allInstanceVariableNames", "class", "instVarAt:", "ifNil:ifNotNil:", "at:put:", "removeAt:"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Debugger);
+
 
+
+smalltalk.addClass('IDETranscript', smalltalk.TabWidget, ['textarea'], 'IDE');
 smalltalk.addMethod(
-unescape('_senders'),
+unescape('_clear'),
 smalltalk.method({
-selector: unescape('senders'),
-category: 'accessing',
+selector: unescape('clear'),
+category: 'actions',
 fn: function (){
 var self=this;
-return (($receiver = self['@senders']) == nil || $receiver == undefined) ? (function(){return (self['@senders']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [""]);
 return self;},
 args: [],
-source: unescape('senders%0A%09%5Esenders%20ifNil%3A%20%5Bsenders%20%3A%3D%20Array%20new%5D'),
-messageSends: ["ifNil:", "new"],
-referencedClasses: ["Array"]
+source: unescape('clear%0A%20%20%20%20textarea%20asJQuery%20val%3A%20%27%27'),
+messageSends: ["val:", "asJQuery"],
+referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_classesAndMetaclasses'),
+unescape('_cr'),
 smalltalk.method({
-selector: unescape('classesAndMetaclasses'),
-category: 'accessing',
+selector: unescape('cr'),
+category: 'actions',
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_collect_", [(function(each){return smalltalk.send(each, "_class", []);})])]);
+smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [smalltalk.send(smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val", []), "__comma", [smalltalk.send((smalltalk.String || String), "_cr", [])])]);
 return self;},
 args: [],
-source: unescape('classesAndMetaclasses%0A%09%5ESmalltalk%20current%20classes%2C%20%28Smalltalk%20current%20classes%20collect%3A%20%5B%3Aeach%20%7C%20each%20class%5D%29'),
-messageSends: [unescape("%2C"), "classes", "current", "collect:", "class"],
-referencedClasses: ["Smalltalk"]
+source: unescape('cr%0A%20%20%20%20textarea%20asJQuery%20val%3A%20textarea%20asJQuery%20val%2C%20String%20cr.'),
+messageSends: ["val:", "asJQuery", unescape("%2C"), "val", "cr"],
+referencedClasses: ["String"]
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_referencedClasses'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('referencedClasses'),
+selector: unescape('label'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return (($receiver = self['@referencedClasses']) == nil || $receiver == undefined) ? (function(){return (self['@referencedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return "Transcript";
 return self;},
 args: [],
-source: unescape('referencedClasses%0A%09%5EreferencedClasses%20ifNil%3A%20%5BreferencedClasses%20%3A%3D%20Array%20new%5D'),
-messageSends: ["ifNil:", "new"],
-referencedClasses: ["Array"]
+source: unescape('label%0A%20%20%20%20%5E%27Transcript%27'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_openBrowserOn_'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('openBrowserOn%3A'),
+selector: unescape('open'),
 category: 'actions',
-fn: function (aMethod){
+fn: function (){
 var self=this;
-var browser=nil;
-(browser=smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [((($receiver = smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_instanceClass", []);})() : (function(){return smalltalk.send(aMethod, "_methodClass", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_instanceClass", []);}), (function(){return smalltalk.send(aMethod, "_methodClass", []);})]))]));
-((($receiver = smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(browser, "_selectTab_", [smalltalk.symbolFor("class")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(browser, "_selectTab_", [smalltalk.symbolFor("class")]);})]));
-(function($rec){smalltalk.send($rec, "_selectProtocol_", [smalltalk.send(aMethod, "_category", [])]);return smalltalk.send($rec, "_selectMethod_", [aMethod]);})(browser);
+(function($rec){smalltalk.send($rec, "_open", []);return smalltalk.send($rec, "_selectTab_", [self]);})(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []));
 return self;},
-args: ["aMethod"],
-source: unescape('openBrowserOn%3A%20aMethod%0A%20%20%20%20%20%20%20%7C%20browser%20%7C%0A%20%20%20%20%20%20%20browser%20%3A%3D%20Browser%20openOn%3A%20%28aMethod%20methodClass%20isMetaclass%20%0A%09%09ifTrue%3A%20%5BaMethod%20methodClass%20instanceClass%5D%20ifFalse%3A%20%5BaMethod%20methodClass%5D%29.%0A%20%20%20%20%20%20%20aMethod%20methodClass%20isMetaclass%20ifTrue%3A%20%5Bbrowser%20selectTab%3A%20%23class%5D.%0A%20%20%20%20%20%20%20browser%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectProtocol%3A%20aMethod%20category%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectMethod%3A%20aMethod'),
-messageSends: ["openOn:", "ifTrue:ifFalse:", "isMetaclass", "methodClass", "instanceClass", "ifTrue:", "selectTab:", "selectProtocol:", "category", "selectMethod:"],
-referencedClasses: ["Browser"]
+args: [],
+source: unescape('open%0A%20%20%20%20TabManager%20current%20%0A%09open%3B%0A%09selectTab%3A%20self'),
+messageSends: ["open", "selectTab:", "current"],
+referencedClasses: ["TabManager"]
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_searchReferencesFor_'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('searchReferencesFor%3A'),
-category: 'actions',
-fn: function (aString){
+selector: unescape('renderBoxOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-(self['@selector']=aString);
-(self['@implementors']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-(self['@senders']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-(self['@referencedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-((($receiver = smalltalk.send(self['@selector'], "_match_", [unescape("%5E%5BA-Z%5D")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);})() : (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);}), (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})]));
+(self['@textarea']=smalltalk.send(html, "_textarea", []));
+(function($rec){smalltalk.send($rec, "_class_", ["jt_transcript"]);return smalltalk.send($rec, "_at_put_", ["spellcheck", "false"]);})(self['@textarea']);
 return self;},
-args: ["aString"],
-source: unescape('searchReferencesFor%3A%20aString%0A%09selector%20%3A%3D%20aString.%0A%09implementors%20%3A%3D%20Array%20new.%0A%09senders%20%3A%3D%20Array%20new.%0A%09referencedClasses%20%3A%3D%20Array%20new.%0A%09%28selector%20match%3A%20%27%5E%5BA-Z%5D%27%29%20%0A%09%09ifFalse%3A%20%5Bself%20searchSelectorReferencesFor%3A%20selector%5D%0A%09%09ifTrue%3A%20%5Bself%20searchReferencedClassesFor%3A%20selector%5D'),
-messageSends: ["new", "ifFalse:ifTrue:", "match:", "searchSelectorReferencesFor:", "searchReferencedClassesFor:"],
-referencedClasses: ["Array"]
+args: ["html"],
+source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20textarea%20%3A%3D%20html%20textarea.%0A%20%20%20%20textarea%20%0A%09class%3A%20%27jt_transcript%27%3B%0A%09at%3A%20%27spellcheck%27%20put%3A%20%27false%27'),
+messageSends: ["textarea", "class:", "at:put:"],
+referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_search_'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('search%3A'),
-category: 'actions',
-fn: function (aString){
+selector: unescape('renderButtonsOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);smalltalk.send($rec, "_updateImplementorsList", []);smalltalk.send($rec, "_updateSendersList", []);return smalltalk.send($rec, "_updateReferencedClassesList", []);})(self);
+(function($rec){smalltalk.send($rec, "_with_", ["Clear transcript"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_clear", []);})]);})(smalltalk.send(html, "_button", []));
 return self;},
-args: ["aString"],
-source: unescape('search%3A%20aString%0A%09self%20%0A%09%09searchReferencesFor%3A%20aString%3B%0A%09%09updateImplementorsList%3B%0A%09%09updateSendersList%3B%0A%09%09updateReferencedClassesList'),
-messageSends: ["searchReferencesFor:", "updateImplementorsList", "updateSendersList", "updateReferencedClassesList"],
+args: ["html"],
+source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20html%20button%0A%09with%3A%20%27Clear%20transcript%27%3B%0A%09onClick%3A%20%5Bself%20clear%5D'),
+messageSends: ["with:", "onClick:", "clear", "button"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript);
 
 smalltalk.addMethod(
-unescape('_searchReferencedClassesFor_'),
+unescape('_show_'),
 smalltalk.method({
-selector: unescape('searchReferencedClassesFor%3A'),
+selector: unescape('show%3A'),
 category: 'actions',
-fn: function (aString){
+fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_values", []), "_do_", [(function(value){return ((($receiver = smalltalk.send(smalltalk.send(value, "_referencedClasses", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})]));})]);})]);
+(($receiver = self['@textarea']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self, "_open", []);})() : $receiver;
+smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [smalltalk.send(smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val", []), "__comma", [smalltalk.send(anObject, "_asString", [])])]);
 return self;},
-args: ["aString"],
-source: unescape('searchReferencedClassesFor%3A%20aString%0A%09self%20classesAndMetaclasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%09each%20methodDictionary%20values%20do%3A%20%5B%3Avalue%20%7C%0A%09%09%09%28value%20referencedClasses%20includes%3A%20selector%29%20ifTrue%3A%20%5B%0A%09%09%09%09self%20referencedClasses%20add%3A%20value%5D%5D%5D'),
-messageSends: ["do:", "classesAndMetaclasses", "values", "methodDictionary", "ifTrue:", "includes:", "referencedClasses", "add:"],
+args: ["anObject"],
+source: unescape('show%3A%20anObject%0A%20%20%20%20textarea%20ifNil%3A%20%5Bself%20open%5D.%0A%20%20%20%20textarea%20asJQuery%20val%3A%20textarea%20asJQuery%20val%2C%20anObject%20asString.'),
+messageSends: ["ifNil:", "open", "val:", "asJQuery", unescape("%2C"), "val", "asString"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript);
+
 
+smalltalk.IDETranscript.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_searchSelectorReferencesFor_'),
+unescape('_current'),
 smalltalk.method({
-selector: unescape('searchSelectorReferencesFor%3A'),
-category: 'actions',
-fn: function (aString){
+selector: unescape('current'),
+category: 'instance creation',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_keysAndValuesDo_", [(function(key, value){((($receiver = smalltalk.send(key, "__eq", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})]));return ((($receiver = smalltalk.send(smalltalk.send(value, "_messageSends", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})]));})]);})]);
+return (($receiver = self['@current']) == nil || $receiver == undefined) ? (function(){return (self['@current']=smalltalk.send(self, "_new", [], smalltalk.TabWidget.klass));})() : $receiver;
 return self;},
-args: ["aString"],
-source: unescape('searchSelectorReferencesFor%3A%20aString%0A%09self%20classesAndMetaclasses%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09each%20methodDictionary%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%20%0A%09%09%09key%20%3D%20selector%20ifTrue%3A%20%5Bself%20implementors%20add%3A%20value%5D.%0A%09%09%09%28value%20messageSends%20includes%3A%20selector%29%20ifTrue%3A%20%5B%0A%09%09%09%09self%20senders%20add%3A%20value%5D%5D%5D'),
-messageSends: ["do:", "classesAndMetaclasses", "keysAndValuesDo:", "methodDictionary", "ifTrue:", unescape("%3D"), "add:", "implementors", "includes:", "messageSends", "senders"],
+args: [],
+source: unescape('current%0A%09%5Ecurrent%20ifNil%3A%20%5Bcurrent%20%3A%3D%20super%20new%5D'),
+messageSends: ["ifNil:", "new"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript.klass);
 
 smalltalk.addMethod(
 unescape('_initialize'),
@@ -3289,515 +3188,465 @@ selector: unescape('initialize'),
 category: 'initialization',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
-(self['@selector']="");
+smalltalk.send((smalltalk.Transcript || Transcript), "_register_", [smalltalk.send(self, "_current", [])]);
 return self;},
 args: [],
-source: unescape('initialize%0A%09super%20initialize.%0A%09selector%20%3A%3D%20%27%27'),
-messageSends: ["initialize"],
-referencedClasses: []
+source: unescape('initialize%0A%09Transcript%20register%3A%20self%20current'),
+messageSends: ["register:", "current"],
+referencedClasses: ["Transcript"]
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript.klass);
 
 smalltalk.addMethod(
-unescape('_setInputEvents'),
+unescape('_new'),
 smalltalk.method({
-selector: unescape('setInputEvents'),
-category: 'private',
+selector: unescape('new'),
+category: 'instance creation',
 fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_onKeyUp_", [(function(){return (self['@timer']=smalltalk.send((function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);}), "_valueWithTimeout_", [(100)]));})]);return smalltalk.send($rec, "_onKeyDown_", [(function(){return (($receiver = self['@timer']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@timer'], "_clearTimeout", []);})() : nil;})]);})(self['@input']);
+smalltalk.send(self, "_shouldNotImplement", []);
 return self;},
 args: [],
-source: unescape('setInputEvents%0A%09input%0A%09%09onKeyUp%3A%20%5Btimer%20%3A%3D%20%5Bself%20search%3A%20input%20asJQuery%20val%5D%20valueWithTimeout%3A%20100%5D%3B%0A%09%09onKeyDown%3A%20%5Btimer%20ifNotNil%3A%20%5Btimer%20clearTimeout%5D%5D'),
-messageSends: ["onKeyUp:", "valueWithTimeout:", "search:", "val", "asJQuery", "onKeyDown:", "ifNotNil:", "clearTimeout"],
+source: unescape('new%0A%20%20%20%20self%20shouldNotImplement'),
+messageSends: ["shouldNotImplement"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript.klass);
 
 smalltalk.addMethod(
-unescape('_renderBoxOn_'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('open'),
+category: 'instance creation',
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_renderInputOn_", [html]);smalltalk.send($rec, "_renderImplementorsOn_", [html]);smalltalk.send($rec, "_renderSendersOn_", [html]);return smalltalk.send($rec, "_renderReferencedClassesOn_", [html]);})(self);
+(function($rec){smalltalk.send($rec, "_open", []);return smalltalk.send($rec, "_selectTab_", [smalltalk.send(self, "_current", [])]);})(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []));
 return self;},
-args: ["html"],
-source: unescape('renderBoxOn%3A%20html%0A%09self%20%0A%09%09renderInputOn%3A%20html%3B%0A%09%09renderImplementorsOn%3A%20html%3B%0A%09%09renderSendersOn%3A%20html%3B%0A%09%09renderReferencedClassesOn%3A%20html'),
-messageSends: ["renderInputOn:", "renderImplementorsOn:", "renderSendersOn:", "renderReferencedClassesOn:"],
-referencedClasses: []
+args: [],
+source: unescape('open%0A%20%20%20%20TabManager%20current%20%0A%09open%3B%0A%09selectTab%3A%20self%20current'),
+messageSends: ["open", "selectTab:", "current"],
+referencedClasses: ["TabManager"]
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.IDETranscript.klass);
 
+
+smalltalk.addClass('Inspector', smalltalk.TabWidget, ['label', 'variables', 'object', 'selectedVariable', 'variablesList', 'valueTextarea', 'diveButton', 'sourceArea'], 'IDE');
 smalltalk.addMethod(
-unescape('_renderInputOn_'),
+unescape('_canBeClosed'),
 smalltalk.method({
-selector: unescape('renderInputOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('canBeClosed'),
+category: 'testing',
+fn: function (){
 var self=this;
-(self['@input']=(function($rec){smalltalk.send($rec, "_class_", ["implementors"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_input", [])));
-smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val_", [self['@selector']]);
-smalltalk.send(self, "_setInputEvents", []);
+return true;
 return self;},
-args: ["html"],
-source: unescape('renderInputOn%3A%20html%0A%09input%20%3A%3D%20html%20input%20%0A%09%09class%3A%20%27implementors%27%3B%0A%09%09yourself.%0A%09input%20asJQuery%20val%3A%20selector.%0A%09self%20setInputEvents'),
-messageSends: ["class:", "yourself", "input", "val:", "asJQuery", "setInputEvents"],
+args: [],
+source: unescape('canBeClosed%0A%09%5Etrue'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_renderImplementorsOn_'),
+unescape('_dive'),
 smalltalk.method({
-selector: unescape('renderImplementorsOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('dive'),
+category: 'actions',
+fn: function (){
 var self=this;
-(self['@implementorsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column implementors"]));
-smalltalk.send(self, "_updateImplementorsList", []);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_inspect", []);
 return self;},
-args: ["html"],
-source: unescape('renderImplementorsOn%3A%20html%0A%09implementorsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20implementors%27.%0A%09self%20updateImplementorsList'),
-messageSends: ["class:", "ul", "updateImplementorsList"],
+args: [],
+source: unescape('dive%0A%09%28self%20variables%20at%3A%20self%20selectedVariable%29%20inspect'),
+messageSends: ["inspect", "at:", "variables", "selectedVariable"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_renderSendersOn_'),
+unescape('_inspect_'),
 smalltalk.method({
-selector: unescape('renderSendersOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('inspect%3A'),
+category: 'actions',
+fn: function (anObject){
 var self=this;
-(self['@sendersList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column senders"]));
-smalltalk.send(self, "_updateSendersList", []);
+(self['@object']=anObject);
+(self['@variables']=[]);
+smalltalk.send(self['@object'], "_inspectOn_", [self]);
 return self;},
-args: ["html"],
-source: unescape('renderSendersOn%3A%20html%0A%09sendersList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20senders%27.%0A%09self%20updateSendersList'),
-messageSends: ["class:", "ul", "updateSendersList"],
+args: ["anObject"],
+source: unescape('inspect%3A%20anObject%0A%09object%20%3A%3D%20anObject.%0A%09variables%20%3A%3D%20%23%28%29.%0A%09object%20inspectOn%3A%20self'),
+messageSends: ["inspectOn:"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_renderReferencedClassesOn_'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('renderReferencedClassesOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('label'),
+category: 'accessing',
+fn: function (){
 var self=this;
-(self['@referencedClassesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column referenced_classes"]));
-smalltalk.send(self, "_updateReferencedClassesList", []);
+return (($receiver = self['@label']) == nil || $receiver == undefined) ? (function(){return unescape("Inspector%20%28nil%29");})() : $receiver;
 return self;},
-args: ["html"],
-source: unescape('renderReferencedClassesOn%3A%20html%0A%09referencedClassesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20referenced_classes%27.%0A%09self%20updateReferencedClassesList'),
-messageSends: ["class:", "ul", "updateReferencedClassesList"],
+args: [],
+source: unescape('label%0A%09%5Elabel%20ifNil%3A%20%5B%27Inspector%20%28nil%29%27%5D'),
+messageSends: ["ifNil:"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_canBeClosed'),
+unescape('_refresh'),
 smalltalk.method({
-selector: unescape('canBeClosed'),
-category: 'testing',
+selector: unescape('refresh'),
+category: 'actions',
 fn: function (){
 var self=this;
-return true;
+(function($rec){smalltalk.send($rec, "_inspect_", [self['@object']]);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateValueTextarea", []);})(self);
 return self;},
 args: [],
-source: unescape('canBeClosed%0A%09%5Etrue'),
-messageSends: [],
+source: unescape('refresh%0A%09self%20%0A%09%09inspect%3A%20object%3B%20%0A%09%09updateVariablesList%3B%0A%09%09updateValueTextarea'),
+messageSends: ["inspect:", "updateVariablesList", "updateValueTextarea"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_updateImplementorsList'),
+unescape('_renderBottomPanelOn_'),
 smalltalk.method({
-selector: unescape('updateImplementorsList'),
-category: 'updating',
-fn: function (){
+selector: unescape('renderBottomPanelOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-smalltalk.send(self['@implementorsList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Implementors%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_implementors", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_implementors", []), "_do_", [(function(each){var li=nil;
-(li=smalltalk.send(html, "_li", []));return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(li);})]);})]);
+(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=(function($rec){smalltalk.send($rec, "_receiver_", [self['@object']]);smalltalk.send($rec, "_onDoIt_", [(function(){return smalltalk.send(self, "_refresh", []);})]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", [])));return smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
 return self;},
-args: [],
-source: unescape('updateImplementorsList%0A%20%20%20%20implementorsList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09html%20li%0A%09%09class%3A%20%27column_label%27%3B%20%0A%09%09with%3A%20%27Implementors%20%28%27%2C%20self%20implementors%20size%20asString%2C%20%27%29%27%3B%0A%09%09style%3A%20%27font-weight%3A%20bold%27.%0A%09self%20implementors%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20li%0A%09%09with%3A%20%28each%20methodClass%20asString%2C%20%27%20%3E%3E%20%27%2C%20self%20selector%29%3B%0A%09%09onClick%3A%20%5Bself%20openBrowserOn%3A%20each%5D%5D%5D'),
-messageSends: ["contents:", "class:", "with:", unescape("%2C"), "asString", "size", "implementors", "style:", "li", "do:", "methodClass", "selector", "onClick:", "openBrowserOn:"],
-referencedClasses: []
+args: ["html"],
+source: unescape('renderBottomPanelOn%3A%20html%0A%20%20%20%20html%20div%0A%09class%3A%20%27jt_sourceCode%27%3B%0A%09with%3A%20%5B%0A%09%20%20%20%20sourceArea%20%3A%3D%20SourceArea%20new%0A%09%09receiver%3A%20object%3B%0A%09%09onDoIt%3A%20%5Bself%20refresh%5D%3B%0A%09%09yourself.%0A%20%20%20%20%20%20%20%20%20%20%20%20sourceArea%20renderOn%3A%20html%5D'),
+messageSends: ["class:", "with:", "receiver:", "onDoIt:", "refresh", "yourself", "new", "renderOn:", "div"],
+referencedClasses: ["SourceArea"]
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_updateSendersList'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('updateSendersList'),
-category: 'updating',
-fn: function (){
+selector: unescape('renderBoxOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-smalltalk.send(self['@sendersList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Senders%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_senders", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_senders", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);})]);
+(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
 return self;},
-args: [],
-source: unescape('updateSendersList%0A%09sendersList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09html%20li%0A%09%09class%3A%20%27column_label%27%3B%20%0A%09%09with%3A%20%27Senders%20%28%27%2C%20self%20senders%20size%20asString%2C%20%27%29%27%3B%0A%09%09style%3A%20%27font-weight%3A%20bold%27.%0A%09self%20senders%20do%3A%20%5B%3Aeach%20%7C%0A%09%09html%20li%0A%09%09%09with%3A%20%28each%20methodClass%20asString%2C%20%27%20%3E%3E%20%27%2C%20each%20selector%29%3B%0A%09%09%09onClick%3A%20%5Bself%20openBrowserOn%3A%20each%5D%5D%5D'),
-messageSends: ["contents:", "class:", "with:", unescape("%2C"), "asString", "size", "senders", "style:", "li", "do:", "methodClass", "selector", "onClick:", "openBrowserOn:"],
+args: ["html"],
+source: unescape('renderBoxOn%3A%20html%0A%09self%20%0A%09%09renderTopPanelOn%3A%20html%3B%0A%09%09renderBottomPanelOn%3A%20html'),
+messageSends: ["renderTopPanelOn:", "renderBottomPanelOn:"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_updateReferencedClassesList'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('updateReferencedClassesList'),
-category: 'updating',
-fn: function (){
+selector: unescape('renderButtonsOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-smalltalk.send(self['@referencedClassesList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Class%20references%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);})]);
+(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
+smalltalk.send(self, "_updateButtons", []);
 return self;},
-args: [],
-source: unescape('updateReferencedClassesList%0A%09referencedClassesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09html%20li%0A%09%09class%3A%20%27column_label%27%3B%20%0A%09%09with%3A%20%27Class%20references%20%28%27%2C%20self%20referencedClasses%20size%20asString%2C%20%27%29%27%3B%0A%09%09style%3A%20%27font-weight%3A%20bold%27.%0A%09self%20referencedClasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%09html%20li%0A%09%09%09with%3A%20%28each%20methodClass%20asString%2C%20%27%20%3E%3E%20%27%2C%20each%20selector%29%3B%0A%09%09%09onClick%3A%20%5Bself%20openBrowserOn%3A%20each%5D%5D%5D'),
-messageSends: ["contents:", "class:", "with:", unescape("%2C"), "asString", "size", "referencedClasses", "style:", "li", "do:", "methodClass", "selector", "onClick:", "openBrowserOn:"],
+args: ["html"],
+source: unescape('renderButtonsOn%3A%20html%0A%09html%20button%20%0A%09%09with%3A%20%27DoIt%27%3B%0A%09%09onClick%3A%20%5Bself%20sourceArea%20doIt%5D.%0A%09html%20button%20%0A%09%09with%3A%20%27PrintIt%27%3B%0A%09%09onClick%3A%20%5Bself%20sourceArea%20printIt%5D.%0A%09html%20button%20%0A%09%09with%3A%20%27InspectIt%27%3B%0A%09%09onClick%3A%20%5Bself%20sourceArea%20inspectIt%5D.%0A%09self%20updateButtons'),
+messageSends: ["with:", "onClick:", "doIt", "sourceArea", "button", "printIt", "inspectIt", "updateButtons"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser);
+smalltalk.Inspector);
 
+smalltalk.addMethod(
+unescape('_renderTopPanelOn_'),
+smalltalk.method({
+selector: unescape('renderTopPanelOn%3A'),
+category: 'rendering',
+fn: function (html){
+var self=this;
+(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(self['@variablesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column variables"]));(self['@valueTextarea']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column value"]);return smalltalk.send($rec, "_at_put_", ["readonly", "readonly"]);})(smalltalk.send(html, "_textarea", [])));(function($rec){smalltalk.send($rec, "_class_", ["jt_tabs inspector"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_class_", ["jt_button inspector refresh"]);smalltalk.send($rec, "_with_", ["Refresh"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_refresh", []);})]);})(smalltalk.send(html, "_button", []));return (self['@diveButton']=(function($rec){smalltalk.send($rec, "_class_", ["jt_button inspector dive"]);smalltalk.send($rec, "_with_", ["Dive"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_dive", []);})]);})(smalltalk.send(html, "_button", [])));})]);})(smalltalk.send(html, "_div", []));return smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_clear"]);})]);})(smalltalk.send(html, "_div", []));
+(function($rec){smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateValueTextarea", []);})(self);
+return self;},
+args: ["html"],
+source: unescape('renderTopPanelOn%3A%20html%0A%09html%20div%20%0A%09%09class%3A%20%27top%27%3B%20%0A%09%09with%3A%20%5B%0A%09%09%09variablesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20variables%27.%0A%09%09%09valueTextarea%20%3A%3D%20html%20textarea%20class%3A%20%27jt_column%20value%27%3B%20at%3A%20%27readonly%27%20put%3A%20%27readonly%27.%0A%09%09%09html%20div%20class%3A%20%27jt_tabs%20inspector%27%3B%20with%3A%20%5B%0A%09%09%09%09html%20button%0A%09%09%09%09%09class%3A%20%27jt_button%20inspector%20refresh%27%3B%0A%09%09%09%09%09with%3A%20%27Refresh%27%3B%0A%09%09%09%09%09onClick%3A%20%5Bself%20refresh%5D.%0A%09%09%09%09diveButton%20%3A%3D%20html%20button%20%0A%09%09%09%09%09class%3A%20%27jt_button%20inspector%20dive%27%3B%0A%09%09%09%09%09with%3A%20%27Dive%27%3B%20%0A%09%09%09%09%09onClick%3A%20%5Bself%20dive%5D%5D.%0A%09%09%09html%20div%20class%3A%20%27jt_clear%27%5D.%0A%09self%0A%09%09updateVariablesList%3B%0A%09%09updateValueTextarea.'),
+messageSends: ["class:", "with:", "ul", "at:put:", "textarea", "onClick:", "refresh", "button", "dive", "div", "updateVariablesList", "updateValueTextarea"],
+referencedClasses: []
+}),
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_search_'),
+unescape('_selectVariable_'),
 smalltalk.method({
-selector: unescape('search%3A'),
-category: 'instance creation',
+selector: unescape('selectVariable%3A'),
+category: 'updating',
 fn: function (aString){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);return smalltalk.send($rec, "_open", []);})(smalltalk.send(self, "_new", []));
+smalltalk.send(self, "_selectedVariable_", [aString]);
+(function($rec){smalltalk.send($rec, "_updateVariablesList", []);smalltalk.send($rec, "_updateValueTextarea", []);return smalltalk.send($rec, "_updateButtons", []);})(self);
 return self;},
 args: ["aString"],
-source: unescape('search%3A%20aString%0A%09%5Eself%20new%0A%09%09searchReferencesFor%3A%20aString%3B%0A%09%09open'),
-messageSends: ["searchReferencesFor:", "open", "new"],
+source: unescape('selectVariable%3A%20aString%0A%09self%20selectedVariable%3A%20aString.%0A%09self%20%0A%09%09updateVariablesList%3B%0A%09%09updateValueTextarea%3B%0A%09%09updateButtons'),
+messageSends: ["selectedVariable:", "updateVariablesList", "updateValueTextarea", "updateButtons"],
 referencedClasses: []
 }),
-smalltalk.ReferencesBrowser.klass);
-
+smalltalk.Inspector);
 
-smalltalk.addClass('Debugger', smalltalk.TabWidget, ['error', 'selectedContext', 'sourceArea', 'ul', 'ul2', 'inspector', 'saveButton', 'unsavedChanges', 'selectedVariable', 'selectedVariableName', 'inspectButton'], 'IDE');
 smalltalk.addMethod(
-unescape('_error'),
+unescape('_selectedVariable'),
 smalltalk.method({
-selector: unescape('error'),
+selector: unescape('selectedVariable'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@error'];
+return self['@selectedVariable'];
 return self;},
 args: [],
-source: unescape('error%0A%09%5Eerror'),
+source: unescape('selectedVariable%0A%09%5EselectedVariable'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_error_'),
+unescape('_selectedVariable_'),
 smalltalk.method({
-selector: unescape('error%3A'),
+selector: unescape('selectedVariable%3A'),
 category: 'accessing',
-fn: function (anError){
+fn: function (aString){
 var self=this;
-(self['@error']=anError);
+(self['@selectedVariable']=aString);
 return self;},
-args: ["anError"],
-source: unescape('error%3A%20anError%0A%09error%20%3A%3D%20anError'),
+args: ["aString"],
+source: unescape('selectedVariable%3A%20aString%0A%09selectedVariable%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_setLabel_'),
 smalltalk.method({
-selector: unescape('label'),
+selector: unescape('setLabel%3A'),
 category: 'accessing',
-fn: function (){
+fn: function (aString){
 var self=this;
-return unescape("%5BDebugger%5D");
+(self['@label']=aString);
 return self;},
-args: [],
-source: unescape('label%0A%09%5E%27%5BDebugger%5D%27'),
+args: ["aString"],
+source: unescape('setLabel%3A%20aString%0A%09label%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_setVariables_'),
 smalltalk.method({
-selector: unescape('source'),
+selector: unescape('setVariables%3A'),
 category: 'accessing',
-fn: function (){
+fn: function (aCollection){
 var self=this;
-return (($receiver = smalltalk.send(self, "_method", [])) == nil || $receiver == undefined) ? (function(){return unescape("Method%20doesn%27t%20exist%21");})() : (function(){return smalltalk.send(smalltalk.send(self, "_method", []), "_source", []);})();
+(self['@variables']=aCollection);
 return self;},
-args: [],
-source: unescape('source%0A%09%5Eself%20method%20%0A%09%09ifNil%3A%20%5B%27Method%20doesn%27%27t%20exist%21%27%5D%0A%09%09ifNotNil%3A%20%5Bself%20method%20source%5D'),
-messageSends: ["ifNil:ifNotNil:", "method", "source"],
+args: ["aCollection"],
+source: unescape('setVariables%3A%20aCollection%0A%09variables%20%3A%3D%20aCollection'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_method'),
+unescape('_sourceArea'),
 smalltalk.method({
-selector: unescape('method'),
+selector: unescape('sourceArea'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_methodAt_", [smalltalk.send(self['@selectedContext'], "_selector", [])]);
+return self['@sourceArea'];
 return self;},
 args: [],
-source: unescape('method%0A%09%5EselectedContext%20receiver%20class%20methodAt%3A%20selectedContext%20selector'),
-messageSends: ["methodAt:", "class", "receiver", "selector"],
+source: unescape('sourceArea%0A%09%5EsourceArea'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_arguments'),
+unescape('_updateButtons'),
 smalltalk.method({
-selector: unescape('arguments'),
-category: 'accessing',
+selector: unescape('updateButtons'),
+category: 'updating',
 fn: function (){
 var self=this;
-return (($receiver = smalltalk.send(self, "_method", [])) == nil || $receiver == undefined) ? (function(){return smalltalk.send(smalltalk.send(self['@selectedContext'], "_temps", []), "_collect_", [(function(each){return nil;})]);})() : (function(){return smalltalk.send(smalltalk.send(self, "_method", []), "_arguments", []);})();
+((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "_notNil", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_notNil", []);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@diveButton'], "_at_put_", ["disabled", true]);})() : (function(){return smalltalk.send(self['@diveButton'], "_removeAt_", ["disabled"]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@diveButton'], "_at_put_", ["disabled", true]);}), (function(){return smalltalk.send(self['@diveButton'], "_removeAt_", ["disabled"]);})]));
 return self;},
 args: [],
-source: unescape('arguments%0A%09%5Eself%20method%20%0A%09%09ifNil%3A%20%5BselectedContext%20temps%20collect%3A%20%5B%3Aeach%20%7C%20nil%5D%5D%0A%09%09ifNotNil%3A%20%5Bself%20method%20arguments%5D'),
-messageSends: ["ifNil:ifNotNil:", "method", "collect:", "temps", "arguments"],
+source: unescape('updateButtons%0A%09%28self%20selectedVariable%20notNil%20and%3A%20%5B%28self%20variables%20at%3A%20self%20selectedVariable%29%20notNil%5D%29%0A%09%09ifFalse%3A%20%5BdiveButton%20at%3A%20%27disabled%27%20put%3A%20true%5D%20%0A%09%09ifTrue%3A%20%5BdiveButton%20removeAt%3A%20%27disabled%27%5D'),
+messageSends: ["ifFalse:ifTrue:", "and:", "notNil", "selectedVariable", "at:", "variables", "at:put:", "removeAt:"],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_receiver'),
+unescape('_updateValueTextarea'),
 smalltalk.method({
-selector: unescape('receiver'),
-category: 'accessing',
+selector: unescape('updateValueTextarea'),
+category: 'updating',
 fn: function (){
 var self=this;
-return smalltalk.send(self['@selectedContext'], "_receiver", []);
+smalltalk.send(smalltalk.send(self['@valueTextarea'], "_asJQuery", []), "_val_", [((($receiver = smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "_isNil", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "";})() : (function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_printString", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "";}), (function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_at_", [smalltalk.send(self, "_selectedVariable", [])]), "_printString", []);})]))]);
 return self;},
 args: [],
-source: unescape('receiver%0A%09%5EselectedContext%20receiver'),
-messageSends: ["receiver"],
-referencedClasses: []
-}),
-smalltalk.Debugger);
-
-smalltalk.addMethod(
-unescape('_selectContext_'),
-smalltalk.method({
-selector: unescape('selectContext%3A'),
-category: 'actions',
-fn: function (aContext){
-var self=this;
-(self['@selectedContext']=aContext);
-(self['@selectedVariable']=nil);
-(self['@selectedVariableName']=nil);
-(function($rec){smalltalk.send($rec, "_updateContextsList", []);smalltalk.send($rec, "_updateSourceArea", []);smalltalk.send($rec, "_updateInspector", []);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateStatus", []);})(self);
-return self;},
-args: ["aContext"],
-source: unescape('selectContext%3A%20aContext%0A%09selectedContext%20%3A%3D%20aContext.%0A%09selectedVariable%20%3A%3D%20nil.%0A%09selectedVariableName%20%3A%3D%20nil.%0A%09self%20%0A%09%09updateContextsList%3B%0A%09%09updateSourceArea%3B%0A%09%09updateInspector%3B%0A%09%09updateVariablesList%3B%0A%09%09updateStatus'),
-messageSends: ["updateContextsList", "updateSourceArea", "updateInspector", "updateVariablesList", "updateStatus"],
+source: unescape('updateValueTextarea%0A%09valueTextarea%20asJQuery%20val%3A%20%28self%20selectedVariable%20isNil%0A%09%09ifTrue%3A%20%5B%27%27%5D%0A%09%09ifFalse%3A%20%5B%28self%20variables%20at%3A%20self%20selectedVariable%29%20printString%5D%29'),
+messageSends: ["val:", "asJQuery", "ifTrue:ifFalse:", "isNil", "selectedVariable", "printString", "at:", "variables"],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_proceed'),
+unescape('_updateVariablesList'),
 smalltalk.method({
-selector: unescape('proceed'),
-category: 'actions',
+selector: unescape('updateVariablesList'),
+category: 'updating',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_close", []);
-smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_perform_withArguments_", [smalltalk.send(self['@selectedContext'], "_selector", []), smalltalk.send(self['@selectedContext'], "_temps", [])]);
+smalltalk.send(self['@variablesList'], "_contents_", [(function(html){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_variables", []), "_keys", []), "_do_", [(function(each){var li=nil;
+(li=smalltalk.send(html, "_li", []));(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_", [each]);})]);})(li);return ((($receiver = smalltalk.send(smalltalk.send(self, "_selectedVariable", []), "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);})]);
 return self;},
 args: [],
-source: unescape('proceed%0A%09self%20close.%0A%09selectedContext%20receiver%20perform%3A%20selectedContext%20selector%20withArguments%3A%20selectedContext%20temps'),
-messageSends: ["close", "perform:withArguments:", "receiver", "selector", "temps"],
+source: unescape('updateVariablesList%0A%09variablesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09self%20variables%20keys%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%09%09li%20%3A%3D%20html%20li.%0A%09%09%09li%0A%09%09%09%09with%3A%20each%3B%0A%09%09%09%09onClick%3A%20%5Bself%20selectVariable%3A%20each%5D.%0A%09%09%09self%20selectedVariable%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09%09%09li%20class%3A%20%27selected%27%5D%5D%5D'),
+messageSends: ["contents:", "do:", "keys", "variables", "li", "with:", "onClick:", "selectVariable:", "ifTrue:", unescape("%3D"), "selectedVariable", "class:"],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.Inspector);
 
 smalltalk.addMethod(
-unescape('_save'),
+unescape('_variables'),
 smalltalk.method({
-selector: unescape('save'),
-category: 'actions',
+selector: unescape('variables'),
+category: 'accessing',
 fn: function (){
 var self=this;
-var protocol=nil;
-(protocol=smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_methodDictionary", []), "_at_", [smalltalk.send(self['@selectedContext'], "_selector", [])]), "_category", []));
-smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_compile_category_", [smalltalk.send(self['@sourceArea'], "_val", []), protocol]);
-smalltalk.send(self, "_updateStatus", []);
+return self['@variables'];
 return self;},
 args: [],
-source: unescape('save%0A%09%7C%20protocol%20%7C%0A%09protocol%20%3A%3D%20%28selectedContext%20receiver%20class%20methodDictionary%20at%3A%20selectedContext%20selector%29%20category.%0A%09selectedContext%20receiver%20class%20compile%3A%20sourceArea%20val%20category%3A%20protocol.%0A%09self%20updateStatus'),
-messageSends: ["category", "at:", "methodDictionary", "class", "receiver", "selector", "compile:category:", "val", "updateStatus"],
+source: unescape('variables%0A%09%5Evariables'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.Inspector);
 
-smalltalk.addMethod(
-unescape('_selectVariable_named_'),
-smalltalk.method({
-selector: unescape('selectVariable%3Anamed%3A'),
-category: 'actions',
-fn: function (anObject, aString){
-var self=this;
-(self['@selectedVariable']=anObject);
-(self['@selectedVariableName']=aString);
-smalltalk.send(self['@inspector'], "_contents_", [(function(html){return smalltalk.send(html, "_with_", [smalltalk.send(anObject, "_printString", [])]);})]);
-smalltalk.send(self, "_updateVariablesList", []);
-return self;},
-args: ["anObject", "aString"],
-source: unescape('selectVariable%3A%20anObject%20named%3A%20aString%0A%09selectedVariable%20%3A%3D%20anObject.%0A%09selectedVariableName%20%3A%3D%20aString.%0A%09inspector%20contents%3A%20%5B%3Ahtml%20%7C%20html%20with%3A%20anObject%20printString%5D.%0A%09self%20updateVariablesList'),
-messageSends: ["contents:", "with:", "printString", "updateVariablesList"],
-referencedClasses: []
-}),
-smalltalk.Debugger);
 
 smalltalk.addMethod(
-unescape('_inspectSelectedVariable'),
+unescape('_on_'),
 smalltalk.method({
-selector: unescape('inspectSelectedVariable'),
-category: 'actions',
-fn: function (){
+selector: unescape('on%3A'),
+category: 'instance creation',
+fn: function (anObject){
 var self=this;
-smalltalk.send(self['@selectedVariable'], "_inspect", []);
+return (function($rec){smalltalk.send($rec, "_inspect_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-args: [],
-source: unescape('inspectSelectedVariable%0A%09selectedVariable%20inspect'),
-messageSends: ["inspect"],
+args: ["anObject"],
+source: unescape('on%3A%20anObject%0A%09%5Eself%20new%0A%09%09inspect%3A%20anObject%3B%0A%09%09yourself'),
+messageSends: ["inspect:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.Inspector.klass);
 
+
+smalltalk.addClass('ProgressBar', smalltalk.TabWidget, ['percent', 'progressDiv', 'div'], 'IDE');
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_percent'),
 smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
+selector: unescape('percent'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
-smalltalk.send(self['@unsavedChanges'], "__eq", [false]);
+return (($receiver = self['@percent']) == nil || $receiver == undefined) ? (function(){return (0);})() : $receiver;
 return self;},
 args: [],
-source: unescape('initialize%0A%09super%20initialize.%0A%09unsavedChanges%20%3D%20false'),
-messageSends: ["initialize", unescape("%3D")],
-referencedClasses: []
-}),
-smalltalk.Debugger);
-
-smalltalk.addMethod(
-unescape('_renderTopPanelOn_'),
-smalltalk.method({
-selector: unescape('renderTopPanelOn%3A'),
-category: 'rendering',
-fn: function (html){
-var self=this;
-(self['@selectedContext']=smalltalk.send(smalltalk.send(self, "_error", []), "_context", []));
-(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_class_", ["label"]);return smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(self, "_error", []), "_messageText", [])]);})(smalltalk.send(html, "_div", []));return (self['@ul']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column debugger contexts"]);return smalltalk.send($rec, "_with_", [(function(){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(smalltalk.send(self, "_error", []), "_context", []), html]);})]);})(smalltalk.send(html, "_ul", [])));})]);})(smalltalk.send(html, "_div", []));
-return self;},
-args: ["html"],
-source: unescape('renderTopPanelOn%3A%20html%0A%09selectedContext%20%3A%3D%20self%20error%20context.%0A%09html%20div%20%0A%09%09class%3A%20%27top%27%3B%20%0A%09%09with%3A%20%5B%0A%09%09%09html%20div%20%0A%09%09%09%09class%3A%20%27label%27%3B%0A%09%09%09%09with%3A%20self%20error%20messageText.%0A%09%09%09ul%20%3A%3D%20html%20ul%20%0A%09%09%09%09class%3A%20%27jt_column%20debugger%20contexts%27%3B%0A%09%09%09%09with%3A%20%5Bself%20renderContext%3A%20self%20error%20context%20on%3A%20html%5D%5D'),
-messageSends: ["context", "error", "class:", "with:", "messageText", "div", "renderContext:on:", "ul"],
+source: unescape('percent%0A%09%5Epercent%20ifNil%3A%20%5B0%5D'),
+messageSends: ["ifNil:"],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.ProgressBar);
 
 smalltalk.addMethod(
-unescape('_renderContext_on_'),
+unescape('_percent_'),
 smalltalk.method({
-selector: unescape('renderContext%3Aon%3A'),
-category: 'rendering',
-fn: function (aContext, html){
+selector: unescape('percent%3A'),
+category: 'accessing',
+fn: function (aNumber){
 var self=this;
-var li=nil;
-(li=smalltalk.send(html, "_li", []));
-((($receiver = smalltalk.send(self['@selectedContext'], "__eq", [aContext])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));
-(function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(aContext, "_asString", [])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectContext_", [aContext]);})]);})(li);
-(($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(aContext, "_home", []), html]);})() : nil;
+(self['@percent']=aNumber);
 return self;},
-args: ["aContext", "html"],
-source: unescape('renderContext%3A%20aContext%20on%3A%20html%0A%09%7C%20li%20%7C%0A%09li%20%3A%3D%20html%20li.%0A%09selectedContext%20%3D%20aContext%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09li%20%0A%09%09with%3A%20aContext%20asString%3B%0A%09%09onClick%3A%20%5Bself%20selectContext%3A%20aContext%5D.%0A%09aContext%20home%20ifNotNil%3A%20%5Bself%20renderContext%3A%20aContext%20home%20on%3A%20html%5D'),
-messageSends: ["li", "ifTrue:", unescape("%3D"), "class:", "with:", "asString", "onClick:", "selectContext:", "ifNotNil:", "home", "renderContext:on:"],
+args: ["aNumber"],
+source: unescape('percent%3A%20aNumber%0A%09percent%20%3A%3D%20aNumber'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.ProgressBar);
 
 smalltalk.addMethod(
-unescape('_renderBottomPanelOn_'),
+unescape('_renderOn_'),
 smalltalk.method({
-selector: unescape('renderBottomPanelOn%3A'),
+selector: unescape('renderOn%3A'),
 category: 'rendering',
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode debugger"]);return smalltalk.send($rec, "_with_", [(function(){(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));return smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
-(self['@ul2']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column debugger variables"]));
-(self['@inspector']=smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_column debugger inspector"]));
-smalltalk.send(self['@sourceArea'], "_onKeyUp_", [(function(){return smalltalk.send(self, "_updateStatus", []);})]);
+(self['@div']=(function($rec){smalltalk.send($rec, "_class_", ["progress_bar"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_div", [])));
+smalltalk.send(self, "_renderProgressBar", []);
 return self;},
 args: ["html"],
-source: unescape('renderBottomPanelOn%3A%20html%0A%09html%20div%0A%09%09class%3A%20%27jt_sourceCode%20debugger%27%3B%0A%09%09with%3A%20%5B%0A%09%09%09sourceArea%20%3A%3D%20SourceArea%20new.%0A%09%09%09sourceArea%20renderOn%3A%20html%5D.%0A%09ul2%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20debugger%20variables%27.%0A%09inspector%20%3A%3D%20html%20div%20class%3A%20%27jt_column%20debugger%20inspector%27.%0A%09sourceArea%0A%09%09onKeyUp%3A%20%5Bself%20updateStatus%5D'),
-messageSends: ["class:", "with:", "new", "renderOn:", "div", "ul", "onKeyUp:", "updateStatus"],
-referencedClasses: ["SourceArea"]
+source: unescape('renderOn%3A%20html%20%0A%09div%20%3A%3D%20html%20div%20%0A%09%09class%3A%20%27progress_bar%27%3B%0A%09%09yourself.%0A%09self%20renderProgressBar'),
+messageSends: ["class:", "yourself", "div", "renderProgressBar"],
+referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.ProgressBar);
 
 smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
+unescape('_renderProgressBar'),
 smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
+selector: unescape('renderProgressBar'),
 category: 'rendering',
-fn: function (html){
+fn: function (){
 var self=this;
-(self['@saveButton']=(function($rec){smalltalk.send($rec, "_with_", ["Save"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_save", []);})]);})(smalltalk.send(html, "_button", [])));
-(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["Proceed"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_proceed", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", ["Abandon"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_close", []);})]);})(smalltalk.send(html, "_button", []));
-(self['@inspectButton']=(function($rec){smalltalk.send($rec, "_class_", ["jt_button debugger inspect"]);smalltalk.send($rec, "_with_", ["Inspect"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_inspectSelectedVariable", []);})]);})(smalltalk.send(html, "_button", [])));
-(function($rec){smalltalk.send($rec, "_updateSourceArea", []);smalltalk.send($rec, "_updateStatus", []);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateInspector", []);})(self);
+smalltalk.send(self['@div'], "_contents_", [(function(html){return (function($rec){smalltalk.send($rec, "_class_", ["progress"]);return smalltalk.send($rec, "_style_", [smalltalk.send(smalltalk.send("width:", "__comma", [smalltalk.send(smalltalk.send(self, "_percent", []), "_asString", [])]), "__comma", [unescape("%25")])]);})(smalltalk.send(html, "_div", []));})]);
 return self;},
-args: ["html"],
-source: unescape('renderButtonsOn%3A%20html%0A%09saveButton%20%3A%3D%20html%20button%0A%09%09with%3A%20%27Save%27%3B%0A%09%09onClick%3A%20%5Bself%20save%5D.%0A%09html%20button%0A%09%09with%3A%20%27DoIt%27%3B%0A%09%09onClick%3A%20%5BsourceArea%20doIt%5D.%0A%09html%20button%0A%09%09with%3A%20%27PrintIt%27%3B%0A%09%09onClick%3A%20%5BsourceArea%20printIt%5D.%0A%09html%20button%0A%09%09with%3A%20%27InspectIt%27%3B%0A%09%09onClick%3A%20%5BsourceArea%20inspectIt%5D.%0A%09html%20button%20%0A%09%09with%3A%20%27Proceed%27%3B%0A%09%09onClick%3A%20%5Bself%20proceed%5D.%0A%09html%20button%0A%09%09with%3A%20%27Abandon%27%3B%0A%09%09onClick%3A%20%5Bself%20close%5D.%0A%09inspectButton%20%3A%3D%20html%20button%0A%09%09class%3A%20%27jt_button%20debugger%20inspect%27%3B%0A%09%09with%3A%20%27Inspect%27%3B%0A%09%09onClick%3A%20%5Bself%20inspectSelectedVariable%5D.%0A%09%20self%20%0A%09%09updateSourceArea%3B%0A%09%09updateStatus%3B%0A%09%09updateVariablesList%3B%0A%09%09updateInspector'),
-messageSends: ["with:", "onClick:", "save", "button", "doIt", "printIt", "inspectIt", "proceed", "close", "class:", "inspectSelectedVariable", "updateSourceArea", "updateStatus", "updateVariablesList", "updateInspector"],
+args: [],
+source: unescape('renderProgressBar%0A%09div%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09html%20div%20%0A%09%09%09class%3A%20%27progress%27%3B%0A%09%09%09style%3A%20%27width%3A%27%2C%20self%20percent%20asString%2C%20%27%25%27%5D'),
+messageSends: ["contents:", "class:", "style:", unescape("%2C"), "asString", "percent", "div"],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.ProgressBar);
 
 smalltalk.addMethod(
-unescape('_renderBoxOn_'),
+unescape('_updatePercent_'),
 smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('updatePercent%3A'),
+category: 'updating',
+fn: function (aNumber){
 var self=this;
-(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
+smalltalk.send(self, "_percent_", [aNumber]);
+smalltalk.send(self, "_renderProgressBar", []);
 return self;},
-args: ["html"],
-source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20self%20%0A%09renderTopPanelOn%3A%20html%3B%0A%09renderBottomPanelOn%3A%20html'),
-messageSends: ["renderTopPanelOn:", "renderBottomPanelOn:"],
+args: ["aNumber"],
+source: unescape('updatePercent%3A%20aNumber%0A%09self%20percent%3A%20aNumber.%0A%09self%20renderProgressBar'),
+messageSends: ["percent:", "renderProgressBar"],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.ProgressBar);
+
+
 
+smalltalk.addClass('ReferencesBrowser', smalltalk.TabWidget, ['implementors', 'senders', 'implementorsList', 'input', 'timer', 'selector', 'sendersList', 'referencedClasses', 'referencedClassesList'], 'IDE');
 smalltalk.addMethod(
 unescape('_canBeClosed'),
 smalltalk.method({
@@ -3808,435 +3657,494 @@ var self=this;
 return true;
 return self;},
 args: [],
-source: unescape('canBeClosed%0A%20%20%20%20%5Etrue'),
+source: unescape('canBeClosed%0A%09%5Etrue'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_updateContextsList'),
+unescape('_classesAndMetaclasses'),
 smalltalk.method({
-selector: unescape('updateContextsList'),
-category: 'updating',
+selector: unescape('classesAndMetaclasses'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self['@ul'], "_contents_", [(function(html){return smalltalk.send(self, "_renderContext_on_", [smalltalk.send(smalltalk.send(self, "_error", []), "_context", []), html]);})]);
+return smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_classes", []), "_collect_", [(function(each){return smalltalk.send(each, "_class", []);})])]);
 return self;},
 args: [],
-source: unescape('updateContextsList%0A%09ul%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09self%20renderContext%3A%20self%20error%20context%20on%3A%20html%5D'),
-messageSends: ["contents:", "renderContext:on:", "context", "error"],
-referencedClasses: []
+source: unescape('classesAndMetaclasses%0A%09%5ESmalltalk%20current%20classes%2C%20%28Smalltalk%20current%20classes%20collect%3A%20%5B%3Aeach%20%7C%20each%20class%5D%29'),
+messageSends: [unescape("%2C"), "classes", "current", "collect:", "class"],
+referencedClasses: ["Smalltalk"]
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_updateSourceArea'),
+unescape('_implementors'),
 smalltalk.method({
-selector: unescape('updateSourceArea'),
-category: 'updating',
+selector: unescape('implementors'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_val_", [smalltalk.send(self, "_source", [])]);
+return (($receiver = self['@implementors']) == nil || $receiver == undefined) ? (function(){return (self['@implementors']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;},
 args: [],
-source: unescape('updateSourceArea%0A%09%20sourceArea%20val%3A%20self%20source'),
-messageSends: ["val:", "source"],
-referencedClasses: []
+source: unescape('implementors%0A%09%5Eimplementors%20ifNil%3A%20%5Bimplementors%20%3A%3D%20Array%20new%5D'),
+messageSends: ["ifNil:", "new"],
+referencedClasses: ["Array"]
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_updateStatus'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('updateStatus'),
-category: 'updating',
+selector: unescape('initialize'),
+category: 'initialization',
 fn: function (){
 var self=this;
-((($receiver = smalltalk.send(smalltalk.send(self['@sourceArea'], "_val", []), "__eq", [smalltalk.send(self, "_source", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);})() : (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return (self['@unsavedChanges']=false);}), (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return (self['@unsavedChanges']=true);})]));
+smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
+(self['@selector']="");
 return self;},
 args: [],
-source: unescape('updateStatus%0A%09sourceArea%20val%20%3D%20self%20source%0A%09%09ifTrue%3A%20%5B%0A%09%09%09saveButton%20ifNotNil%3A%20%5B%0A%09%09%09%09saveButton%20at%3A%20%27disabled%27%20put%3A%20true%5D.%0A%09%09%09unsavedChanges%20%3A%3D%20false%5D%0A%09%09ifFalse%3A%20%5B%0A%09%09%09saveButton%20ifNotNil%3A%20%5B%0A%09%09%09%09saveButton%20removeAt%3A%20%27disabled%27%5D.%0A%09%09%09unsavedChanges%20%3A%3D%20true%5D'),
-messageSends: ["ifTrue:ifFalse:", unescape("%3D"), "val", "source", "ifNotNil:", "at:put:", "removeAt:"],
+source: unescape('initialize%0A%09super%20initialize.%0A%09selector%20%3A%3D%20%27%27'),
+messageSends: ["initialize"],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_updateInspector'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('updateInspector'),
-category: 'updating',
+selector: unescape('label'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self['@inspector'], "_contents_", [(function(html){return nil;})]);
+return unescape("%5BReferences%5D");
 return self;},
 args: [],
-source: unescape('updateInspector%0A%09inspector%20contents%3A%20%5B%3Ahtml%20%7C%5D'),
-messageSends: ["contents:"],
+source: unescape('label%0A%09%5E%27%5BReferences%5D%27'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_updateVariablesList'),
+unescape('_openBrowserOn_'),
 smalltalk.method({
-selector: unescape('updateVariablesList'),
-category: 'updating',
+selector: unescape('openBrowserOn%3A'),
+category: 'actions',
+fn: function (aMethod){
+var self=this;
+var browser=nil;
+(browser=smalltalk.send((smalltalk.Browser || Browser), "_openOn_", [((($receiver = smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_instanceClass", []);})() : (function(){return smalltalk.send(aMethod, "_methodClass", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_instanceClass", []);}), (function(){return smalltalk.send(aMethod, "_methodClass", []);})]))]));
+((($receiver = smalltalk.send(smalltalk.send(aMethod, "_methodClass", []), "_isMetaclass", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(browser, "_selectTab_", [smalltalk.symbolFor("class")]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(browser, "_selectTab_", [smalltalk.symbolFor("class")]);})]));
+(function($rec){smalltalk.send($rec, "_selectProtocol_", [smalltalk.send(aMethod, "_category", [])]);return smalltalk.send($rec, "_selectMethod_", [aMethod]);})(browser);
+return self;},
+args: ["aMethod"],
+source: unescape('openBrowserOn%3A%20aMethod%0A%20%20%20%20%20%20%20%7C%20browser%20%7C%0A%20%20%20%20%20%20%20browser%20%3A%3D%20Browser%20openOn%3A%20%28aMethod%20methodClass%20isMetaclass%20%0A%09%09ifTrue%3A%20%5BaMethod%20methodClass%20instanceClass%5D%20ifFalse%3A%20%5BaMethod%20methodClass%5D%29.%0A%20%20%20%20%20%20%20aMethod%20methodClass%20isMetaclass%20ifTrue%3A%20%5Bbrowser%20selectTab%3A%20%23class%5D.%0A%20%20%20%20%20%20%20browser%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectProtocol%3A%20aMethod%20category%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectMethod%3A%20aMethod'),
+messageSends: ["openOn:", "ifTrue:ifFalse:", "isMetaclass", "methodClass", "instanceClass", "ifTrue:", "selectTab:", "selectProtocol:", "category", "selectMethod:"],
+referencedClasses: ["Browser"]
+}),
+smalltalk.ReferencesBrowser);
+
+smalltalk.addMethod(
+unescape('_referencedClasses'),
+smalltalk.method({
+selector: unescape('referencedClasses'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self['@ul2'], "_contents_", [(function(html){var li=nil;
-(li=(function($rec){smalltalk.send($rec, "_with_", ["self"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [smalltalk.send(self, "_receiver", []), "self"]);})]);})(smalltalk.send(html, "_li", [])));((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", ["self"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));smalltalk.send(smalltalk.send(self, "_arguments", []), "_withIndexDo_", [(function(each, index){var param=nil;
-(param=smalltalk.send(smalltalk.send(self['@selectedContext'], "_temps", []), "_at_", [index]));(li=(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [param, each]);})]);})(smalltalk.send(html, "_li", [])));return ((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_allInstanceVariableNames", []), "_do_", [(function(each){var ivar=nil;
-(ivar=smalltalk.send(smalltalk.send(self, "_receiver", []), "_instVarAt_", [each]));(li=(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [ivar, each]);})]);})(smalltalk.send(html, "_li", [])));return ((($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]));})]);})]);
-(($receiver = self['@selectedVariable']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self['@inspectButton'], "_at_put_", ["disabled", true]);})() : (function(){return smalltalk.send(self['@inspectButton'], "_removeAt_", ["disabled"]);})();
+return (($receiver = self['@referencedClasses']) == nil || $receiver == undefined) ? (function(){return (self['@referencedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;},
 args: [],
-source: unescape('updateVariablesList%0A%09ul2%20contents%3A%20%5B%3Ahtml%20%7C%20%7C%20li%20%7C%0A%09%09li%20%3A%3D%20html%20li%20%0A%09%09%09with%3A%20%27self%27%3B%0A%09%09%09onClick%3A%20%5Bself%20selectVariable%3A%20self%20receiver%20named%3A%20%27self%27%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectedVariableName%20%3D%20%27self%27%20ifTrue%3A%20%5B%0A%09%09%09li%20class%3A%20%27selected%27%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20arguments%20withIndexDo%3A%20%5B%3Aeach%20%3Aindex%20%7C%20%7C%20param%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20param%20%3A%3D%20selectedContext%20temps%20at%3A%20index.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20li%20%3A%3D%20html%20li%20%0A%09%09%09%09with%3A%20each%3B%0A%09%09%09%09onClick%3A%20%5Bself%20selectVariable%3A%20param%20named%3A%20each%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectedVariableName%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09%09%09li%20class%3A%20%27selected%27%5D%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%20receiver%20class%20allInstanceVariableNames%20do%3A%20%5B%3Aeach%20%7C%20%7C%20ivar%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ivar%20%3A%3D%20self%20receiver%20instVarAt%3A%20each.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20li%20%3A%3D%20html%20li%20%0A%09%09%09%09with%3A%20each%3B%0A%09%09%09%09onClick%3A%20%5Bself%20selectVariable%3A%20ivar%20named%3A%20each%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectedVariableName%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09%09%09li%20class%3A%20%27selected%27%5D%5D%5D.%0A%09selectedVariable%20ifNil%3A%20%5BinspectButton%20at%3A%20%27disabled%27%20put%3A%20true%5D%20ifNotNil%3A%20%5BinspectButton%20removeAt%3A%20%27disabled%27%5D'),
-messageSends: ["contents:", "with:", "onClick:", "selectVariable:named:", "receiver", "li", "ifTrue:", unescape("%3D"), "class:", "withIndexDo:", "arguments", "at:", "temps", "do:", "allInstanceVariableNames", "class", "instVarAt:", "ifNil:ifNotNil:", "at:put:", "removeAt:"],
+source: unescape('referencedClasses%0A%09%5EreferencedClasses%20ifNil%3A%20%5BreferencedClasses%20%3A%3D%20Array%20new%5D'),
+messageSends: ["ifNil:", "new"],
+referencedClasses: ["Array"]
+}),
+smalltalk.ReferencesBrowser);
+
+smalltalk.addMethod(
+unescape('_renderBoxOn_'),
+smalltalk.method({
+selector: unescape('renderBoxOn%3A'),
+category: 'rendering',
+fn: function (html){
+var self=this;
+(function($rec){smalltalk.send($rec, "_renderInputOn_", [html]);smalltalk.send($rec, "_renderImplementorsOn_", [html]);smalltalk.send($rec, "_renderSendersOn_", [html]);return smalltalk.send($rec, "_renderReferencedClassesOn_", [html]);})(self);
+return self;},
+args: ["html"],
+source: unescape('renderBoxOn%3A%20html%0A%09self%20%0A%09%09renderInputOn%3A%20html%3B%0A%09%09renderImplementorsOn%3A%20html%3B%0A%09%09renderSendersOn%3A%20html%3B%0A%09%09renderReferencedClassesOn%3A%20html'),
+messageSends: ["renderInputOn:", "renderImplementorsOn:", "renderSendersOn:", "renderReferencedClassesOn:"],
 referencedClasses: []
 }),
-smalltalk.Debugger);
+smalltalk.ReferencesBrowser);
+
+smalltalk.addMethod(
+unescape('_renderImplementorsOn_'),
+smalltalk.method({
+selector: unescape('renderImplementorsOn%3A'),
+category: 'rendering',
+fn: function (html){
+var self=this;
+(self['@implementorsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column implementors"]));
+smalltalk.send(self, "_updateImplementorsList", []);
+return self;},
+args: ["html"],
+source: unescape('renderImplementorsOn%3A%20html%0A%09implementorsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20implementors%27.%0A%09self%20updateImplementorsList'),
+messageSends: ["class:", "ul", "updateImplementorsList"],
+referencedClasses: []
+}),
+smalltalk.ReferencesBrowser);
 
+smalltalk.addMethod(
+unescape('_renderInputOn_'),
+smalltalk.method({
+selector: unescape('renderInputOn%3A'),
+category: 'rendering',
+fn: function (html){
+var self=this;
+(self['@input']=(function($rec){smalltalk.send($rec, "_class_", ["implementors"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_input", [])));
+smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val_", [self['@selector']]);
+smalltalk.send(self, "_setInputEvents", []);
+return self;},
+args: ["html"],
+source: unescape('renderInputOn%3A%20html%0A%09input%20%3A%3D%20html%20input%20%0A%09%09class%3A%20%27implementors%27%3B%0A%09%09yourself.%0A%09input%20asJQuery%20val%3A%20selector.%0A%09self%20setInputEvents'),
+messageSends: ["class:", "yourself", "input", "val:", "asJQuery", "setInputEvents"],
+referencedClasses: []
+}),
+smalltalk.ReferencesBrowser);
 
+smalltalk.addMethod(
+unescape('_renderReferencedClassesOn_'),
+smalltalk.method({
+selector: unescape('renderReferencedClassesOn%3A'),
+category: 'rendering',
+fn: function (html){
+var self=this;
+(self['@referencedClassesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column referenced_classes"]));
+smalltalk.send(self, "_updateReferencedClassesList", []);
+return self;},
+args: ["html"],
+source: unescape('renderReferencedClassesOn%3A%20html%0A%09referencedClassesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20referenced_classes%27.%0A%09self%20updateReferencedClassesList'),
+messageSends: ["class:", "ul", "updateReferencedClassesList"],
+referencedClasses: []
+}),
+smalltalk.ReferencesBrowser);
 
-smalltalk.addClass('ProgressBar', smalltalk.TabWidget, ['percent', 'progressDiv', 'div'], 'IDE');
 smalltalk.addMethod(
-unescape('_percent'),
+unescape('_renderSendersOn_'),
 smalltalk.method({
-selector: unescape('percent'),
-category: 'accessing',
-fn: function (){
+selector: unescape('renderSendersOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-return (($receiver = self['@percent']) == nil || $receiver == undefined) ? (function(){return (0);})() : $receiver;
+(self['@sendersList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column senders"]));
+smalltalk.send(self, "_updateSendersList", []);
 return self;},
-args: [],
-source: unescape('percent%0A%09%5Epercent%20ifNil%3A%20%5B0%5D'),
-messageSends: ["ifNil:"],
+args: ["html"],
+source: unescape('renderSendersOn%3A%20html%0A%09sendersList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20senders%27.%0A%09self%20updateSendersList'),
+messageSends: ["class:", "ul", "updateSendersList"],
 referencedClasses: []
 }),
-smalltalk.ProgressBar);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_percent_'),
+unescape('_search_'),
 smalltalk.method({
-selector: unescape('percent%3A'),
-category: 'accessing',
-fn: function (aNumber){
+selector: unescape('search%3A'),
+category: 'actions',
+fn: function (aString){
 var self=this;
-(self['@percent']=aNumber);
+(function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);smalltalk.send($rec, "_updateImplementorsList", []);smalltalk.send($rec, "_updateSendersList", []);return smalltalk.send($rec, "_updateReferencedClassesList", []);})(self);
 return self;},
-args: ["aNumber"],
-source: unescape('percent%3A%20aNumber%0A%09percent%20%3A%3D%20aNumber'),
-messageSends: [],
+args: ["aString"],
+source: unescape('search%3A%20aString%0A%09self%20%0A%09%09searchReferencesFor%3A%20aString%3B%0A%09%09updateImplementorsList%3B%0A%09%09updateSendersList%3B%0A%09%09updateReferencedClassesList'),
+messageSends: ["searchReferencesFor:", "updateImplementorsList", "updateSendersList", "updateReferencedClassesList"],
 referencedClasses: []
 }),
-smalltalk.ProgressBar);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_renderOn_'),
+unescape('_searchReferencedClassesFor_'),
 smalltalk.method({
-selector: unescape('renderOn%3A'),
-category: 'rendering',
-fn: function (html){
+selector: unescape('searchReferencedClassesFor%3A'),
+category: 'actions',
+fn: function (aString){
 var self=this;
-(self['@div']=(function($rec){smalltalk.send($rec, "_class_", ["progress_bar"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_div", [])));
-smalltalk.send(self, "_renderProgressBar", []);
+smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_values", []), "_do_", [(function(value){return ((($receiver = smalltalk.send(smalltalk.send(value, "_referencedClasses", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})]));})]);})]);
 return self;},
-args: ["html"],
-source: unescape('renderOn%3A%20html%20%0A%09div%20%3A%3D%20html%20div%20%0A%09%09class%3A%20%27progress_bar%27%3B%0A%09%09yourself.%0A%09self%20renderProgressBar'),
-messageSends: ["class:", "yourself", "div", "renderProgressBar"],
+args: ["aString"],
+source: unescape('searchReferencedClassesFor%3A%20aString%0A%09self%20classesAndMetaclasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%09each%20methodDictionary%20values%20do%3A%20%5B%3Avalue%20%7C%0A%09%09%09%28value%20referencedClasses%20includes%3A%20selector%29%20ifTrue%3A%20%5B%0A%09%09%09%09self%20referencedClasses%20add%3A%20value%5D%5D%5D'),
+messageSends: ["do:", "classesAndMetaclasses", "values", "methodDictionary", "ifTrue:", "includes:", "referencedClasses", "add:"],
 referencedClasses: []
 }),
-smalltalk.ProgressBar);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_renderProgressBar'),
+unescape('_searchReferencesFor_'),
 smalltalk.method({
-selector: unescape('renderProgressBar'),
-category: 'rendering',
-fn: function (){
+selector: unescape('searchReferencesFor%3A'),
+category: 'actions',
+fn: function (aString){
 var self=this;
-smalltalk.send(self['@div'], "_contents_", [(function(html){return (function($rec){smalltalk.send($rec, "_class_", ["progress"]);return smalltalk.send($rec, "_style_", [smalltalk.send(smalltalk.send("width:", "__comma", [smalltalk.send(smalltalk.send(self, "_percent", []), "_asString", [])]), "__comma", [unescape("%25")])]);})(smalltalk.send(html, "_div", []));})]);
+(self['@selector']=aString);
+(self['@implementors']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+(self['@senders']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+(self['@referencedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+((($receiver = smalltalk.send(self['@selector'], "_match_", [unescape("%5E%5BA-Z%5D")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);})() : (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);}), (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})]));
 return self;},
-args: [],
-source: unescape('renderProgressBar%0A%09div%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09html%20div%20%0A%09%09%09class%3A%20%27progress%27%3B%0A%09%09%09style%3A%20%27width%3A%27%2C%20self%20percent%20asString%2C%20%27%25%27%5D'),
-messageSends: ["contents:", "class:", "style:", unescape("%2C"), "asString", "percent", "div"],
-referencedClasses: []
+args: ["aString"],
+source: unescape('searchReferencesFor%3A%20aString%0A%09selector%20%3A%3D%20aString.%0A%09implementors%20%3A%3D%20Array%20new.%0A%09senders%20%3A%3D%20Array%20new.%0A%09referencedClasses%20%3A%3D%20Array%20new.%0A%09%28selector%20match%3A%20%27%5E%5BA-Z%5D%27%29%20%0A%09%09ifFalse%3A%20%5Bself%20searchSelectorReferencesFor%3A%20selector%5D%0A%09%09ifTrue%3A%20%5Bself%20searchReferencedClassesFor%3A%20selector%5D'),
+messageSends: ["new", "ifFalse:ifTrue:", "match:", "searchSelectorReferencesFor:", "searchReferencedClassesFor:"],
+referencedClasses: ["Array"]
 }),
-smalltalk.ProgressBar);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_updatePercent_'),
+unescape('_searchSelectorReferencesFor_'),
 smalltalk.method({
-selector: unescape('updatePercent%3A'),
-category: 'updating',
-fn: function (aNumber){
+selector: unescape('searchSelectorReferencesFor%3A'),
+category: 'actions',
+fn: function (aString){
 var self=this;
-smalltalk.send(self, "_percent_", [aNumber]);
-smalltalk.send(self, "_renderProgressBar", []);
+smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_keysAndValuesDo_", [(function(key, value){((($receiver = smalltalk.send(key, "__eq", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})]));return ((($receiver = smalltalk.send(smalltalk.send(value, "_messageSends", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})]));})]);})]);
 return self;},
-args: ["aNumber"],
-source: unescape('updatePercent%3A%20aNumber%0A%09self%20percent%3A%20aNumber.%0A%09self%20renderProgressBar'),
-messageSends: ["percent:", "renderProgressBar"],
+args: ["aString"],
+source: unescape('searchSelectorReferencesFor%3A%20aString%0A%09self%20classesAndMetaclasses%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09each%20methodDictionary%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%20%0A%09%09%09key%20%3D%20selector%20ifTrue%3A%20%5Bself%20implementors%20add%3A%20value%5D.%0A%09%09%09%28value%20messageSends%20includes%3A%20selector%29%20ifTrue%3A%20%5B%0A%09%09%09%09self%20senders%20add%3A%20value%5D%5D%5D'),
+messageSends: ["do:", "classesAndMetaclasses", "keysAndValuesDo:", "methodDictionary", "ifTrue:", unescape("%3D"), "add:", "implementors", "includes:", "messageSends", "senders"],
 referencedClasses: []
 }),
-smalltalk.ProgressBar);
-
-
+smalltalk.ReferencesBrowser);
 
-smalltalk.addClass('TestRunner', smalltalk.TabWidget, ['selectedCategories', 'packagesList', 'selectedClasses', 'classesList', 'selectedMethods', 'progressBar', 'methodsList', 'result', 'statusDiv'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('label'),
+selector: unescape('selector'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return "SUnit";
+return self['@selector'];
 return self;},
 args: [],
-source: unescape('label%0A%20%20%20%20%5E%27SUnit%27'),
+source: unescape('selector%0A%09%5Eselector'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.TestRunner);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_packages'),
+unescape('_senders'),
 smalltalk.method({
-selector: unescape('packages'),
+selector: unescape('senders'),
 category: 'accessing',
 fn: function (){
 var self=this;
-var packages=nil;
-(packages=smalltalk.send((smalltalk.Array || Array), "_new", []));
-smalltalk.send(smalltalk.send(self, "_allClasses", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(packages, "_includes_", [smalltalk.send(each, "_category", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})]));})]);
-return smalltalk.send(packages, "_sort", []);
+return (($receiver = self['@senders']) == nil || $receiver == undefined) ? (function(){return (self['@senders']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
 return self;},
 args: [],
-source: unescape('packages%0A%20%20%20%20%7C%20packages%20%7C%0A%20%20%20%20packages%20%3A%3D%20Array%20new.%0A%20%20%20%20self%20allClasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%28packages%20includes%3A%20each%20category%29%20ifFalse%3A%20%5B%0A%09%20%20%20%20packages%20add%3A%20each%20category%5D%5D.%0A%20%20%20%20%5Epackages%20sort'),
-messageSends: ["new", "do:", "allClasses", "ifFalse:", "includes:", "category", "add:", "sort"],
+source: unescape('senders%0A%09%5Esenders%20ifNil%3A%20%5Bsenders%20%3A%3D%20Array%20new%5D'),
+messageSends: ["ifNil:", "new"],
 referencedClasses: ["Array"]
 }),
-smalltalk.TestRunner);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_classes'),
+unescape('_setInputEvents'),
 smalltalk.method({
-selector: unescape('classes'),
-category: 'accessing',
+selector: unescape('setInputEvents'),
+category: 'private',
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(self, "_allClasses", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [smalltalk.send(each, "_category", [])]);})]), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_name", [])).klass === smalltalk.Number) ? $receiver >smalltalk.send(b, "_name", []) : smalltalk.send($receiver, "__gt", [smalltalk.send(b, "_name", [])]));})]);
+(function($rec){smalltalk.send($rec, "_onKeyUp_", [(function(){return (self['@timer']=smalltalk.send((function(){return smalltalk.send(self, "_search_", [smalltalk.send(smalltalk.send(self['@input'], "_asJQuery", []), "_val", [])]);}), "_valueWithTimeout_", [(100)]));})]);return smalltalk.send($rec, "_onKeyDown_", [(function(){return (($receiver = self['@timer']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@timer'], "_clearTimeout", []);})() : nil;})]);})(self['@input']);
 return self;},
 args: [],
-source: unescape('classes%0A%20%20%20%20%5E%28self%20allClasses%20%0A%09select%3A%20%5B%3Aeach%20%7C%20self%20selectedCategories%20includes%3A%20each%20category%5D%29%0A%09sort%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20name%20%3E%20b%20name%5D'),
-messageSends: ["sort:", "select:", "allClasses", "includes:", "selectedCategories", "category", unescape("%3E"), "name"],
+source: unescape('setInputEvents%0A%09input%0A%09%09onKeyUp%3A%20%5Btimer%20%3A%3D%20%5Bself%20search%3A%20input%20asJQuery%20val%5D%20valueWithTimeout%3A%20100%5D%3B%0A%09%09onKeyDown%3A%20%5Btimer%20ifNotNil%3A%20%5Btimer%20clearTimeout%5D%5D'),
+messageSends: ["onKeyUp:", "valueWithTimeout:", "search:", "val", "asJQuery", "onKeyDown:", "ifNotNil:", "clearTimeout"],
 referencedClasses: []
 }),
-smalltalk.TestRunner);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_selectedCategories'),
+unescape('_updateImplementorsList'),
 smalltalk.method({
-selector: unescape('selectedCategories'),
-category: 'accessing',
+selector: unescape('updateImplementorsList'),
+category: 'updating',
 fn: function (){
 var self=this;
-return (($receiver = self['@selectedCategories']) == nil || $receiver == undefined) ? (function(){return (self['@selectedCategories']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+smalltalk.send(self['@implementorsList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Implementors%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_implementors", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_implementors", []), "_do_", [(function(each){var li=nil;
+(li=smalltalk.send(html, "_li", []));return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(li);})]);})]);
 return self;},
 args: [],
-source: unescape('selectedCategories%0A%09%5EselectedCategories%20ifNil%3A%20%5BselectedCategories%20%3A%3D%20Array%20new%5D'),
-messageSends: ["ifNil:", "new"],
-referencedClasses: ["Array"]
+source: unescape('updateImplementorsList%0A%20%20%20%20implementorsList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09html%20li%0A%09%09class%3A%20%27column_label%27%3B%20%0A%09%09with%3A%20%27Implementors%20%28%27%2C%20self%20implementors%20size%20asString%2C%20%27%29%27%3B%0A%09%09style%3A%20%27font-weight%3A%20bold%27.%0A%09self%20implementors%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20li%0A%09%09with%3A%20%28each%20methodClass%20asString%2C%20%27%20%3E%3E%20%27%2C%20self%20selector%29%3B%0A%09%09onClick%3A%20%5Bself%20openBrowserOn%3A%20each%5D%5D%5D'),
+messageSends: ["contents:", "class:", "with:", unescape("%2C"), "asString", "size", "implementors", "style:", "li", "do:", "methodClass", "selector", "onClick:", "openBrowserOn:"],
+referencedClasses: []
 }),
-smalltalk.TestRunner);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_allClasses'),
+unescape('_updateReferencedClassesList'),
 smalltalk.method({
-selector: unescape('allClasses'),
-category: 'accessing',
+selector: unescape('updateReferencedClassesList'),
+category: 'updating',
 fn: function (){
 var self=this;
-return smalltalk.send((smalltalk.TestCase || TestCase), "_allSubclasses", []);
+smalltalk.send(self['@referencedClassesList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Class%20references%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);})]);
 return self;},
 args: [],
-source: unescape('allClasses%0A%09%5ETestCase%20allSubclasses'),
-messageSends: ["allSubclasses"],
-referencedClasses: ["TestCase"]
+source: unescape('updateReferencedClassesList%0A%09referencedClassesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09html%20li%0A%09%09class%3A%20%27column_label%27%3B%20%0A%09%09with%3A%20%27Class%20references%20%28%27%2C%20self%20referencedClasses%20size%20asString%2C%20%27%29%27%3B%0A%09%09style%3A%20%27font-weight%3A%20bold%27.%0A%09self%20referencedClasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%09html%20li%0A%09%09%09with%3A%20%28each%20methodClass%20asString%2C%20%27%20%3E%3E%20%27%2C%20each%20selector%29%3B%0A%09%09%09onClick%3A%20%5Bself%20openBrowserOn%3A%20each%5D%5D%5D'),
+messageSends: ["contents:", "class:", "with:", unescape("%2C"), "asString", "size", "referencedClasses", "style:", "li", "do:", "methodClass", "selector", "onClick:", "openBrowserOn:"],
+referencedClasses: []
 }),
-smalltalk.TestRunner);
+smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_selectedClasses'),
+unescape('_updateSendersList'),
 smalltalk.method({
-selector: unescape('selectedClasses'),
-category: 'accessing',
+selector: unescape('updateSendersList'),
+category: 'updating',
 fn: function (){
 var self=this;
-return (($receiver = self['@selectedClasses']) == nil || $receiver == undefined) ? (function(){return (self['@selectedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+smalltalk.send(self['@sendersList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Senders%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_senders", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_senders", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);})]);
 return self;},
 args: [],
-source: unescape('selectedClasses%0A%09%5EselectedClasses%20%20ifNil%3A%20%5BselectedClasses%20%3A%3D%20Array%20new%5D'),
-messageSends: ["ifNil:", "new"],
-referencedClasses: ["Array"]
+source: unescape('updateSendersList%0A%09sendersList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09html%20li%0A%09%09class%3A%20%27column_label%27%3B%20%0A%09%09with%3A%20%27Senders%20%28%27%2C%20self%20senders%20size%20asString%2C%20%27%29%27%3B%0A%09%09style%3A%20%27font-weight%3A%20bold%27.%0A%09self%20senders%20do%3A%20%5B%3Aeach%20%7C%0A%09%09html%20li%0A%09%09%09with%3A%20%28each%20methodClass%20asString%2C%20%27%20%3E%3E%20%27%2C%20each%20selector%29%3B%0A%09%09%09onClick%3A%20%5Bself%20openBrowserOn%3A%20each%5D%5D%5D'),
+messageSends: ["contents:", "class:", "with:", unescape("%2C"), "asString", "size", "senders", "style:", "li", "do:", "methodClass", "selector", "onClick:", "openBrowserOn:"],
+referencedClasses: []
 }),
-smalltalk.TestRunner);
+smalltalk.ReferencesBrowser);
 
-smalltalk.addMethod(
-unescape('_progressBar'),
-smalltalk.method({
-selector: unescape('progressBar'),
-category: 'accessing',
-fn: function (){
-var self=this;
-return (($receiver = self['@progressBar']) == nil || $receiver == undefined) ? (function(){return (self['@progressBar']=smalltalk.send((smalltalk.ProgressBar || ProgressBar), "_new", []));})() : $receiver;
-return self;},
-args: [],
-source: unescape('progressBar%0A%09%5EprogressBar%20ifNil%3A%20%5BprogressBar%20%3A%3D%20ProgressBar%20new%5D'),
-messageSends: ["ifNil:", "new"],
-referencedClasses: ["ProgressBar"]
-}),
-smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_statusInfo'),
+unescape('_search_'),
 smalltalk.method({
-selector: unescape('statusInfo'),
-category: 'accessing',
-fn: function (){
+selector: unescape('search%3A'),
+category: 'instance creation',
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printTotal", []), "__comma", [smalltalk.send(self, "_printPasses", [])]), "__comma", [smalltalk.send(self, "_printErrors", [])]), "__comma", [smalltalk.send(self, "_printFailures", [])]);
+return (function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);return smalltalk.send($rec, "_open", []);})(smalltalk.send(self, "_new", []));
 return self;},
-args: [],
-source: unescape('statusInfo%0A%09%5Eself%20printTotal%2C%20self%20printPasses%2C%20self%20printErrors%2C%20self%20printFailures'),
-messageSends: [unescape("%2C"), "printTotal", "printPasses", "printErrors", "printFailures"],
+args: ["aString"],
+source: unescape('search%3A%20aString%0A%09%5Eself%20new%0A%09%09searchReferencesFor%3A%20aString%3B%0A%09%09open'),
+messageSends: ["searchReferencesFor:", "open", "new"],
 referencedClasses: []
 }),
-smalltalk.TestRunner);
+smalltalk.ReferencesBrowser.klass);
+
 
+smalltalk.addClass('TestRunner', smalltalk.TabWidget, ['selectedCategories', 'packagesList', 'selectedClasses', 'classesList', 'selectedMethods', 'progressBar', 'methodsList', 'result', 'statusDiv'], 'IDE');
 smalltalk.addMethod(
-unescape('_result'),
+unescape('_allClasses'),
 smalltalk.method({
-selector: unescape('result'),
+selector: unescape('allClasses'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@result'];
+return smalltalk.send((smalltalk.TestCase || TestCase), "_allSubclasses", []);
 return self;},
 args: [],
-source: unescape('result%0A%09%5Eresult'),
-messageSends: [],
-referencedClasses: []
+source: unescape('allClasses%0A%09%5ETestCase%20allSubclasses'),
+messageSends: ["allSubclasses"],
+referencedClasses: ["TestCase"]
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_testCases'),
+unescape('_classes'),
 smalltalk.method({
-selector: unescape('testCases'),
+selector: unescape('classes'),
 category: 'accessing',
 fn: function (){
 var self=this;
-var testCases=nil;
-(testCases=[]);
-smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_do_", [(function(each){return smalltalk.send(testCases, "_addAll_", [smalltalk.send(each, "_buildSuite", [])]);})]);
-return testCases;
+return smalltalk.send(smalltalk.send(smalltalk.send(self, "_allClasses", []), "_select_", [(function(each){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [smalltalk.send(each, "_category", [])]);})]), "_sort_", [(function(a, b){return ((($receiver = smalltalk.send(a, "_name", [])).klass === smalltalk.Number) ? $receiver >smalltalk.send(b, "_name", []) : smalltalk.send($receiver, "__gt", [smalltalk.send(b, "_name", [])]));})]);
 return self;},
 args: [],
-source: unescape('testCases%0A%09%7C%20testCases%20%7C%0A%09testCases%20%3A%3D%20%23%28%29.%0A%09self%20selectedClasses%20do%3A%20%5B%3Aeach%20%7C%20testCases%20addAll%3A%20each%20buildSuite%5D.%0A%09%5EtestCases'),
-messageSends: ["do:", "selectedClasses", "addAll:", "buildSuite"],
+source: unescape('classes%0A%20%20%20%20%5E%28self%20allClasses%20%0A%09select%3A%20%5B%3Aeach%20%7C%20self%20selectedCategories%20includes%3A%20each%20category%5D%29%0A%09sort%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20name%20%3E%20b%20name%5D'),
+messageSends: ["sort:", "select:", "allClasses", "includes:", "selectedCategories", "category", unescape("%3E"), "name"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_selectAllCategories'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('selectAllCategories'),
-category: 'actions',
+selector: unescape('initialize'),
+category: 'initialization',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_packages", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(self['@selectedCategories'], "_includes_", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_add_", [each]);})]));})]);
-(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
+(self['@result']=smalltalk.send((smalltalk.TestResult || TestResult), "_new", []));
 return self;},
 args: [],
-source: unescape('selectAllCategories%0A%09self%20packages%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%28selectedCategories%20includes%3A%20each%29%20ifFalse%3A%20%5B%0A%09%09%09self%20selectedCategories%20add%3A%20each%5D%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
-messageSends: ["do:", "packages", "ifFalse:", "includes:", "add:", "selectedCategories", "updateCategoriesList", "updateClassesList"],
-referencedClasses: []
+source: unescape('initialize%0A%09super%20initialize.%0A%09result%20%3A%3D%20TestResult%20new'),
+messageSends: ["initialize", "new"],
+referencedClasses: ["TestResult"]
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_toggleCategory_'),
+unescape('_isSelectedCategory_'),
 smalltalk.method({
-selector: unescape('toggleCategory%3A'),
-category: 'actions',
+selector: unescape('isSelectedCategory%3A'),
+category: 'testing',
 fn: function (aCategory){
 var self=this;
-((($receiver = smalltalk.send(self, "_isSelectedCategory_", [aCategory])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@selectedCategories'], "_add_", [aCategory]);})() : (function(){return smalltalk.send(self['@selectedCategories'], "_remove_", [aCategory]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedCategories'], "_add_", [aCategory]);}), (function(){return smalltalk.send(self['@selectedCategories'], "_remove_", [aCategory]);})]));
-(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [aCategory]);
 return self;},
 args: ["aCategory"],
-source: unescape('toggleCategory%3A%20aCategory%0A%09%28self%20isSelectedCategory%3A%20aCategory%29%20%0A%09%09ifFalse%3A%20%5BselectedCategories%20add%3A%20aCategory%5D%0A%09%09ifTrue%3A%20%5BselectedCategories%20remove%3A%20aCategory%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
-messageSends: ["ifFalse:ifTrue:", "isSelectedCategory:", "add:", "remove:", "updateCategoriesList", "updateClassesList"],
+source: unescape('isSelectedCategory%3A%20aCategory%0A%09%5E%28self%20selectedCategories%20includes%3A%20aCategory%29'),
+messageSends: ["includes:", "selectedCategories"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_toggleClass_'),
+unescape('_isSelectedClass_'),
 smalltalk.method({
-selector: unescape('toggleClass%3A'),
-category: 'actions',
+selector: unescape('isSelectedClass%3A'),
+category: 'testing',
 fn: function (aClass){
 var self=this;
-((($receiver = smalltalk.send(self, "_isSelectedClass_", [aClass])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@selectedClasses'], "_add_", [aClass]);})() : (function(){return smalltalk.send(self['@selectedClasses'], "_remove_", [aClass]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedClasses'], "_add_", [aClass]);}), (function(){return smalltalk.send(self['@selectedClasses'], "_remove_", [aClass]);})]));
-smalltalk.send(self, "_updateClassesList", []);
+return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_includes_", [aClass]);
 return self;},
 args: ["aClass"],
-source: unescape('toggleClass%3A%20aClass%0A%09%28self%20isSelectedClass%3A%20aClass%29%20%0A%09%09ifFalse%3A%20%5BselectedClasses%20add%3A%20aClass%5D%0A%09%09ifTrue%3A%20%5BselectedClasses%20remove%3A%20aClass%5D.%0A%09self%20%0A%09%20%20%20%20updateClassesList'),
-messageSends: ["ifFalse:ifTrue:", "isSelectedClass:", "add:", "remove:", "updateClassesList"],
+source: unescape('isSelectedClass%3A%20aClass%0A%09%5E%28self%20selectedClasses%20includes%3A%20aClass%29'),
+messageSends: ["includes:", "selectedClasses"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_selectAllClasses'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('selectAllClasses'),
-category: 'actions',
+selector: unescape('label'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_classes", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(self['@selectedClasses'], "_includes_", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_add_", [each]);})]));})]);
-(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+return "SUnit";
 return self;},
 args: [],
-source: unescape('selectAllClasses%0A%09self%20classes%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%28selectedClasses%20includes%3A%20each%29%20ifFalse%3A%20%5B%0A%09%09%09self%20selectedClasses%20add%3A%20each%5D%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
-messageSends: ["do:", "classes", "ifFalse:", "includes:", "add:", "selectedClasses", "updateCategoriesList", "updateClassesList"],
+source: unescape('label%0A%20%20%20%20%5E%27SUnit%27'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_run_'),
+unescape('_packages'),
 smalltalk.method({
-selector: unescape('run%3A'),
-category: 'actions',
-fn: function (aCollection){
+selector: unescape('packages'),
+category: 'accessing',
+fn: function (){
 var self=this;
-(self['@result']=smalltalk.send((smalltalk.TestResult || TestResult), "_new", []));
-(function($rec){smalltalk.send($rec, "_updateStatusDiv", []);return smalltalk.send($rec, "_updateMethodsList", []);})(self);
-smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [(0)]);
-smalltalk.send(self['@result'], "_total_", [smalltalk.send(aCollection, "_size", [])]);
-smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send((function(){smalltalk.send(each, "_runCaseFor_", [self['@result']]);smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [((($receiver = ((($receiver = smalltalk.send(self['@result'], "_runs", [])).klass === smalltalk.Number) ? $receiver /smalltalk.send(self['@result'], "_total", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(self['@result'], "_total", [])]))).klass === smalltalk.Number) ? $receiver *(100) : smalltalk.send($receiver, "__star", [(100)]))]);smalltalk.send(self, "_updateStatusDiv", []);return smalltalk.send(self, "_updateMethodsList", []);}), "_valueWithTimeout_", [(100)]);})]);
+var packages=nil;
+(packages=smalltalk.send((smalltalk.Array || Array), "_new", []));
+smalltalk.send(smalltalk.send(self, "_allClasses", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(packages, "_includes_", [smalltalk.send(each, "_category", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(packages, "_add_", [smalltalk.send(each, "_category", [])]);})]));})]);
+return smalltalk.send(packages, "_sort", []);
 return self;},
-args: ["aCollection"],
-source: unescape('run%3A%20aCollection%0A%09result%20%3A%3D%20TestResult%20new.%0A%09self%20%0A%09%09updateStatusDiv%3B%0A%09%09updateMethodsList.%0A%09self%20progressBar%20updatePercent%3A%200.%0A%09result%20total%3A%20aCollection%20size.%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%5Beach%20runCaseFor%3A%20result.%0A%09%09self%20progressBar%20updatePercent%3A%20result%20runs%20/%20result%20total%20*%20100.%0A%09%09self%20updateStatusDiv.%0A%09%09self%20updateMethodsList%5D%20valueWithTimeout%3A%20100%5D.'),
-messageSends: ["new", "updateStatusDiv", "updateMethodsList", "updatePercent:", "progressBar", "total:", "size", "do:", "valueWithTimeout:", "runCaseFor:", unescape("*"), unescape("/"), "runs", "total"],
-referencedClasses: ["TestResult"]
+args: [],
+source: unescape('packages%0A%20%20%20%20%7C%20packages%20%7C%0A%20%20%20%20packages%20%3A%3D%20Array%20new.%0A%20%20%20%20self%20allClasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%28packages%20includes%3A%20each%20category%29%20ifFalse%3A%20%5B%0A%09%20%20%20%20packages%20add%3A%20each%20category%5D%5D.%0A%20%20%20%20%5Epackages%20sort'),
+messageSends: ["new", "do:", "allClasses", "ifFalse:", "includes:", "category", "add:", "sort"],
+referencedClasses: ["Array"]
 }),
 smalltalk.TestRunner);
 
@@ -4256,23 +4164,6 @@ referencedClasses: []
 }),
 smalltalk.TestRunner);
 
-smalltalk.addMethod(
-unescape('_initialize'),
-smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
-fn: function (){
-var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
-(self['@result']=smalltalk.send((smalltalk.TestResult || TestResult), "_new", []));
-return self;},
-args: [],
-source: unescape('initialize%0A%09super%20initialize.%0A%09result%20%3A%3D%20TestResult%20new'),
-messageSends: ["initialize", "new"],
-referencedClasses: ["TestResult"]
-}),
-smalltalk.TestRunner);
-
 smalltalk.addMethod(
 unescape('_printErrors'),
 smalltalk.method({
@@ -4337,6 +4228,22 @@ referencedClasses: []
 }),
 smalltalk.TestRunner);
 
+smalltalk.addMethod(
+unescape('_progressBar'),
+smalltalk.method({
+selector: unescape('progressBar'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return (($receiver = self['@progressBar']) == nil || $receiver == undefined) ? (function(){return (self['@progressBar']=smalltalk.send((smalltalk.ProgressBar || ProgressBar), "_new", []));})() : $receiver;
+return self;},
+args: [],
+source: unescape('progressBar%0A%09%5EprogressBar%20ifNil%3A%20%5BprogressBar%20%3A%3D%20ProgressBar%20new%5D'),
+messageSends: ["ifNil:", "new"],
+referencedClasses: ["ProgressBar"]
+}),
+smalltalk.TestRunner);
+
 smalltalk.addMethod(
 unescape('_renderBoxOn_'),
 smalltalk.method({
@@ -4404,21 +4311,17 @@ referencedClasses: []
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_renderResultsOn_'),
+unescape('_renderErrorsOn_'),
 smalltalk.method({
-selector: unescape('renderResultsOn%3A'),
+selector: unescape('renderErrorsOn%3A'),
 category: 'rendering',
 fn: function (html){
 var self=this;
-(self['@statusDiv']=smalltalk.send(html, "_div", []));
-smalltalk.send(html, "_with_", [smalltalk.send(self, "_progressBar", [])]);
-(self['@methodsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit results"]));
-smalltalk.send(self, "_updateMethodsList", []);
-smalltalk.send(self, "_updateStatusDiv", []);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["errors"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_class", []), "_name", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_performFailure_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);
 return self;},
 args: ["html"],
-source: unescape('renderResultsOn%3A%20html%0A%09statusDiv%20%3A%3D%20html%20div.%0A%09html%20with%3A%20self%20progressBar.%0A%09methodsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20sunit%20results%27.%0A%09self%20updateMethodsList.%0A%09self%20updateStatusDiv'),
-messageSends: ["div", "with:", "progressBar", "class:", "ul", "updateMethodsList", "updateStatusDiv"],
+source: unescape('renderErrorsOn%3A%20html%0A%09self%20result%20errors%20do%3A%20%5B%3Aeach%20%7C%0A%09%09html%20li%20%0A%09%09%09class%3A%20%27errors%27%3B%0A%09%09%09with%3A%20each%20class%20name%2C%20%27%20%3E%3E%20%27%2C%20each%20selector%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onClick%3A%20%5Bself%20performFailure%3A%20each%5D%5D'),
+messageSends: ["do:", "errors", "result", "class:", "with:", unescape("%2C"), "name", "class", "selector", "onClick:", "performFailure:", "li"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
@@ -4440,49 +4343,192 @@ referencedClasses: []
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_renderErrorsOn_'),
+unescape('_renderResultsOn_'),
 smalltalk.method({
-selector: unescape('renderErrorsOn%3A'),
+selector: unescape('renderResultsOn%3A'),
 category: 'rendering',
 fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["errors"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_class", []), "_name", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_performFailure_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);
+(self['@statusDiv']=smalltalk.send(html, "_div", []));
+smalltalk.send(html, "_with_", [smalltalk.send(self, "_progressBar", [])]);
+(self['@methodsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit results"]));
+smalltalk.send(self, "_updateMethodsList", []);
+smalltalk.send(self, "_updateStatusDiv", []);
 return self;},
 args: ["html"],
-source: unescape('renderErrorsOn%3A%20html%0A%09self%20result%20errors%20do%3A%20%5B%3Aeach%20%7C%0A%09%09html%20li%20%0A%09%09%09class%3A%20%27errors%27%3B%0A%09%09%09with%3A%20each%20class%20name%2C%20%27%20%3E%3E%20%27%2C%20each%20selector%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onClick%3A%20%5Bself%20performFailure%3A%20each%5D%5D'),
-messageSends: ["do:", "errors", "result", "class:", "with:", unescape("%2C"), "name", "class", "selector", "onClick:", "performFailure:", "li"],
+source: unescape('renderResultsOn%3A%20html%0A%09statusDiv%20%3A%3D%20html%20div.%0A%09html%20with%3A%20self%20progressBar.%0A%09methodsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20sunit%20results%27.%0A%09self%20updateMethodsList.%0A%09self%20updateStatusDiv'),
+messageSends: ["div", "with:", "progressBar", "class:", "ul", "updateMethodsList", "updateStatusDiv"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_isSelectedClass_'),
+unescape('_result'),
 smalltalk.method({
-selector: unescape('isSelectedClass%3A'),
-category: 'testing',
-fn: function (aClass){
+selector: unescape('result'),
+category: 'accessing',
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_includes_", [aClass]);
+return self['@result'];
 return self;},
-args: ["aClass"],
-source: unescape('isSelectedClass%3A%20aClass%0A%09%5E%28self%20selectedClasses%20includes%3A%20aClass%29'),
-messageSends: ["includes:", "selectedClasses"],
+args: [],
+source: unescape('result%0A%09%5Eresult'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-unescape('_isSelectedCategory_'),
+unescape('_run_'),
+smalltalk.method({
+selector: unescape('run%3A'),
+category: 'actions',
+fn: function (aCollection){
+var self=this;
+(self['@result']=smalltalk.send((smalltalk.TestResult || TestResult), "_new", []));
+(function($rec){smalltalk.send($rec, "_updateStatusDiv", []);return smalltalk.send($rec, "_updateMethodsList", []);})(self);
+smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [(0)]);
+smalltalk.send(self['@result'], "_total_", [smalltalk.send(aCollection, "_size", [])]);
+smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send((function(){smalltalk.send(each, "_runCaseFor_", [self['@result']]);smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [((($receiver = ((($receiver = smalltalk.send(self['@result'], "_runs", [])).klass === smalltalk.Number) ? $receiver /smalltalk.send(self['@result'], "_total", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(self['@result'], "_total", [])]))).klass === smalltalk.Number) ? $receiver *(100) : smalltalk.send($receiver, "__star", [(100)]))]);smalltalk.send(self, "_updateStatusDiv", []);return smalltalk.send(self, "_updateMethodsList", []);}), "_valueWithTimeout_", [(100)]);})]);
+return self;},
+args: ["aCollection"],
+source: unescape('run%3A%20aCollection%0A%09result%20%3A%3D%20TestResult%20new.%0A%09self%20%0A%09%09updateStatusDiv%3B%0A%09%09updateMethodsList.%0A%09self%20progressBar%20updatePercent%3A%200.%0A%09result%20total%3A%20aCollection%20size.%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%5Beach%20runCaseFor%3A%20result.%0A%09%09self%20progressBar%20updatePercent%3A%20result%20runs%20/%20result%20total%20*%20100.%0A%09%09self%20updateStatusDiv.%0A%09%09self%20updateMethodsList%5D%20valueWithTimeout%3A%20100%5D.'),
+messageSends: ["new", "updateStatusDiv", "updateMethodsList", "updatePercent:", "progressBar", "total:", "size", "do:", "valueWithTimeout:", "runCaseFor:", unescape("*"), unescape("/"), "runs", "total"],
+referencedClasses: ["TestResult"]
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+unescape('_selectAllCategories'),
+smalltalk.method({
+selector: unescape('selectAllCategories'),
+category: 'actions',
+fn: function (){
+var self=this;
+smalltalk.send(smalltalk.send(self, "_packages", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(self['@selectedCategories'], "_includes_", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_add_", [each]);})]));})]);
+(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+return self;},
+args: [],
+source: unescape('selectAllCategories%0A%09self%20packages%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%28selectedCategories%20includes%3A%20each%29%20ifFalse%3A%20%5B%0A%09%09%09self%20selectedCategories%20add%3A%20each%5D%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
+messageSends: ["do:", "packages", "ifFalse:", "includes:", "add:", "selectedCategories", "updateCategoriesList", "updateClassesList"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+unescape('_selectAllClasses'),
+smalltalk.method({
+selector: unescape('selectAllClasses'),
+category: 'actions',
+fn: function (){
+var self=this;
+smalltalk.send(smalltalk.send(self, "_classes", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(self['@selectedClasses'], "_includes_", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_add_", [each]);})]));})]);
+(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+return self;},
+args: [],
+source: unescape('selectAllClasses%0A%09self%20classes%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%28selectedClasses%20includes%3A%20each%29%20ifFalse%3A%20%5B%0A%09%09%09self%20selectedClasses%20add%3A%20each%5D%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
+messageSends: ["do:", "classes", "ifFalse:", "includes:", "add:", "selectedClasses", "updateCategoriesList", "updateClassesList"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+unescape('_selectedCategories'),
+smalltalk.method({
+selector: unescape('selectedCategories'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return (($receiver = self['@selectedCategories']) == nil || $receiver == undefined) ? (function(){return (self['@selectedCategories']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return self;},
+args: [],
+source: unescape('selectedCategories%0A%09%5EselectedCategories%20ifNil%3A%20%5BselectedCategories%20%3A%3D%20Array%20new%5D'),
+messageSends: ["ifNil:", "new"],
+referencedClasses: ["Array"]
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+unescape('_selectedClasses'),
+smalltalk.method({
+selector: unescape('selectedClasses'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return (($receiver = self['@selectedClasses']) == nil || $receiver == undefined) ? (function(){return (self['@selectedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return self;},
+args: [],
+source: unescape('selectedClasses%0A%09%5EselectedClasses%20%20ifNil%3A%20%5BselectedClasses%20%3A%3D%20Array%20new%5D'),
+messageSends: ["ifNil:", "new"],
+referencedClasses: ["Array"]
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+unescape('_statusInfo'),
+smalltalk.method({
+selector: unescape('statusInfo'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printTotal", []), "__comma", [smalltalk.send(self, "_printPasses", [])]), "__comma", [smalltalk.send(self, "_printErrors", [])]), "__comma", [smalltalk.send(self, "_printFailures", [])]);
+return self;},
+args: [],
+source: unescape('statusInfo%0A%09%5Eself%20printTotal%2C%20self%20printPasses%2C%20self%20printErrors%2C%20self%20printFailures'),
+messageSends: [unescape("%2C"), "printTotal", "printPasses", "printErrors", "printFailures"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+unescape('_testCases'),
+smalltalk.method({
+selector: unescape('testCases'),
+category: 'accessing',
+fn: function (){
+var self=this;
+var testCases=nil;
+(testCases=[]);
+smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_do_", [(function(each){return smalltalk.send(testCases, "_addAll_", [smalltalk.send(each, "_buildSuite", [])]);})]);
+return testCases;
+return self;},
+args: [],
+source: unescape('testCases%0A%09%7C%20testCases%20%7C%0A%09testCases%20%3A%3D%20%23%28%29.%0A%09self%20selectedClasses%20do%3A%20%5B%3Aeach%20%7C%20testCases%20addAll%3A%20each%20buildSuite%5D.%0A%09%5EtestCases'),
+messageSends: ["do:", "selectedClasses", "addAll:", "buildSuite"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+unescape('_toggleCategory_'),
+smalltalk.method({
+selector: unescape('toggleCategory%3A'),
+category: 'actions',
+fn: function (aCategory){
+var self=this;
+((($receiver = smalltalk.send(self, "_isSelectedCategory_", [aCategory])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@selectedCategories'], "_add_", [aCategory]);})() : (function(){return smalltalk.send(self['@selectedCategories'], "_remove_", [aCategory]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedCategories'], "_add_", [aCategory]);}), (function(){return smalltalk.send(self['@selectedCategories'], "_remove_", [aCategory]);})]));
+(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+return self;},
+args: ["aCategory"],
+source: unescape('toggleCategory%3A%20aCategory%0A%09%28self%20isSelectedCategory%3A%20aCategory%29%20%0A%09%09ifFalse%3A%20%5BselectedCategories%20add%3A%20aCategory%5D%0A%09%09ifTrue%3A%20%5BselectedCategories%20remove%3A%20aCategory%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
+messageSends: ["ifFalse:ifTrue:", "isSelectedCategory:", "add:", "remove:", "updateCategoriesList", "updateClassesList"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+unescape('_toggleClass_'),
 smalltalk.method({
-selector: unescape('isSelectedCategory%3A'),
-category: 'testing',
-fn: function (aCategory){
+selector: unescape('toggleClass%3A'),
+category: 'actions',
+fn: function (aClass){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [aCategory]);
+((($receiver = smalltalk.send(self, "_isSelectedClass_", [aClass])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self['@selectedClasses'], "_add_", [aClass]);})() : (function(){return smalltalk.send(self['@selectedClasses'], "_remove_", [aClass]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedClasses'], "_add_", [aClass]);}), (function(){return smalltalk.send(self['@selectedClasses'], "_remove_", [aClass]);})]));
+smalltalk.send(self, "_updateClassesList", []);
 return self;},
-args: ["aCategory"],
-source: unescape('isSelectedCategory%3A%20aCategory%0A%09%5E%28self%20selectedCategories%20includes%3A%20aCategory%29'),
-messageSends: ["includes:", "selectedCategories"],
+args: ["aClass"],
+source: unescape('toggleClass%3A%20aClass%0A%09%28self%20isSelectedClass%3A%20aClass%29%20%0A%09%09ifFalse%3A%20%5BselectedClasses%20add%3A%20aClass%5D%0A%09%09ifTrue%3A%20%5BselectedClasses%20remove%3A%20aClass%5D.%0A%09self%20%0A%09%20%20%20%20updateClassesList'),
+messageSends: ["ifFalse:ifTrue:", "isSelectedClass:", "add:", "remove:", "updateClassesList"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
@@ -4556,186 +4602,140 @@ smalltalk.TestRunner);
 
 
 
-smalltalk.addClass('IDETranscript', smalltalk.TabWidget, ['textarea'], 'IDE');
+smalltalk.addClass('Workspace', smalltalk.TabWidget, ['sourceArea'], 'IDE');
 smalltalk.addMethod(
-unescape('_label'),
+unescape('_clearWorkspace'),
 smalltalk.method({
-selector: unescape('label'),
-category: 'accessing',
+selector: unescape('clearWorkspace'),
+category: 'actions',
 fn: function (){
 var self=this;
-return "Transcript";
+smalltalk.send(self['@sourceArea'], "_clear", []);
 return self;},
 args: [],
-source: unescape('label%0A%20%20%20%20%5E%27Transcript%27'),
-messageSends: [],
+source: unescape('clearWorkspace%0A%20%20%20%20sourceArea%20clear'),
+messageSends: ["clear"],
 referencedClasses: []
 }),
-smalltalk.IDETranscript);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_clear'),
+unescape('_doIt'),
 smalltalk.method({
-selector: unescape('clear'),
+selector: unescape('doIt'),
 category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [""]);
+smalltalk.send(self['@sourceArea'], "_doIt", []);
 return self;},
 args: [],
-source: unescape('clear%0A%20%20%20%20textarea%20asJQuery%20val%3A%20%27%27'),
-messageSends: ["val:", "asJQuery"],
+source: unescape('doIt%0A%20%20%20sourceArea%20doIt'),
+messageSends: ["doIt"],
 referencedClasses: []
 }),
-smalltalk.IDETranscript);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_cr'),
+unescape('_fileIn'),
 smalltalk.method({
-selector: unescape('cr'),
+selector: unescape('fileIn'),
 category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [smalltalk.send(smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val", []), "__comma", [smalltalk.send((smalltalk.String || String), "_cr", [])])]);
+smalltalk.send(self['@sourceArea'], "_fileIn", []);
 return self;},
 args: [],
-source: unescape('cr%0A%20%20%20%20textarea%20asJQuery%20val%3A%20textarea%20asJQuery%20val%2C%20String%20cr.'),
-messageSends: ["val:", "asJQuery", unescape("%2C"), "val", "cr"],
-referencedClasses: ["String"]
-}),
-smalltalk.IDETranscript);
-
-smalltalk.addMethod(
-unescape('_show_'),
-smalltalk.method({
-selector: unescape('show%3A'),
-category: 'actions',
-fn: function (anObject){
-var self=this;
-(($receiver = self['@textarea']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self, "_open", []);})() : $receiver;
-smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val_", [smalltalk.send(smalltalk.send(smalltalk.send(self['@textarea'], "_asJQuery", []), "_val", []), "__comma", [smalltalk.send(anObject, "_asString", [])])]);
-return self;},
-args: ["anObject"],
-source: unescape('show%3A%20anObject%0A%20%20%20%20textarea%20ifNil%3A%20%5Bself%20open%5D.%0A%20%20%20%20textarea%20asJQuery%20val%3A%20textarea%20asJQuery%20val%2C%20anObject%20asString.'),
-messageSends: ["ifNil:", "open", "val:", "asJQuery", unescape("%2C"), "val", "asString"],
+source: unescape('fileIn%0A%20%20%20%20sourceArea%20fileIn'),
+messageSends: ["fileIn"],
 referencedClasses: []
 }),
-smalltalk.IDETranscript);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_inspectIt'),
 smalltalk.method({
-selector: unescape('open'),
+selector: unescape('inspectIt'),
 category: 'actions',
 fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_open", []);return smalltalk.send($rec, "_selectTab_", [self]);})(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []));
+smalltalk.send(self['@sourceArea'], "_inspectIt", []);
 return self;},
 args: [],
-source: unescape('open%0A%20%20%20%20TabManager%20current%20%0A%09open%3B%0A%09selectTab%3A%20self'),
-messageSends: ["open", "selectTab:", "current"],
-referencedClasses: ["TabManager"]
-}),
-smalltalk.IDETranscript);
-
-smalltalk.addMethod(
-unescape('_renderBoxOn_'),
-smalltalk.method({
-selector: unescape('renderBoxOn%3A'),
-category: 'rendering',
-fn: function (html){
-var self=this;
-(self['@textarea']=smalltalk.send(html, "_textarea", []));
-(function($rec){smalltalk.send($rec, "_class_", ["jt_transcript"]);return smalltalk.send($rec, "_at_put_", ["spellcheck", "false"]);})(self['@textarea']);
-return self;},
-args: ["html"],
-source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20textarea%20%3A%3D%20html%20textarea.%0A%20%20%20%20textarea%20%0A%09class%3A%20%27jt_transcript%27%3B%0A%09at%3A%20%27spellcheck%27%20put%3A%20%27false%27'),
-messageSends: ["textarea", "class:", "at:put:"],
-referencedClasses: []
-}),
-smalltalk.IDETranscript);
-
-smalltalk.addMethod(
-unescape('_renderButtonsOn_'),
-smalltalk.method({
-selector: unescape('renderButtonsOn%3A'),
-category: 'rendering',
-fn: function (html){
-var self=this;
-(function($rec){smalltalk.send($rec, "_with_", ["Clear transcript"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_clear", []);})]);})(smalltalk.send(html, "_button", []));
-return self;},
-args: ["html"],
-source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20html%20button%0A%09with%3A%20%27Clear%20transcript%27%3B%0A%09onClick%3A%20%5Bself%20clear%5D'),
-messageSends: ["with:", "onClick:", "clear", "button"],
+source: unescape('inspectIt%0A%20%20%20%20sourceArea%20inspectIt'),
+messageSends: ["inspectIt"],
 referencedClasses: []
 }),
-smalltalk.IDETranscript);
-
+smalltalk.Workspace);
 
-smalltalk.IDETranscript.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_label'),
 smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
+selector: unescape('label'),
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send((smalltalk.Transcript || Transcript), "_register_", [smalltalk.send(self, "_current", [])]);
+return "Workspace";
 return self;},
 args: [],
-source: unescape('initialize%0A%09Transcript%20register%3A%20self%20current'),
-messageSends: ["register:", "current"],
-referencedClasses: ["Transcript"]
+source: unescape('label%0A%20%20%20%20%5E%27Workspace%27'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.IDETranscript.klass);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_new'),
+unescape('_printIt'),
 smalltalk.method({
-selector: unescape('new'),
-category: 'instance creation',
+selector: unescape('printIt'),
+category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+smalltalk.send(self['@sourceArea'], "_printIt", []);
 return self;},
 args: [],
-source: unescape('new%0A%20%20%20%20self%20shouldNotImplement'),
-messageSends: ["shouldNotImplement"],
+source: unescape('printIt%0A%09sourceArea%20printIt'),
+messageSends: ["printIt"],
 referencedClasses: []
 }),
-smalltalk.IDETranscript.klass);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_renderBoxOn_'),
 smalltalk.method({
-selector: unescape('open'),
-category: 'instance creation',
-fn: function (){
+selector: unescape('renderBoxOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_open", []);return smalltalk.send($rec, "_selectTab_", [smalltalk.send(self, "_current", [])]);})(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []));
+(self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));
+smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);
 return self;},
-args: [],
-source: unescape('open%0A%20%20%20%20TabManager%20current%20%0A%09open%3B%0A%09selectTab%3A%20self%20current'),
-messageSends: ["open", "selectTab:", "current"],
-referencedClasses: ["TabManager"]
+args: ["html"],
+source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20sourceArea%20%3A%3D%20SourceArea%20new.%0A%20%20%20%20sourceArea%20renderOn%3A%20html'),
+messageSends: ["new", "renderOn:"],
+referencedClasses: ["SourceArea"]
 }),
-smalltalk.IDETranscript.klass);
+smalltalk.Workspace);
 
 smalltalk.addMethod(
-unescape('_current'),
+unescape('_renderButtonsOn_'),
 smalltalk.method({
-selector: unescape('current'),
-category: 'instance creation',
-fn: function (){
+selector: unescape('renderButtonsOn%3A'),
+category: 'rendering',
+fn: function (html){
 var self=this;
-return (($receiver = self['@current']) == nil || $receiver == undefined) ? (function(){return (self['@current']=smalltalk.send(self, "_new", [], smalltalk.TabWidget.klass));})() : $receiver;
+(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+d")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+p")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);smalltalk.send($rec, "_title_", [unescape("ctrl+i")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["FileIn"]);smalltalk.send($rec, "_title_", [unescape("ctrl+f")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_fileIn", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["Clear workspace"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_clearWorkspace", []);})]);})(smalltalk.send(html, "_button", []));
 return self;},
-args: [],
-source: unescape('current%0A%09%5Ecurrent%20ifNil%3A%20%5Bcurrent%20%3A%3D%20super%20new%5D'),
-messageSends: ["ifNil:", "new"],
+args: ["html"],
+source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20html%20button%0A%09with%3A%20%27DoIt%27%3B%0A%09title%3A%20%27ctrl+d%27%3B%0A%09onClick%3A%20%5Bself%20doIt%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27PrintIt%27%3B%0A%09title%3A%20%27ctrl+p%27%3B%0A%09onClick%3A%20%5Bself%20printIt%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27InspectIt%27%3B%0A%09title%3A%20%27ctrl+i%27%3B%0A%09onClick%3A%20%5Bself%20inspectIt%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27FileIn%27%3B%0A%09title%3A%20%27ctrl+f%27%3B%0A%09onClick%3A%20%5Bself%20fileIn%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27Clear%20workspace%27%3B%0A%09onClick%3A%20%5Bself%20clearWorkspace%5D'),
+messageSends: ["with:", "title:", "onClick:", "doIt", "button", "printIt", "inspectIt", "fileIn", "clearWorkspace"],
 referencedClasses: []
 }),
-smalltalk.IDETranscript.klass);
+smalltalk.Workspace);
+
 
 
 smalltalk.addMethod(
@@ -4784,21 +4784,15 @@ var self=this;
 var variables=nil;
 (variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 smalltalk.send(variables, "_at_put_", [unescape("%23self"), self]);
-smalltalk.send(variables, "_at_put_", [unescape("%23year"), smalltalk.send(self, "_year", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23month"), smalltalk.send(self, "_month", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23day"), smalltalk.send(self, "_day", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23hours"), smalltalk.send(self, "_hours", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23minutes"), smalltalk.send(self, "_minutes", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23seconds"), smalltalk.send(self, "_seconds", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23milliseconds"), smalltalk.send(self, "_milliseconds", [])]);
+smalltalk.send(self, "_withIndexDo_", [(function(each, i){return smalltalk.send(variables, "_at_put_", [i, each]);})]);
 (function($rec){smalltalk.send($rec, "_setLabel_", [smalltalk.send(self, "_printString", [])]);return smalltalk.send($rec, "_setVariables_", [variables]);})(anInspector);
 return self;},
 args: ["anInspector"],
-source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self.%0A%09variables%20at%3A%20%27%23year%27%20put%3A%20self%20year.%0A%09variables%20at%3A%20%27%23month%27%20put%3A%20self%20month.%0A%09variables%20at%3A%20%27%23day%27%20put%3A%20self%20day.%0A%09variables%20at%3A%20%27%23hours%27%20put%3A%20self%20hours.%0A%09variables%20at%3A%20%27%23minutes%27%20put%3A%20self%20minutes.%0A%09variables%20at%3A%20%27%23seconds%27%20put%3A%20self%20seconds.%0A%09variables%20at%3A%20%27%23milliseconds%27%20put%3A%20self%20milliseconds.%0A%09anInspector%20%0A%09%09setLabel%3A%20self%20printString%3B%0A%09%09setVariables%3A%20variables'),
-messageSends: ["new", "at:put:", "year", "month", "day", "hours", "minutes", "seconds", "milliseconds", "setLabel:", "printString", "setVariables:"],
+source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self.%0A%09self%20withIndexDo%3A%20%5B%3Aeach%20%3Ai%20%7C%0A%09%09variables%20at%3A%20i%20put%3A%20each%5D.%0A%09anInspector%20%0A%09%09setLabel%3A%20self%20printString%3B%0A%09%09setVariables%3A%20variables'),
+messageSends: ["new", "at:put:", "withIndexDo:", "setLabel:", "printString", "setVariables:"],
 referencedClasses: ["Dictionary"]
 }),
-smalltalk.Date);
+smalltalk.Collection);
 
 smalltalk.addMethod(
 unescape('_inspectOn_'),
@@ -4810,15 +4804,16 @@ var self=this;
 var variables=nil;
 (variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 smalltalk.send(variables, "_at_put_", [unescape("%23self"), self]);
-smalltalk.send(self, "_withIndexDo_", [(function(each, i){return smalltalk.send(variables, "_at_put_", [i, each]);})]);
+smalltalk.send(variables, "_at_put_", [unescape("%23keys"), smalltalk.send(self, "_keys", [])]);
+smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(variables, "_at_put_", [key, value]);})]);
 (function($rec){smalltalk.send($rec, "_setLabel_", [smalltalk.send(self, "_printString", [])]);return smalltalk.send($rec, "_setVariables_", [variables]);})(anInspector);
 return self;},
 args: ["anInspector"],
-source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self.%0A%09self%20withIndexDo%3A%20%5B%3Aeach%20%3Ai%20%7C%0A%09%09variables%20at%3A%20i%20put%3A%20each%5D.%0A%09anInspector%20%0A%09%09setLabel%3A%20self%20printString%3B%0A%09%09setVariables%3A%20variables'),
-messageSends: ["new", "at:put:", "withIndexDo:", "setLabel:", "printString", "setVariables:"],
+source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self.%0A%09variables%20at%3A%20%27%23keys%27%20put%3A%20self%20keys.%0A%09self%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%09variables%20at%3A%20key%20put%3A%20value%5D.%0A%09anInspector%20%0A%09%09setLabel%3A%20self%20printString%3B%0A%09%09setVariables%3A%20variables'),
+messageSends: ["new", "at:put:", "keys", "keysAndValuesDo:", "setLabel:", "printString", "setVariables:"],
 referencedClasses: ["Dictionary"]
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
 unescape('_inspectOn_'),
@@ -4849,19 +4844,15 @@ var self=this;
 var variables=nil;
 (variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 smalltalk.send(variables, "_at_put_", [unescape("%23self"), self]);
-smalltalk.send(variables, "_at_put_", [unescape("%23home"), smalltalk.send(self, "_home", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23receiver"), smalltalk.send(self, "_receiver", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23selector"), smalltalk.send(self, "_selector", [])]);
-smalltalk.send(variables, "_at_put_", [unescape("%23temps"), smalltalk.send(self, "_temps", [])]);
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_instanceVariableNames", []), "_do_", [(function(each){return smalltalk.send(variables, "_at_put_", [each, smalltalk.send(self, "_instVarAt_", [each])]);})]);
+smalltalk.send(self['@elements'], "_withIndexDo_", [(function(each, i){return smalltalk.send(variables, "_at_put_", [i, each]);})]);
 (function($rec){smalltalk.send($rec, "_setLabel_", [smalltalk.send(self, "_printString", [])]);return smalltalk.send($rec, "_setVariables_", [variables]);})(anInspector);
 return self;},
 args: ["anInspector"],
-source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self.%0A%09variables%20at%3A%20%27%23home%27%20put%3A%20self%20home.%0A%09variables%20at%3A%20%27%23receiver%27%20put%3A%20self%20receiver.%0A%09variables%20at%3A%20%27%23selector%27%20put%3A%20self%20selector.%0A%09variables%20at%3A%20%27%23temps%27%20put%3A%20self%20temps.%0A%09self%20class%20instanceVariableNames%20do%3A%20%5B%3Aeach%20%7C%0A%09%09variables%20at%3A%20each%20put%3A%20%28self%20instVarAt%3A%20each%29%5D.%0A%09anInspector%20%0A%09%09setLabel%3A%20self%20printString%3B%0A%09%09setVariables%3A%20variables'),
-messageSends: ["new", "at:put:", "home", "receiver", "selector", "temps", "do:", "instanceVariableNames", "class", "instVarAt:", "setLabel:", "printString", "setVariables:"],
+source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self.%0A%09elements%20withIndexDo%3A%20%5B%3Aeach%20%3Ai%20%7C%0A%09%09variables%20at%3A%20i%20put%3A%20each%5D.%0A%09anInspector%20%0A%09%09setLabel%3A%20self%20printString%3B%0A%09%09setVariables%3A%20variables'),
+messageSends: ["new", "at:put:", "withIndexDo:", "setLabel:", "printString", "setVariables:"],
 referencedClasses: ["Dictionary"]
 }),
-smalltalk.MethodContext);
+smalltalk.Set);
 
 smalltalk.addMethod(
 unescape('_inspectOn_'),
@@ -4899,15 +4890,21 @@ var self=this;
 var variables=nil;
 (variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 smalltalk.send(variables, "_at_put_", [unescape("%23self"), self]);
-smalltalk.send(self['@elements'], "_withIndexDo_", [(function(each, i){return smalltalk.send(variables, "_at_put_", [i, each]);})]);
+smalltalk.send(variables, "_at_put_", [unescape("%23year"), smalltalk.send(self, "_year", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23month"), smalltalk.send(self, "_month", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23day"), smalltalk.send(self, "_day", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23hours"), smalltalk.send(self, "_hours", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23minutes"), smalltalk.send(self, "_minutes", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23seconds"), smalltalk.send(self, "_seconds", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23milliseconds"), smalltalk.send(self, "_milliseconds", [])]);
 (function($rec){smalltalk.send($rec, "_setLabel_", [smalltalk.send(self, "_printString", [])]);return smalltalk.send($rec, "_setVariables_", [variables]);})(anInspector);
 return self;},
 args: ["anInspector"],
-source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self.%0A%09elements%20withIndexDo%3A%20%5B%3Aeach%20%3Ai%20%7C%0A%09%09variables%20at%3A%20i%20put%3A%20each%5D.%0A%09anInspector%20%0A%09%09setLabel%3A%20self%20printString%3B%0A%09%09setVariables%3A%20variables'),
-messageSends: ["new", "at:put:", "withIndexDo:", "setLabel:", "printString", "setVariables:"],
+source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self.%0A%09variables%20at%3A%20%27%23year%27%20put%3A%20self%20year.%0A%09variables%20at%3A%20%27%23month%27%20put%3A%20self%20month.%0A%09variables%20at%3A%20%27%23day%27%20put%3A%20self%20day.%0A%09variables%20at%3A%20%27%23hours%27%20put%3A%20self%20hours.%0A%09variables%20at%3A%20%27%23minutes%27%20put%3A%20self%20minutes.%0A%09variables%20at%3A%20%27%23seconds%27%20put%3A%20self%20seconds.%0A%09variables%20at%3A%20%27%23milliseconds%27%20put%3A%20self%20milliseconds.%0A%09anInspector%20%0A%09%09setLabel%3A%20self%20printString%3B%0A%09%09setVariables%3A%20variables'),
+messageSends: ["new", "at:put:", "year", "month", "day", "hours", "minutes", "seconds", "milliseconds", "setLabel:", "printString", "setVariables:"],
 referencedClasses: ["Dictionary"]
 }),
-smalltalk.Set);
+smalltalk.Date);
 
 smalltalk.addMethod(
 unescape('_inspectOn_'),
@@ -4919,14 +4916,17 @@ var self=this;
 var variables=nil;
 (variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 smalltalk.send(variables, "_at_put_", [unescape("%23self"), self]);
-smalltalk.send(variables, "_at_put_", [unescape("%23keys"), smalltalk.send(self, "_keys", [])]);
-smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(variables, "_at_put_", [key, value]);})]);
+smalltalk.send(variables, "_at_put_", [unescape("%23home"), smalltalk.send(self, "_home", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23receiver"), smalltalk.send(self, "_receiver", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23selector"), smalltalk.send(self, "_selector", [])]);
+smalltalk.send(variables, "_at_put_", [unescape("%23temps"), smalltalk.send(self, "_temps", [])]);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_instanceVariableNames", []), "_do_", [(function(each){return smalltalk.send(variables, "_at_put_", [each, smalltalk.send(self, "_instVarAt_", [each])]);})]);
 (function($rec){smalltalk.send($rec, "_setLabel_", [smalltalk.send(self, "_printString", [])]);return smalltalk.send($rec, "_setVariables_", [variables]);})(anInspector);
 return self;},
 args: ["anInspector"],
-source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self.%0A%09variables%20at%3A%20%27%23keys%27%20put%3A%20self%20keys.%0A%09self%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%09variables%20at%3A%20key%20put%3A%20value%5D.%0A%09anInspector%20%0A%09%09setLabel%3A%20self%20printString%3B%0A%09%09setVariables%3A%20variables'),
-messageSends: ["new", "at:put:", "keys", "keysAndValuesDo:", "setLabel:", "printString", "setVariables:"],
+source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self.%0A%09variables%20at%3A%20%27%23home%27%20put%3A%20self%20home.%0A%09variables%20at%3A%20%27%23receiver%27%20put%3A%20self%20receiver.%0A%09variables%20at%3A%20%27%23selector%27%20put%3A%20self%20selector.%0A%09variables%20at%3A%20%27%23temps%27%20put%3A%20self%20temps.%0A%09self%20class%20instanceVariableNames%20do%3A%20%5B%3Aeach%20%7C%0A%09%09variables%20at%3A%20each%20put%3A%20%28self%20instVarAt%3A%20each%29%5D.%0A%09anInspector%20%0A%09%09setLabel%3A%20self%20printString%3B%0A%09%09setVariables%3A%20variables'),
+messageSends: ["new", "at:put:", "home", "receiver", "selector", "temps", "do:", "instanceVariableNames", "class", "instVarAt:", "setLabel:", "printString", "setVariables:"],
 referencedClasses: ["Dictionary"]
 }),
-smalltalk.HashedCollection);
+smalltalk.MethodContext);
 
diff --git a/amber/src/js/Kernel-Classes.deploy.js b/amber/src/js/Kernel-Classes.deploy.js
index 4be50db4811..4ea2d04ae8c 100644
--- a/amber/src/js/Kernel-Classes.deploy.js
+++ b/amber/src/js/Kernel-Classes.deploy.js
@@ -1,132 +1,131 @@
 smalltalk.addPackage('Kernel-Classes', {});
 smalltalk.addClass('Behavior', smalltalk.Object, [], 'Kernel-Classes');
 smalltalk.addMethod(
-unescape('_new'),
+unescape('_addCompiledMethod_'),
 smalltalk.method({
-selector: unescape('new'),
-fn: function (){
+selector: unescape('addCompiledMethod%3A'),
+fn: function (aMethod){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_basicNew", []), "_initialize", []);
+smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self);
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_basicNew'),
+unescape('_allInstanceVariableNames'),
 smalltalk.method({
-selector: unescape('basicNew'),
+selector: unescape('allInstanceVariableNames'),
 fn: function (){
 var self=this;
-return new self.fn();
+var result=nil;
+(result=smalltalk.send(smalltalk.send(self, "_instanceVariableNames", []), "_copy", []));
+(($receiver = smalltalk.send(self, "_superclass", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(result, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allInstanceVariableNames", [])]);})() : nil;
+return result;
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_name'),
+unescape('_allSubclasses'),
 smalltalk.method({
-selector: unescape('name'),
+selector: unescape('allSubclasses'),
 fn: function (){
 var self=this;
-return self.className || nil;
+var result=nil;
+(result=smalltalk.send(self, "_subclasses", []));
+smalltalk.send(smalltalk.send(self, "_subclasses", []), "_do_", [(function(each){return smalltalk.send(result, "_addAll_", [smalltalk.send(each, "_allSubclasses", [])]);})]);
+return result;
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_superclass'),
+unescape('_basicNew'),
 smalltalk.method({
-selector: unescape('superclass'),
+selector: unescape('basicNew'),
 fn: function (){
 var self=this;
-return self.superclass || nil;
+return new self.fn();
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_subclasses'),
+unescape('_comment'),
 smalltalk.method({
-selector: unescape('subclasses'),
+selector: unescape('comment'),
 fn: function (){
 var self=this;
-return smalltalk.subclasses(self);
+return (($receiver = smalltalk.send(self, "_basicAt_", ["comment"])) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_allSubclasses'),
+unescape('_comment_'),
 smalltalk.method({
-selector: unescape('allSubclasses'),
-fn: function (){
+selector: unescape('comment%3A'),
+fn: function (aString){
 var self=this;
-var result=nil;
-(result=smalltalk.send(self, "_subclasses", []));
-smalltalk.send(smalltalk.send(self, "_subclasses", []), "_do_", [(function(each){return smalltalk.send(result, "_addAll_", [smalltalk.send(each, "_allSubclasses", [])]);})]);
-return result;
+smalltalk.send(self, "_basicAt_put_", ["comment", aString]);
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_withAllSubclasses'),
+unescape('_commentStamp'),
 smalltalk.method({
-selector: unescape('withAllSubclasses'),
+selector: unescape('commentStamp'),
 fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_allSubclasses", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Array || Array), "_with_", [self]));
+return (function($rec){smalltalk.send($rec, "_class_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCommentReader || ClassCommentReader), "_new", []));
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_prototype'),
+unescape('_commentStamp_prior_'),
 smalltalk.method({
-selector: unescape('prototype'),
-fn: function (){
+selector: unescape('commentStamp%3Aprior%3A'),
+fn: function (aStamp, prior){
 var self=this;
-return self.fn.prototype;
+return smalltalk.send(self, "_commentStamp", []);
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_methodDictionary'),
+unescape('_compile_'),
 smalltalk.method({
-selector: unescape('methodDictionary'),
-fn: function (){
+selector: unescape('compile%3A'),
+fn: function (aString){
 var self=this;
-var dict = smalltalk.HashedCollection._new();
-	var methods = self.fn.prototype.methods;
-	for(var i in methods) {
-		if(methods[i].selector) {
-			dict._at_put_(methods[i].selector, methods[i]);
-		}
-	};
-	return dict;
+smalltalk.send(self, "_compile_category_", [aString, ""]);
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_methodsFor_'),
+unescape('_compile_category_'),
 smalltalk.method({
-selector: unescape('methodsFor%3A'),
-fn: function (aString){
+selector: unescape('compile%3Acategory%3A'),
+fn: function (aString, anotherString){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_class_category_", [self, aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCategoryReader || ClassCategoryReader), "_new", []));
+var method=nil;
+(method=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [aString, self]));
+smalltalk.send(method, "_category_", [anotherString]);
+smalltalk.send(self, "_addCompiledMethod_", [method]);
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_addCompiledMethod_'),
+unescape('_inheritsFrom_'),
 smalltalk.method({
-selector: unescape('addCompiledMethod%3A'),
-fn: function (aMethod){
+selector: unescape('inheritsFrom%3A'),
+fn: function (aClass){
 var self=this;
-smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self);
+return smalltalk.send(smalltalk.send(aClass, "_allSubclasses", []), "_includes_", [self]);
 return self;}
 }),
 smalltalk.Behavior);
@@ -143,58 +142,74 @@ return self;}
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_comment'),
+unescape('_methodAt_'),
 smalltalk.method({
-selector: unescape('comment'),
+selector: unescape('methodAt%3A'),
+fn: function (aString){
+var self=this;
+return smalltalk.methods(self)[aString];
+return self;}
+}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+unescape('_methodDictionary'),
+smalltalk.method({
+selector: unescape('methodDictionary'),
 fn: function (){
 var self=this;
-return (($receiver = smalltalk.send(self, "_basicAt_", ["comment"])) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
+var dict = smalltalk.HashedCollection._new();
+	var methods = self.fn.prototype.methods;
+	for(var i in methods) {
+		if(methods[i].selector) {
+			dict._at_put_(methods[i].selector, methods[i]);
+		}
+	};
+	return dict;
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_comment_'),
+unescape('_methodsFor_'),
 smalltalk.method({
-selector: unescape('comment%3A'),
+selector: unescape('methodsFor%3A'),
 fn: function (aString){
 var self=this;
-smalltalk.send(self, "_basicAt_put_", ["comment", aString]);
+return (function($rec){smalltalk.send($rec, "_class_category_", [self, aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCategoryReader || ClassCategoryReader), "_new", []));
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_commentStamp'),
+unescape('_methodsFor_stamp_'),
 smalltalk.method({
-selector: unescape('commentStamp'),
-fn: function (){
+selector: unescape('methodsFor%3Astamp%3A'),
+fn: function (aString, aStamp){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_class_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCommentReader || ClassCommentReader), "_new", []));
+return smalltalk.send(self, "_methodsFor_", [aString]);
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_removeCompiledMethod_'),
+unescape('_name'),
 smalltalk.method({
-selector: unescape('removeCompiledMethod%3A'),
-fn: function (aMethod){
+selector: unescape('name'),
+fn: function (){
 var self=this;
-delete self.fn.prototype[aMethod.selector._asSelector()];
-	delete self.fn.prototype.methods[aMethod.selector];
-	smalltalk.init(self);;
+return self.className || nil;
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_inheritsFrom_'),
+unescape('_new'),
 smalltalk.method({
-selector: unescape('inheritsFrom%3A'),
-fn: function (aClass){
+selector: unescape('new'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(aClass, "_allSubclasses", []), "_includes_", [self]);
+return smalltalk.send(smalltalk.send(self, "_basicNew", []), "_initialize", []);
 return self;}
 }),
 smalltalk.Behavior);
@@ -228,73 +243,58 @@ return self;}
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_allInstanceVariableNames'),
+unescape('_prototype'),
 smalltalk.method({
-selector: unescape('allInstanceVariableNames'),
+selector: unescape('prototype'),
 fn: function (){
 var self=this;
-var result=nil;
-(result=smalltalk.send(smalltalk.send(self, "_instanceVariableNames", []), "_copy", []));
-(($receiver = smalltalk.send(self, "_superclass", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(result, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allInstanceVariableNames", [])]);})() : nil;
-return result;
-return self;}
-}),
-smalltalk.Behavior);
-
-smalltalk.addMethod(
-unescape('_methodAt_'),
-smalltalk.method({
-selector: unescape('methodAt%3A'),
-fn: function (aString){
-var self=this;
-return smalltalk.methods(self)[aString];
+return self.fn.prototype;
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_methodsFor_stamp_'),
+unescape('_removeCompiledMethod_'),
 smalltalk.method({
-selector: unescape('methodsFor%3Astamp%3A'),
-fn: function (aString, aStamp){
+selector: unescape('removeCompiledMethod%3A'),
+fn: function (aMethod){
 var self=this;
-return smalltalk.send(self, "_methodsFor_", [aString]);
+delete self.fn.prototype[aMethod.selector._asSelector()];
+	delete self.fn.prototype.methods[aMethod.selector];
+	smalltalk.init(self);;
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_commentStamp_prior_'),
+unescape('_subclasses'),
 smalltalk.method({
-selector: unescape('commentStamp%3Aprior%3A'),
-fn: function (aStamp, prior){
+selector: unescape('subclasses'),
+fn: function (){
 var self=this;
-return smalltalk.send(self, "_commentStamp", []);
+return smalltalk.subclasses(self);
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_compile_'),
+unescape('_superclass'),
 smalltalk.method({
-selector: unescape('compile%3A'),
-fn: function (aString){
+selector: unescape('superclass'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_compile_category_", [aString, ""]);
+return self.superclass || nil;
 return self;}
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_compile_category_'),
+unescape('_withAllSubclasses'),
 smalltalk.method({
-selector: unescape('compile%3Acategory%3A'),
-fn: function (aString, anotherString){
+selector: unescape('withAllSubclasses'),
+fn: function (){
 var self=this;
-var method=nil;
-(method=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [aString, self]));
-smalltalk.send(method, "_category_", [anotherString]);
-smalltalk.send(self, "_addCompiledMethod_", [method]);
+return (function($rec){smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_allSubclasses", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Array || Array), "_with_", [self]));
 return self;}
 }),
 smalltalk.Behavior);
@@ -314,35 +314,34 @@ return self;}
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_'),
+unescape('_isClass'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3A'),
-fn: function (aString, anotherString){
+selector: unescape('isClass'),
+fn: function (){
 var self=this;
-return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, anotherString, nil]);
+return true;
 return self;}
 }),
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_category_'),
+unescape('_package'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3Acategory%3A'),
-fn: function (aString, aString2, aString3){
+selector: unescape('package'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_deprecatedAPI", []);
-return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
+return self.pkg;
 return self;}
 }),
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_isClass'),
+unescape('_package_'),
 smalltalk.method({
-selector: unescape('isClass'),
-fn: function (){
+selector: unescape('package%3A'),
+fn: function (aPackage){
 var self=this;
-return true;
+self.pkg = aPackage;
 return self;}
 }),
 smalltalk.Class);
@@ -374,34 +373,35 @@ return self;}
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_classVariableNames_poolDictionaries_category_'),
+unescape('_subclass_instanceVariableNames_'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3AclassVariableNames%3ApoolDictionaries%3Acategory%3A'),
-fn: function (aString, aString2, classVars, pools, aString3){
+selector: unescape('subclass%3AinstanceVariableNames%3A'),
+fn: function (aString, anotherString){
 var self=this;
-return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, anotherString, nil]);
 return self;}
 }),
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_package'),
+unescape('_subclass_instanceVariableNames_category_'),
 smalltalk.method({
-selector: unescape('package'),
-fn: function (){
+selector: unescape('subclass%3AinstanceVariableNames%3Acategory%3A'),
+fn: function (aString, aString2, aString3){
 var self=this;
-return self.pkg;
+smalltalk.send(self, "_deprecatedAPI", []);
+return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
 return self;}
 }),
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_package_'),
+unescape('_subclass_instanceVariableNames_classVariableNames_poolDictionaries_category_'),
 smalltalk.method({
-selector: unescape('package%3A'),
-fn: function (aPackage){
+selector: unescape('subclass%3AinstanceVariableNames%3AclassVariableNames%3ApoolDictionaries%3Acategory%3A'),
+fn: function (aString, aString2, classVars, pools, aString3){
 var self=this;
-self.pkg = aPackage;
+return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
 return self;}
 }),
 smalltalk.Class);
@@ -468,12 +468,25 @@ smalltalk.Metaclass);
 
 smalltalk.addClass('ClassBuilder', smalltalk.Object, [], 'Kernel-Classes');
 smalltalk.addMethod(
-unescape('_superclass_subclass_'),
+unescape('_addSubclassOf_named_instanceVariableNames_'),
 smalltalk.method({
-selector: unescape('superclass%3Asubclass%3A'),
-fn: function (aClass, aString){
+selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3A'),
+fn: function (aClass, aString, aCollection){
 var self=this;
-return smalltalk.send(self, "_superclass_subclass_instanceVariableNames_package_", [aClass, aString, "", nil]);
+smalltalk.addClass(aString, aClass, aCollection);
+	    return smalltalk[aString];
+return self;}
+}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+unescape('_addSubclassOf_named_instanceVariableNames_package_'),
+smalltalk.method({
+selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3Apackage%3A'),
+fn: function (aClass, aString, aCollection, packageName){
+var self=this;
+smalltalk.addClass(aString, aClass, aCollection, packageName);
+	    return smalltalk[aString];
 return self;}
 }),
 smalltalk.ClassBuilder);
@@ -492,24 +505,29 @@ return self;}
 smalltalk.ClassBuilder);
 
 smalltalk.addMethod(
-unescape('_instanceVariableNamesFor_'),
+unescape('_copyClass_named_'),
 smalltalk.method({
-selector: unescape('instanceVariableNamesFor%3A'),
-fn: function (aString){
+selector: unescape('copyClass%3Anamed%3A'),
+fn: function (aClass, aString){
 var self=this;
-return smalltalk.send(smalltalk.send(aString, "_tokenize_", [" "]), "_reject_", [(function(each){return smalltalk.send(each, "_isEmpty", []);})]);
+var newClass=nil;
+(newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_package_", [smalltalk.send(aClass, "_superclass", []), aString, smalltalk.send(aClass, "_instanceVariableNames", []), smalltalk.send(smalltalk.send(aClass, "_package", []), "_name", [])]));
+smalltalk.send(self, "_setupClass_", [newClass]);
+smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_do_", [(function(each){smalltalk.send(newClass, "_addCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), newClass])]);return smalltalk.send(smalltalk.send(smalltalk.send(newClass, "_methodDictionary", []), "_at_", [smalltalk.send(each, "_selector", [])]), "_category_", [smalltalk.send(each, "_category", [])]);})]);
+smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_methodDictionary", []), "_values", []), "_do_", [(function(each){smalltalk.send(smalltalk.send(newClass, "_class", []), "_addCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), smalltalk.send(newClass, "_class", [])])]);return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(newClass, "_class", []), "_methodDictionary", []), "_at_", [smalltalk.send(each, "_selector", [])]), "_category_", [smalltalk.send(each, "_category", [])]);})]);
+smalltalk.send(self, "_setupClass_", [newClass]);
+return newClass;
 return self;}
 }),
 smalltalk.ClassBuilder);
 
 smalltalk.addMethod(
-unescape('_addSubclassOf_named_instanceVariableNames_'),
+unescape('_instanceVariableNamesFor_'),
 smalltalk.method({
-selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3A'),
-fn: function (aClass, aString, aCollection){
+selector: unescape('instanceVariableNamesFor%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.addClass(aString, aClass, aCollection);
-	    return smalltalk[aString];
+return smalltalk.send(smalltalk.send(aString, "_tokenize_", [" "]), "_reject_", [(function(each){return smalltalk.send(each, "_isEmpty", []);})]);
 return self;}
 }),
 smalltalk.ClassBuilder);
@@ -525,6 +543,17 @@ return self;}
 }),
 smalltalk.ClassBuilder);
 
+smalltalk.addMethod(
+unescape('_superclass_subclass_'),
+smalltalk.method({
+selector: unescape('superclass%3Asubclass%3A'),
+fn: function (aClass, aString){
+var self=this;
+return smalltalk.send(self, "_superclass_subclass_instanceVariableNames_package_", [aClass, aString, "", nil]);
+return self;}
+}),
+smalltalk.ClassBuilder);
+
 smalltalk.addMethod(
 unescape('_superclass_subclass_instanceVariableNames_package_'),
 smalltalk.method({
@@ -539,38 +568,37 @@ return self;}
 }),
 smalltalk.ClassBuilder);
 
+
+
+smalltalk.addClass('ClassCategoryReader', smalltalk.Object, ['class', 'category', 'chunkParser'], 'Kernel-Classes');
 smalltalk.addMethod(
-unescape('_addSubclassOf_named_instanceVariableNames_package_'),
+unescape('_class_category_'),
 smalltalk.method({
-selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3Apackage%3A'),
-fn: function (aClass, aString, aCollection, packageName){
+selector: unescape('class%3Acategory%3A'),
+fn: function (aClass, aString){
 var self=this;
-smalltalk.addClass(aString, aClass, aCollection, packageName);
-	    return smalltalk[aString];
+(self['@class']=aClass);
+(self['@category']=aString);
 return self;}
 }),
-smalltalk.ClassBuilder);
+smalltalk.ClassCategoryReader);
 
 smalltalk.addMethod(
-unescape('_copyClass_named_'),
+unescape('_compileMethod_'),
 smalltalk.method({
-selector: unescape('copyClass%3Anamed%3A'),
-fn: function (aClass, aString){
+selector: unescape('compileMethod%3A'),
+fn: function (aString){
 var self=this;
-var newClass=nil;
-(newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_package_", [smalltalk.send(aClass, "_superclass", []), aString, smalltalk.send(aClass, "_instanceVariableNames", []), smalltalk.send(smalltalk.send(aClass, "_package", []), "_name", [])]));
-smalltalk.send(self, "_setupClass_", [newClass]);
-smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_do_", [(function(each){smalltalk.send(newClass, "_addCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), newClass])]);return smalltalk.send(smalltalk.send(smalltalk.send(newClass, "_methodDictionary", []), "_at_", [smalltalk.send(each, "_selector", [])]), "_category_", [smalltalk.send(each, "_category", [])]);})]);
-smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_methodDictionary", []), "_values", []), "_do_", [(function(each){smalltalk.send(smalltalk.send(newClass, "_class", []), "_addCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), smalltalk.send(newClass, "_class", [])])]);return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(newClass, "_class", []), "_methodDictionary", []), "_at_", [smalltalk.send(each, "_selector", [])]), "_category_", [smalltalk.send(each, "_category", [])]);})]);
-smalltalk.send(self, "_setupClass_", [newClass]);
-return newClass;
+var method=nil;
+var compiler=nil;
+(method=smalltalk.send((compiler=smalltalk.send((smalltalk.Compiler || Compiler), "_new", [])), "_load_forClass_", [aString, self['@class']]));
+smalltalk.send(method, "_category_", [self['@category']]);
+smalltalk.send(self['@class'], "_addCompiledMethod_", [method]);
+smalltalk.send(compiler, "_setupClass_", [self['@class']]);
 return self;}
 }),
-smalltalk.ClassBuilder);
-
-
+smalltalk.ClassCategoryReader);
 
-smalltalk.addClass('ClassCategoryReader', smalltalk.Object, ['class', 'category', 'chunkParser'], 'Kernel-Classes');
 smalltalk.addMethod(
 unescape('_initialize'),
 smalltalk.method({
@@ -583,18 +611,6 @@ return self;}
 }),
 smalltalk.ClassCategoryReader);
 
-smalltalk.addMethod(
-unescape('_class_category_'),
-smalltalk.method({
-selector: unescape('class%3Acategory%3A'),
-fn: function (aClass, aString){
-var self=this;
-(self['@class']=aClass);
-(self['@category']=aString);
-return self;}
-}),
-smalltalk.ClassCategoryReader);
-
 smalltalk.addMethod(
 unescape('_scanFrom_'),
 smalltalk.method({
@@ -607,20 +623,6 @@ return self;}
 }),
 smalltalk.ClassCategoryReader);
 
-smalltalk.addMethod(
-unescape('_compileMethod_'),
-smalltalk.method({
-selector: unescape('compileMethod%3A'),
-fn: function (aString){
-var self=this;
-var method=nil;
-(method=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [aString, self['@class']]));
-smalltalk.send(method, "_category_", [self['@category']]);
-smalltalk.send(self['@class'], "_addCompiledMethod_", [method]);
-return self;}
-}),
-smalltalk.ClassCategoryReader);
-
 
 
 smalltalk.addClass('ClassCommentReader', smalltalk.Object, ['class', 'chunkParser'], 'Kernel-Classes');
@@ -635,6 +637,18 @@ return self;}
 }),
 smalltalk.ClassCommentReader);
 
+smalltalk.addMethod(
+unescape('_initialize'),
+smalltalk.method({
+selector: unescape('initialize'),
+fn: function (){
+var self=this;
+smalltalk.send(self, "_initialize", [], smalltalk.Object);
+(self['@chunkParser']=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_new", []));
+return self;}
+}),
+smalltalk.ClassCommentReader);
+
 smalltalk.addMethod(
 unescape('_scanFrom_'),
 smalltalk.method({
@@ -649,27 +663,112 @@ return self;}
 smalltalk.ClassCommentReader);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_setComment_'),
 smalltalk.method({
-selector: unescape('initialize'),
-fn: function (){
+selector: unescape('setComment%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Object);
-(self['@chunkParser']=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_new", []));
+smalltalk.send(self['@class'], "_comment_", [aString]);
 return self;}
 }),
 smalltalk.ClassCommentReader);
 
+
+
+smalltalk.addClass('ClassSorterNode', smalltalk.Object, ['theClass', 'level', 'nodes'], 'Kernel-Classes');
 smalltalk.addMethod(
-unescape('_setComment_'),
+unescape('_getNodesFrom_'),
 smalltalk.method({
-selector: unescape('setComment%3A'),
-fn: function (aString){
+selector: unescape('getNodesFrom%3A'),
+fn: function (aCollection){
 var self=this;
-smalltalk.send(self['@class'], "_comment_", [aString]);
+var children=nil;
+var others=nil;
+(children=[]);
+(others=[]);
+smalltalk.send(aCollection, "_do_", [(function(each){return ((($receiver = smalltalk.send(smalltalk.send(each, "_superclass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
+(self['@nodes']=smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassSorterNode || ClassSorterNode), "_on_classes_level_", [each, others, ((($receiver = smalltalk.send(self, "_level", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})]));
 return self;}
 }),
-smalltalk.ClassCommentReader);
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_level'),
+smalltalk.method({
+selector: unescape('level'),
+fn: function (){
+var self=this;
+return self['@level'];
+return self;}
+}),
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_level_'),
+smalltalk.method({
+selector: unescape('level%3A'),
+fn: function (anInteger){
+var self=this;
+(self['@level']=anInteger);
+return self;}
+}),
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_nodes'),
+smalltalk.method({
+selector: unescape('nodes'),
+fn: function (){
+var self=this;
+return self['@nodes'];
+return self;}
+}),
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_theClass'),
+smalltalk.method({
+selector: unescape('theClass'),
+fn: function (){
+var self=this;
+return self['@theClass'];
+return self;}
+}),
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_theClass_'),
+smalltalk.method({
+selector: unescape('theClass%3A'),
+fn: function (aClass){
+var self=this;
+(self['@theClass']=aClass);
+return self;}
+}),
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_traverseClassesWith_'),
+smalltalk.method({
+selector: unescape('traverseClassesWith%3A'),
+fn: function (aCollection){
+var self=this;
+smalltalk.send(aCollection, "_add_", [smalltalk.send(self, "_theClass", [])]);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_nodes", []), "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(smalltalk.send(a, "_theClass", []), "_name", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", [])]));})]), "_do_", [(function(aNode){return smalltalk.send(aNode, "_traverseClassesWith_", [aCollection]);})]);
+return self;}
+}),
+smalltalk.ClassSorterNode);
+
 
+smalltalk.addMethod(
+unescape('_on_classes_level_'),
+smalltalk.method({
+selector: unescape('on%3Aclasses%3Alevel%3A'),
+fn: function (aClass, aCollection, anInteger){
+var self=this;
+return (function($rec){smalltalk.send($rec, "_theClass_", [aClass]);smalltalk.send($rec, "_level_", [anInteger]);smalltalk.send($rec, "_getNodesFrom_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return self;}
+}),
+smalltalk.ClassSorterNode.klass);
 
 
diff --git a/amber/src/js/Kernel-Classes.js b/amber/src/js/Kernel-Classes.js
index 35556eaa5bf..e5422521113 100644
--- a/amber/src/js/Kernel-Classes.js
+++ b/amber/src/js/Kernel-Classes.js
@@ -2,187 +2,186 @@ smalltalk.addPackage('Kernel-Classes', {});
 smalltalk.addClass('Behavior', smalltalk.Object, [], 'Kernel-Classes');
 smalltalk.Behavior.comment=unescape('Behavior%20is%20the%20superclass%20of%20all%20class%20objects.%20%0A%0AIt%20defines%20the%20protocol%20for%20creating%20instances%20of%20a%20class%20with%20%60%23basicNew%60%20and%20%60%23new%60%20%28see%20%60boot.js%60%20for%20class%20constructors%20details%29.%0AInstances%20know%20about%20the%20subclass/superclass%20relationships%20between%20classes%2C%20contain%20the%20description%20that%20instances%20are%20created%20from%2C%20%0Aand%20hold%20the%20method%20dictionary%20that%27s%20associated%20with%20each%20class.%0A%0ABehavior%20also%20%20provides%20methods%20for%20compiling%20methods%2C%20examining%20the%20method%20dictionary%2C%20and%20iterating%20over%20the%20class%20hierarchy.')
 smalltalk.addMethod(
-unescape('_new'),
+unescape('_addCompiledMethod_'),
 smalltalk.method({
-selector: unescape('new'),
-category: 'instance creation',
-fn: function (){
+selector: unescape('addCompiledMethod%3A'),
+category: 'compiling',
+fn: function (aMethod){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_basicNew", []), "_initialize", []);
+smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self);
 return self;},
-args: [],
-source: unescape('new%0A%09%5Eself%20basicNew%20initialize'),
-messageSends: ["initialize", "basicNew"],
+args: ["aMethod"],
+source: unescape('addCompiledMethod%3A%20aMethod%0A%09%3Csmalltalk.addMethod%28aMethod.selector._asSelector%28%29%2C%20aMethod%2C%20self%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_basicNew'),
+unescape('_allInstanceVariableNames'),
 smalltalk.method({
-selector: unescape('basicNew'),
-category: 'instance creation',
+selector: unescape('allInstanceVariableNames'),
+category: 'accessing',
 fn: function (){
 var self=this;
-return new self.fn();
+var result=nil;
+(result=smalltalk.send(smalltalk.send(self, "_instanceVariableNames", []), "_copy", []));
+(($receiver = smalltalk.send(self, "_superclass", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(result, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allInstanceVariableNames", [])]);})() : nil;
+return result;
 return self;},
 args: [],
-source: unescape('basicNew%0A%09%3Creturn%20new%20self.fn%28%29%3E'),
-messageSends: [],
+source: unescape('allInstanceVariableNames%0A%09%7C%20result%20%7C%0A%09result%20%3A%3D%20self%20instanceVariableNames%20copy.%0A%09self%20superclass%20ifNotNil%3A%20%5B%0A%09%20%20%20%20result%20addAll%3A%20self%20superclass%20allInstanceVariableNames%5D.%0A%09%5Eresult'),
+messageSends: ["copy", "instanceVariableNames", "ifNotNil:", "superclass", "addAll:", "allInstanceVariableNames"],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_name'),
+unescape('_allSubclasses'),
 smalltalk.method({
-selector: unescape('name'),
+selector: unescape('allSubclasses'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self.className || nil;
+var result=nil;
+(result=smalltalk.send(self, "_subclasses", []));
+smalltalk.send(smalltalk.send(self, "_subclasses", []), "_do_", [(function(each){return smalltalk.send(result, "_addAll_", [smalltalk.send(each, "_allSubclasses", [])]);})]);
+return result;
 return self;},
 args: [],
-source: unescape('name%0A%09%3Creturn%20self.className%20%7C%7C%20nil%3E'),
-messageSends: [],
+source: unescape('allSubclasses%0A%09%7C%20result%20%7C%0A%09result%20%3A%3D%20self%20subclasses.%0A%09self%20subclasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20result%20addAll%3A%20each%20allSubclasses%5D.%0A%09%5Eresult'),
+messageSends: ["subclasses", "do:", "addAll:", "allSubclasses"],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_superclass'),
+unescape('_basicNew'),
 smalltalk.method({
-selector: unescape('superclass'),
-category: 'accessing',
+selector: unescape('basicNew'),
+category: 'instance creation',
 fn: function (){
 var self=this;
-return self.superclass || nil;
+return new self.fn();
 return self;},
 args: [],
-source: unescape('superclass%0A%09%3Creturn%20self.superclass%20%7C%7C%20nil%3E'),
+source: unescape('basicNew%0A%09%3Creturn%20new%20self.fn%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_subclasses'),
+unescape('_comment'),
 smalltalk.method({
-selector: unescape('subclasses'),
+selector: unescape('comment'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.subclasses(self);
+return (($receiver = smalltalk.send(self, "_basicAt_", ["comment"])) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
 return self;},
 args: [],
-source: unescape('subclasses%0A%09%3Creturn%20smalltalk.subclasses%28self%29%3E'),
-messageSends: [],
+source: unescape('comment%0A%20%20%20%20%5E%28self%20basicAt%3A%20%27comment%27%29%20ifNil%3A%20%5B%27%27%5D'),
+messageSends: ["ifNil:", "basicAt:"],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_allSubclasses'),
+unescape('_comment_'),
 smalltalk.method({
-selector: unescape('allSubclasses'),
+selector: unescape('comment%3A'),
 category: 'accessing',
-fn: function (){
+fn: function (aString){
 var self=this;
-var result=nil;
-(result=smalltalk.send(self, "_subclasses", []));
-smalltalk.send(smalltalk.send(self, "_subclasses", []), "_do_", [(function(each){return smalltalk.send(result, "_addAll_", [smalltalk.send(each, "_allSubclasses", [])]);})]);
-return result;
+smalltalk.send(self, "_basicAt_put_", ["comment", aString]);
 return self;},
-args: [],
-source: unescape('allSubclasses%0A%09%7C%20result%20%7C%0A%09result%20%3A%3D%20self%20subclasses.%0A%09self%20subclasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20result%20addAll%3A%20each%20allSubclasses%5D.%0A%09%5Eresult'),
-messageSends: ["subclasses", "do:", "addAll:", "allSubclasses"],
+args: ["aString"],
+source: unescape('comment%3A%20aString%0A%20%20%20%20self%20basicAt%3A%20%27comment%27%20put%3A%20aString'),
+messageSends: ["basicAt:put:"],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_withAllSubclasses'),
+unescape('_commentStamp'),
 smalltalk.method({
-selector: unescape('withAllSubclasses'),
+selector: unescape('commentStamp'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_allSubclasses", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Array || Array), "_with_", [self]));
+return (function($rec){smalltalk.send($rec, "_class_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCommentReader || ClassCommentReader), "_new", []));
 return self;},
 args: [],
-source: unescape('withAllSubclasses%0A%09%5E%28Array%20with%3A%20self%29%20addAll%3A%20self%20allSubclasses%3B%20yourself'),
-messageSends: ["addAll:", "allSubclasses", "yourself", "with:"],
-referencedClasses: ["Array"]
+source: unescape('commentStamp%0A%20%20%20%20%5EClassCommentReader%20new%0A%09class%3A%20self%3B%0A%09yourself'),
+messageSends: ["class:", "yourself", "new"],
+referencedClasses: ["ClassCommentReader"]
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_prototype'),
+unescape('_commentStamp_prior_'),
 smalltalk.method({
-selector: unescape('prototype'),
+selector: unescape('commentStamp%3Aprior%3A'),
 category: 'accessing',
-fn: function (){
+fn: function (aStamp, prior){
 var self=this;
-return self.fn.prototype;
+return smalltalk.send(self, "_commentStamp", []);
 return self;},
-args: [],
-source: unescape('prototype%0A%09%3Creturn%20self.fn.prototype%3E'),
-messageSends: [],
+args: ["aStamp", "prior"],
+source: unescape('commentStamp%3A%20aStamp%20prior%3A%20prior%0A%20%20%20%20%20%20%20%20%5Eself%20commentStamp'),
+messageSends: ["commentStamp"],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_methodDictionary'),
+unescape('_compile_'),
 smalltalk.method({
-selector: unescape('methodDictionary'),
-category: 'accessing',
-fn: function (){
+selector: unescape('compile%3A'),
+category: 'compiling',
+fn: function (aString){
 var self=this;
-var dict = smalltalk.HashedCollection._new();
-	var methods = self.fn.prototype.methods;
-	for(var i in methods) {
-		if(methods[i].selector) {
-			dict._at_put_(methods[i].selector, methods[i]);
-		}
-	};
-	return dict;
+smalltalk.send(self, "_compile_category_", [aString, ""]);
 return self;},
-args: [],
-source: unescape('methodDictionary%0A%09%3Cvar%20dict%20%3D%20smalltalk.HashedCollection._new%28%29%3B%0A%09var%20methods%20%3D%20self.fn.prototype.methods%3B%0A%09for%28var%20i%20in%20methods%29%20%7B%0A%09%09if%28methods%5Bi%5D.selector%29%20%7B%0A%09%09%09dict._at_put_%28methods%5Bi%5D.selector%2C%20methods%5Bi%5D%29%3B%0A%09%09%7D%0A%09%7D%3B%0A%09return%20dict%3E'),
-messageSends: [],
+args: ["aString"],
+source: unescape('compile%3A%20aString%0A%09self%20compile%3A%20aString%20category%3A%20%27%27'),
+messageSends: ["compile:category:"],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_methodsFor_'),
+unescape('_compile_category_'),
 smalltalk.method({
-selector: unescape('methodsFor%3A'),
-category: 'accessing',
-fn: function (aString){
+selector: unescape('compile%3Acategory%3A'),
+category: 'compiling',
+fn: function (aString, anotherString){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_class_category_", [self, aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCategoryReader || ClassCategoryReader), "_new", []));
+var method=nil;
+(method=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [aString, self]));
+smalltalk.send(method, "_category_", [anotherString]);
+smalltalk.send(self, "_addCompiledMethod_", [method]);
 return self;},
-args: ["aString"],
-source: unescape('methodsFor%3A%20aString%0A%09%5EClassCategoryReader%20new%0A%09%20%20%20%20class%3A%20self%20category%3A%20aString%3B%0A%09%20%20%20%20yourself'),
-messageSends: ["class:category:", "yourself", "new"],
-referencedClasses: ["ClassCategoryReader"]
+args: ["aString", "anotherString"],
+source: unescape('compile%3A%20aString%20category%3A%20anotherString%0A%09%7C%20method%20%7C%0A%09method%20%3A%3D%20Compiler%20new%20load%3A%20aString%20forClass%3A%20self.%0A%09method%20category%3A%20anotherString.%0A%09self%20addCompiledMethod%3A%20method'),
+messageSends: ["load:forClass:", "new", "category:", "addCompiledMethod:"],
+referencedClasses: ["Compiler"]
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_addCompiledMethod_'),
+unescape('_inheritsFrom_'),
 smalltalk.method({
-selector: unescape('addCompiledMethod%3A'),
-category: 'compiling',
-fn: function (aMethod){
+selector: unescape('inheritsFrom%3A'),
+category: 'testing',
+fn: function (aClass){
 var self=this;
-smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self);
+return smalltalk.send(smalltalk.send(aClass, "_allSubclasses", []), "_includes_", [self]);
 return self;},
-args: ["aMethod"],
-source: unescape('addCompiledMethod%3A%20aMethod%0A%09%3Csmalltalk.addMethod%28aMethod.selector._asSelector%28%29%2C%20aMethod%2C%20self%29%3E'),
-messageSends: [],
+args: ["aClass"],
+source: unescape('inheritsFrom%3A%20aClass%0A%09%5EaClass%20allSubclasses%20includes%3A%20self'),
+messageSends: ["includes:", "allSubclasses"],
 referencedClasses: []
 }),
 smalltalk.Behavior);
@@ -204,83 +203,104 @@ referencedClasses: []
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_comment'),
+unescape('_methodAt_'),
 smalltalk.method({
-selector: unescape('comment'),
+selector: unescape('methodAt%3A'),
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return smalltalk.methods(self)[aString];
+return self;},
+args: ["aString"],
+source: unescape('methodAt%3A%20aString%0A%09%3Creturn%20smalltalk.methods%28self%29%5BaString%5D%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+unescape('_methodDictionary'),
+smalltalk.method({
+selector: unescape('methodDictionary'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return (($receiver = smalltalk.send(self, "_basicAt_", ["comment"])) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
+var dict = smalltalk.HashedCollection._new();
+	var methods = self.fn.prototype.methods;
+	for(var i in methods) {
+		if(methods[i].selector) {
+			dict._at_put_(methods[i].selector, methods[i]);
+		}
+	};
+	return dict;
 return self;},
 args: [],
-source: unescape('comment%0A%20%20%20%20%5E%28self%20basicAt%3A%20%27comment%27%29%20ifNil%3A%20%5B%27%27%5D'),
-messageSends: ["ifNil:", "basicAt:"],
+source: unescape('methodDictionary%0A%09%3Cvar%20dict%20%3D%20smalltalk.HashedCollection._new%28%29%3B%0A%09var%20methods%20%3D%20self.fn.prototype.methods%3B%0A%09for%28var%20i%20in%20methods%29%20%7B%0A%09%09if%28methods%5Bi%5D.selector%29%20%7B%0A%09%09%09dict._at_put_%28methods%5Bi%5D.selector%2C%20methods%5Bi%5D%29%3B%0A%09%09%7D%0A%09%7D%3B%0A%09return%20dict%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_comment_'),
+unescape('_methodsFor_'),
 smalltalk.method({
-selector: unescape('comment%3A'),
+selector: unescape('methodsFor%3A'),
 category: 'accessing',
 fn: function (aString){
 var self=this;
-smalltalk.send(self, "_basicAt_put_", ["comment", aString]);
+return (function($rec){smalltalk.send($rec, "_class_category_", [self, aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCategoryReader || ClassCategoryReader), "_new", []));
 return self;},
 args: ["aString"],
-source: unescape('comment%3A%20aString%0A%20%20%20%20self%20basicAt%3A%20%27comment%27%20put%3A%20aString'),
-messageSends: ["basicAt:put:"],
-referencedClasses: []
+source: unescape('methodsFor%3A%20aString%0A%09%5EClassCategoryReader%20new%0A%09%20%20%20%20class%3A%20self%20category%3A%20aString%3B%0A%09%20%20%20%20yourself'),
+messageSends: ["class:category:", "yourself", "new"],
+referencedClasses: ["ClassCategoryReader"]
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_commentStamp'),
+unescape('_methodsFor_stamp_'),
 smalltalk.method({
-selector: unescape('commentStamp'),
+selector: unescape('methodsFor%3Astamp%3A'),
 category: 'accessing',
-fn: function (){
+fn: function (aString, aStamp){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_class_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCommentReader || ClassCommentReader), "_new", []));
+return smalltalk.send(self, "_methodsFor_", [aString]);
 return self;},
-args: [],
-source: unescape('commentStamp%0A%20%20%20%20%5EClassCommentReader%20new%0A%09class%3A%20self%3B%0A%09yourself'),
-messageSends: ["class:", "yourself", "new"],
-referencedClasses: ["ClassCommentReader"]
+args: ["aString", "aStamp"],
+source: unescape('methodsFor%3A%20aString%20stamp%3A%20aStamp%0A%09%22Added%20for%20compatibility%2C%20right%20now%20ignores%20stamp.%22%0A%09%5Eself%20methodsFor%3A%20aString'),
+messageSends: ["methodsFor:"],
+referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_removeCompiledMethod_'),
+unescape('_name'),
 smalltalk.method({
-selector: unescape('removeCompiledMethod%3A'),
-category: 'compiling',
-fn: function (aMethod){
+selector: unescape('name'),
+category: 'accessing',
+fn: function (){
 var self=this;
-delete self.fn.prototype[aMethod.selector._asSelector()];
-	delete self.fn.prototype.methods[aMethod.selector];
-	smalltalk.init(self);;
+return self.className || nil;
 return self;},
-args: ["aMethod"],
-source: unescape('removeCompiledMethod%3A%20aMethod%0A%09%3Cdelete%20self.fn.prototype%5BaMethod.selector._asSelector%28%29%5D%3B%0A%09delete%20self.fn.prototype.methods%5BaMethod.selector%5D%3B%0A%09smalltalk.init%28self%29%3B%3E'),
+args: [],
+source: unescape('name%0A%09%3Creturn%20self.className%20%7C%7C%20nil%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_inheritsFrom_'),
+unescape('_new'),
 smalltalk.method({
-selector: unescape('inheritsFrom%3A'),
-category: 'testing',
-fn: function (aClass){
+selector: unescape('new'),
+category: 'instance creation',
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(aClass, "_allSubclasses", []), "_includes_", [self]);
+return smalltalk.send(smalltalk.send(self, "_basicNew", []), "_initialize", []);
 return self;},
-args: ["aClass"],
-source: unescape('inheritsFrom%3A%20aClass%0A%09%5EaClass%20allSubclasses%20includes%3A%20self'),
-messageSends: ["includes:", "allSubclasses"],
+args: [],
+source: unescape('new%0A%09%5Eself%20basicNew%20initialize'),
+messageSends: ["initialize", "basicNew"],
 referencedClasses: []
 }),
 smalltalk.Behavior);
@@ -324,104 +344,84 @@ referencedClasses: ["HashedCollection", "Array"]
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_allInstanceVariableNames'),
+unescape('_prototype'),
 smalltalk.method({
-selector: unescape('allInstanceVariableNames'),
+selector: unescape('prototype'),
 category: 'accessing',
 fn: function (){
 var self=this;
-var result=nil;
-(result=smalltalk.send(smalltalk.send(self, "_instanceVariableNames", []), "_copy", []));
-(($receiver = smalltalk.send(self, "_superclass", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(result, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allInstanceVariableNames", [])]);})() : nil;
-return result;
+return self.fn.prototype;
 return self;},
 args: [],
-source: unescape('allInstanceVariableNames%0A%09%7C%20result%20%7C%0A%09result%20%3A%3D%20self%20instanceVariableNames%20copy.%0A%09self%20superclass%20ifNotNil%3A%20%5B%0A%09%20%20%20%20result%20addAll%3A%20self%20superclass%20allInstanceVariableNames%5D.%0A%09%5Eresult'),
-messageSends: ["copy", "instanceVariableNames", "ifNotNil:", "superclass", "addAll:", "allInstanceVariableNames"],
+source: unescape('prototype%0A%09%3Creturn%20self.fn.prototype%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_methodAt_'),
+unescape('_removeCompiledMethod_'),
 smalltalk.method({
-selector: unescape('methodAt%3A'),
-category: 'accessing',
-fn: function (aString){
+selector: unescape('removeCompiledMethod%3A'),
+category: 'compiling',
+fn: function (aMethod){
 var self=this;
-return smalltalk.methods(self)[aString];
+delete self.fn.prototype[aMethod.selector._asSelector()];
+	delete self.fn.prototype.methods[aMethod.selector];
+	smalltalk.init(self);;
 return self;},
-args: ["aString"],
-source: unescape('methodAt%3A%20aString%0A%09%3Creturn%20smalltalk.methods%28self%29%5BaString%5D%3E'),
+args: ["aMethod"],
+source: unescape('removeCompiledMethod%3A%20aMethod%0A%09%3Cdelete%20self.fn.prototype%5BaMethod.selector._asSelector%28%29%5D%3B%0A%09delete%20self.fn.prototype.methods%5BaMethod.selector%5D%3B%0A%09smalltalk.init%28self%29%3B%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_methodsFor_stamp_'),
+unescape('_subclasses'),
 smalltalk.method({
-selector: unescape('methodsFor%3Astamp%3A'),
+selector: unescape('subclasses'),
 category: 'accessing',
-fn: function (aString, aStamp){
+fn: function (){
 var self=this;
-return smalltalk.send(self, "_methodsFor_", [aString]);
+return smalltalk.subclasses(self);
 return self;},
-args: ["aString", "aStamp"],
-source: unescape('methodsFor%3A%20aString%20stamp%3A%20aStamp%0A%09%22Added%20for%20compatibility%2C%20right%20now%20ignores%20stamp.%22%0A%09%5Eself%20methodsFor%3A%20aString'),
-messageSends: ["methodsFor:"],
+args: [],
+source: unescape('subclasses%0A%09%3Creturn%20smalltalk.subclasses%28self%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_commentStamp_prior_'),
+unescape('_superclass'),
 smalltalk.method({
-selector: unescape('commentStamp%3Aprior%3A'),
+selector: unescape('superclass'),
 category: 'accessing',
-fn: function (aStamp, prior){
-var self=this;
-return smalltalk.send(self, "_commentStamp", []);
-return self;},
-args: ["aStamp", "prior"],
-source: unescape('commentStamp%3A%20aStamp%20prior%3A%20prior%0A%20%20%20%20%20%20%20%20%5Eself%20commentStamp'),
-messageSends: ["commentStamp"],
-referencedClasses: []
-}),
-smalltalk.Behavior);
-
-smalltalk.addMethod(
-unescape('_compile_'),
-smalltalk.method({
-selector: unescape('compile%3A'),
-category: 'compiling',
-fn: function (aString){
+fn: function (){
 var self=this;
-smalltalk.send(self, "_compile_category_", [aString, ""]);
+return self.superclass || nil;
 return self;},
-args: ["aString"],
-source: unescape('compile%3A%20aString%0A%09self%20compile%3A%20aString%20category%3A%20%27%27'),
-messageSends: ["compile:category:"],
+args: [],
+source: unescape('superclass%0A%09%3Creturn%20self.superclass%20%7C%7C%20nil%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
-unescape('_compile_category_'),
+unescape('_withAllSubclasses'),
 smalltalk.method({
-selector: unescape('compile%3Acategory%3A'),
-category: 'compiling',
-fn: function (aString, anotherString){
+selector: unescape('withAllSubclasses'),
+category: 'accessing',
+fn: function (){
 var self=this;
-var method=nil;
-(method=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [aString, self]));
-smalltalk.send(method, "_category_", [anotherString]);
-smalltalk.send(self, "_addCompiledMethod_", [method]);
+return (function($rec){smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_allSubclasses", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Array || Array), "_with_", [self]));
 return self;},
-args: ["aString", "anotherString"],
-source: unescape('compile%3A%20aString%20category%3A%20anotherString%0A%09%7C%20method%20%7C%0A%09method%20%3A%3D%20Compiler%20new%20load%3A%20aString%20forClass%3A%20self.%0A%09method%20category%3A%20anotherString.%0A%09self%20addCompiledMethod%3A%20method'),
-messageSends: ["load:forClass:", "new", "category:", "addCompiledMethod:"],
-referencedClasses: ["Compiler"]
+args: [],
+source: unescape('withAllSubclasses%0A%09%5E%28Array%20with%3A%20self%29%20addAll%3A%20self%20allSubclasses%3B%20yourself'),
+messageSends: ["addAll:", "allSubclasses", "yourself", "with:"],
+referencedClasses: ["Array"]
 }),
 smalltalk.Behavior);
 
@@ -446,49 +446,48 @@ referencedClasses: []
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_'),
+unescape('_isClass'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3A'),
-category: 'class creation',
-fn: function (aString, anotherString){
+selector: unescape('isClass'),
+category: 'testing',
+fn: function (){
 var self=this;
-return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, anotherString, nil]);
+return true;
 return self;},
-args: ["aString", "anotherString"],
-source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%0A%09%22Kept%20for%20compatibility.%22%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%20package%3A%20nil'),
-messageSends: ["subclass:instanceVariableNames:package:"],
+args: [],
+source: unescape('isClass%0A%09%5Etrue'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_category_'),
+unescape('_package'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3Acategory%3A'),
-category: 'class creation',
-fn: function (aString, aString2, aString3){
+selector: unescape('package'),
+category: 'accessing',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_deprecatedAPI", []);
-return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
+return self.pkg;
 return self;},
-args: ["aString", "aString2", "aString3"],
-source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%22Kept%20for%20compatibility.%22%0A%09self%20deprecatedAPI.%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3'),
-messageSends: ["deprecatedAPI", "subclass:instanceVariableNames:package:"],
+args: [],
+source: unescape('package%0A%09%3Creturn%20self.pkg%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_isClass'),
+unescape('_package_'),
 smalltalk.method({
-selector: unescape('isClass'),
-category: 'testing',
-fn: function (){
+selector: unescape('package%3A'),
+category: 'accessing',
+fn: function (aPackage){
 var self=this;
-return true;
+self.pkg = aPackage;
 return self;},
-args: [],
-source: unescape('isClass%0A%09%5Etrue'),
+args: ["aPackage"],
+source: unescape('package%3A%20aPackage%0A%09%3Cself.pkg%20%3D%20aPackage%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -531,49 +530,50 @@ referencedClasses: []
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_classVariableNames_poolDictionaries_category_'),
+unescape('_subclass_instanceVariableNames_'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3AclassVariableNames%3ApoolDictionaries%3Acategory%3A'),
+selector: unescape('subclass%3AinstanceVariableNames%3A'),
 category: 'class creation',
-fn: function (aString, aString2, classVars, pools, aString3){
+fn: function (aString, anotherString){
 var self=this;
-return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, anotherString, nil]);
 return self;},
-args: ["aString", "aString2", "classVars", "pools", "aString3"],
-source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20classVariableNames%3A%20classVars%20poolDictionaries%3A%20pools%20category%3A%20aString3%0A%09%22Just%20ignore%20class%20variables%20and%20pools.%20Added%20for%20compatibility.%22%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3'),
+args: ["aString", "anotherString"],
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%0A%09%22Kept%20for%20compatibility.%22%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%20package%3A%20nil'),
 messageSends: ["subclass:instanceVariableNames:package:"],
 referencedClasses: []
 }),
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_package'),
+unescape('_subclass_instanceVariableNames_category_'),
 smalltalk.method({
-selector: unescape('package'),
-category: 'accessing',
-fn: function (){
+selector: unescape('subclass%3AinstanceVariableNames%3Acategory%3A'),
+category: 'class creation',
+fn: function (aString, aString2, aString3){
 var self=this;
-return self.pkg;
+smalltalk.send(self, "_deprecatedAPI", []);
+return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
 return self;},
-args: [],
-source: unescape('package%0A%09%3Creturn%20self.pkg%3E'),
-messageSends: [],
+args: ["aString", "aString2", "aString3"],
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%22Kept%20for%20compatibility.%22%0A%09self%20deprecatedAPI.%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3'),
+messageSends: ["deprecatedAPI", "subclass:instanceVariableNames:package:"],
 referencedClasses: []
 }),
 smalltalk.Class);
 
 smalltalk.addMethod(
-unescape('_package_'),
+unescape('_subclass_instanceVariableNames_classVariableNames_poolDictionaries_category_'),
 smalltalk.method({
-selector: unescape('package%3A'),
-category: 'accessing',
-fn: function (aPackage){
+selector: unescape('subclass%3AinstanceVariableNames%3AclassVariableNames%3ApoolDictionaries%3Acategory%3A'),
+category: 'class creation',
+fn: function (aString, aString2, classVars, pools, aString3){
 var self=this;
-self.pkg = aPackage;
+return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
 return self;},
-args: ["aPackage"],
-source: unescape('package%3A%20aPackage%0A%09%3Cself.pkg%20%3D%20aPackage%3E'),
-messageSends: [],
+args: ["aString", "aString2", "classVars", "pools", "aString3"],
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20classVariableNames%3A%20classVars%20poolDictionaries%3A%20pools%20category%3A%20aString3%0A%09%22Just%20ignore%20class%20variables%20and%20pools.%20Added%20for%20compatibility.%22%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3'),
+messageSends: ["subclass:instanceVariableNames:package:"],
 referencedClasses: []
 }),
 smalltalk.Class);
@@ -667,17 +667,35 @@ smalltalk.Metaclass);
 smalltalk.addClass('ClassBuilder', smalltalk.Object, [], 'Kernel-Classes');
 smalltalk.ClassBuilder.comment=unescape('ClassBuilder%20is%20responsible%20for%20compiling%20new%20classes%20or%20modifying%20existing%20classes%20in%20the%20system.%0A%0ARather%20than%20using%20ClassBuilder%20directly%20to%20compile%20a%20class%2C%20use%20%60Class%20%3E%3E%20subclass%3AinstanceVariableNames%3Apackage%3A%60.')
 smalltalk.addMethod(
-unescape('_superclass_subclass_'),
+unescape('_addSubclassOf_named_instanceVariableNames_'),
 smalltalk.method({
-selector: unescape('superclass%3Asubclass%3A'),
-category: 'class creation',
-fn: function (aClass, aString){
+selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3A'),
+category: 'private',
+fn: function (aClass, aString, aCollection){
 var self=this;
-return smalltalk.send(self, "_superclass_subclass_instanceVariableNames_package_", [aClass, aString, "", nil]);
+smalltalk.addClass(aString, aClass, aCollection);
+	    return smalltalk[aString];
+return self;},
+args: ["aClass", "aString", "aCollection"],
+source: unescape('addSubclassOf%3A%20aClass%20named%3A%20aString%20instanceVariableNames%3A%20aCollection%0A%09%3Csmalltalk.addClass%28aString%2C%20aClass%2C%20aCollection%29%3B%0A%09%20%20%20%20return%20smalltalk%5BaString%5D%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+unescape('_addSubclassOf_named_instanceVariableNames_package_'),
+smalltalk.method({
+selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3Apackage%3A'),
+category: 'private',
+fn: function (aClass, aString, aCollection, packageName){
+var self=this;
+smalltalk.addClass(aString, aClass, aCollection, packageName);
+	    return smalltalk[aString];
 return self;},
-args: ["aClass", "aString"],
-source: unescape('superclass%3A%20aClass%20subclass%3A%20aString%0A%09%5Eself%20superclass%3A%20aClass%20subclass%3A%20aString%20instanceVariableNames%3A%20%27%27%20package%3A%20nil'),
-messageSends: ["superclass:subclass:instanceVariableNames:package:"],
+args: ["aClass", "aString", "aCollection", "packageName"],
+source: unescape('addSubclassOf%3A%20aClass%20named%3A%20aString%20instanceVariableNames%3A%20aCollection%20package%3A%20packageName%0A%09%3Csmalltalk.addClass%28aString%2C%20aClass%2C%20aCollection%2C%20packageName%29%3B%0A%09%20%20%20%20return%20smalltalk%5BaString%5D%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.ClassBuilder);
@@ -700,6 +718,28 @@ referencedClasses: []
 }),
 smalltalk.ClassBuilder);
 
+smalltalk.addMethod(
+unescape('_copyClass_named_'),
+smalltalk.method({
+selector: unescape('copyClass%3Anamed%3A'),
+category: 'private',
+fn: function (aClass, aString){
+var self=this;
+var newClass=nil;
+(newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_package_", [smalltalk.send(aClass, "_superclass", []), aString, smalltalk.send(aClass, "_instanceVariableNames", []), smalltalk.send(smalltalk.send(aClass, "_package", []), "_name", [])]));
+smalltalk.send(self, "_setupClass_", [newClass]);
+smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_do_", [(function(each){smalltalk.send(newClass, "_addCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), newClass])]);return smalltalk.send(smalltalk.send(smalltalk.send(newClass, "_methodDictionary", []), "_at_", [smalltalk.send(each, "_selector", [])]), "_category_", [smalltalk.send(each, "_category", [])]);})]);
+smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_methodDictionary", []), "_values", []), "_do_", [(function(each){smalltalk.send(smalltalk.send(newClass, "_class", []), "_addCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), smalltalk.send(newClass, "_class", [])])]);return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(newClass, "_class", []), "_methodDictionary", []), "_at_", [smalltalk.send(each, "_selector", [])]), "_category_", [smalltalk.send(each, "_category", [])]);})]);
+smalltalk.send(self, "_setupClass_", [newClass]);
+return newClass;
+return self;},
+args: ["aClass", "aString"],
+source: unescape('copyClass%3A%20aClass%20named%3A%20aString%0A%09%7C%20newClass%20%7C%0A%0A%09newClass%20%3A%3D%20self%20%0A%09%09addSubclassOf%3A%20aClass%20superclass%0A%09%09named%3A%20aString%20%0A%09%09instanceVariableNames%3A%20aClass%20instanceVariableNames%20%0A%09%09package%3A%20aClass%20package%20name.%0A%0A%09self%20setupClass%3A%20newClass.%0A%0A%09aClass%20methodDictionary%20values%20do%3A%20%5B%3Aeach%20%7C%0A%09%09newClass%20addCompiledMethod%3A%20%28Compiler%20new%20load%3A%20each%20source%20forClass%3A%20newClass%29.%0A%09%09%28newClass%20methodDictionary%20at%3A%20each%20selector%29%20category%3A%20each%20category%5D.%0A%0A%09aClass%20class%20methodDictionary%20values%20do%3A%20%5B%3Aeach%20%7C%0A%09%09newClass%20class%20addCompiledMethod%3A%20%28Compiler%20new%20load%3A%20each%20source%20forClass%3A%20newClass%20class%29.%0A%09%09%28newClass%20class%20methodDictionary%20at%3A%20each%20selector%29%20category%3A%20each%20category%5D.%0A%0A%09self%20setupClass%3A%20newClass.%0A%09%5EnewClass'),
+messageSends: ["addSubclassOf:named:instanceVariableNames:package:", "superclass", "instanceVariableNames", "name", "package", "setupClass:", "do:", "values", "methodDictionary", "addCompiledMethod:", "load:forClass:", "new", "source", "category:", "at:", "selector", "category", "class"],
+referencedClasses: ["Compiler"]
+}),
+smalltalk.ClassBuilder);
+
 smalltalk.addMethod(
 unescape('_instanceVariableNamesFor_'),
 smalltalk.method({
@@ -717,34 +757,33 @@ referencedClasses: []
 smalltalk.ClassBuilder);
 
 smalltalk.addMethod(
-unescape('_addSubclassOf_named_instanceVariableNames_'),
+unescape('_setupClass_'),
 smalltalk.method({
-selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3A'),
+selector: unescape('setupClass%3A'),
 category: 'private',
-fn: function (aClass, aString, aCollection){
+fn: function (aClass){
 var self=this;
-smalltalk.addClass(aString, aClass, aCollection);
-	    return smalltalk[aString];
+smalltalk.init(aClass);;
 return self;},
-args: ["aClass", "aString", "aCollection"],
-source: unescape('addSubclassOf%3A%20aClass%20named%3A%20aString%20instanceVariableNames%3A%20aCollection%0A%09%3Csmalltalk.addClass%28aString%2C%20aClass%2C%20aCollection%29%3B%0A%09%20%20%20%20return%20smalltalk%5BaString%5D%3E'),
+args: ["aClass"],
+source: unescape('setupClass%3A%20aClass%0A%09%3Csmalltalk.init%28aClass%29%3B%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.ClassBuilder);
 
 smalltalk.addMethod(
-unescape('_setupClass_'),
+unescape('_superclass_subclass_'),
 smalltalk.method({
-selector: unescape('setupClass%3A'),
-category: 'private',
-fn: function (aClass){
+selector: unescape('superclass%3Asubclass%3A'),
+category: 'class creation',
+fn: function (aClass, aString){
 var self=this;
-smalltalk.init(aClass);;
+return smalltalk.send(self, "_superclass_subclass_instanceVariableNames_package_", [aClass, aString, "", nil]);
 return self;},
-args: ["aClass"],
-source: unescape('setupClass%3A%20aClass%0A%09%3Csmalltalk.init%28aClass%29%3B%3E'),
-messageSends: [],
+args: ["aClass", "aString"],
+source: unescape('superclass%3A%20aClass%20subclass%3A%20aString%0A%09%5Eself%20superclass%3A%20aClass%20subclass%3A%20aString%20instanceVariableNames%3A%20%27%27%20package%3A%20nil'),
+messageSends: ["superclass:subclass:instanceVariableNames:package:"],
 referencedClasses: []
 }),
 smalltalk.ClassBuilder);
@@ -768,49 +807,48 @@ referencedClasses: []
 }),
 smalltalk.ClassBuilder);
 
+
+
+smalltalk.addClass('ClassCategoryReader', smalltalk.Object, ['class', 'category', 'chunkParser'], 'Kernel-Classes');
+smalltalk.ClassCategoryReader.comment=unescape('ClassCategoryReader%20represents%20a%20mechanism%20for%20retrieving%20class%20descriptions%20stored%20on%20a%20file.')
 smalltalk.addMethod(
-unescape('_addSubclassOf_named_instanceVariableNames_package_'),
+unescape('_class_category_'),
 smalltalk.method({
-selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3Apackage%3A'),
-category: 'private',
-fn: function (aClass, aString, aCollection, packageName){
+selector: unescape('class%3Acategory%3A'),
+category: 'accessing',
+fn: function (aClass, aString){
 var self=this;
-smalltalk.addClass(aString, aClass, aCollection, packageName);
-	    return smalltalk[aString];
+(self['@class']=aClass);
+(self['@category']=aString);
 return self;},
-args: ["aClass", "aString", "aCollection", "packageName"],
-source: unescape('addSubclassOf%3A%20aClass%20named%3A%20aString%20instanceVariableNames%3A%20aCollection%20package%3A%20packageName%0A%09%3Csmalltalk.addClass%28aString%2C%20aClass%2C%20aCollection%2C%20packageName%29%3B%0A%09%20%20%20%20return%20smalltalk%5BaString%5D%3E'),
+args: ["aClass", "aString"],
+source: unescape('class%3A%20aClass%20category%3A%20aString%0A%09class%20%3A%3D%20aClass.%0A%09category%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ClassBuilder);
+smalltalk.ClassCategoryReader);
 
 smalltalk.addMethod(
-unescape('_copyClass_named_'),
+unescape('_compileMethod_'),
 smalltalk.method({
-selector: unescape('copyClass%3Anamed%3A'),
+selector: unescape('compileMethod%3A'),
 category: 'private',
-fn: function (aClass, aString){
+fn: function (aString){
 var self=this;
-var newClass=nil;
-(newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_package_", [smalltalk.send(aClass, "_superclass", []), aString, smalltalk.send(aClass, "_instanceVariableNames", []), smalltalk.send(smalltalk.send(aClass, "_package", []), "_name", [])]));
-smalltalk.send(self, "_setupClass_", [newClass]);
-smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_do_", [(function(each){smalltalk.send(newClass, "_addCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), newClass])]);return smalltalk.send(smalltalk.send(smalltalk.send(newClass, "_methodDictionary", []), "_at_", [smalltalk.send(each, "_selector", [])]), "_category_", [smalltalk.send(each, "_category", [])]);})]);
-smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_methodDictionary", []), "_values", []), "_do_", [(function(each){smalltalk.send(smalltalk.send(newClass, "_class", []), "_addCompiledMethod_", [smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [smalltalk.send(each, "_source", []), smalltalk.send(newClass, "_class", [])])]);return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(newClass, "_class", []), "_methodDictionary", []), "_at_", [smalltalk.send(each, "_selector", [])]), "_category_", [smalltalk.send(each, "_category", [])]);})]);
-smalltalk.send(self, "_setupClass_", [newClass]);
-return newClass;
+var method=nil;
+var compiler=nil;
+(method=smalltalk.send((compiler=smalltalk.send((smalltalk.Compiler || Compiler), "_new", [])), "_load_forClass_", [aString, self['@class']]));
+smalltalk.send(method, "_category_", [self['@category']]);
+smalltalk.send(self['@class'], "_addCompiledMethod_", [method]);
+smalltalk.send(compiler, "_setupClass_", [self['@class']]);
 return self;},
-args: ["aClass", "aString"],
-source: unescape('copyClass%3A%20aClass%20named%3A%20aString%0A%09%7C%20newClass%20%7C%0A%0A%09newClass%20%3A%3D%20self%20%0A%09%09addSubclassOf%3A%20aClass%20superclass%0A%09%09named%3A%20aString%20%0A%09%09instanceVariableNames%3A%20aClass%20instanceVariableNames%20%0A%09%09package%3A%20aClass%20package%20name.%0A%0A%09self%20setupClass%3A%20newClass.%0A%0A%09aClass%20methodDictionary%20values%20do%3A%20%5B%3Aeach%20%7C%0A%09%09newClass%20addCompiledMethod%3A%20%28Compiler%20new%20load%3A%20each%20source%20forClass%3A%20newClass%29.%0A%09%09%28newClass%20methodDictionary%20at%3A%20each%20selector%29%20category%3A%20each%20category%5D.%0A%0A%09aClass%20class%20methodDictionary%20values%20do%3A%20%5B%3Aeach%20%7C%0A%09%09newClass%20class%20addCompiledMethod%3A%20%28Compiler%20new%20load%3A%20each%20source%20forClass%3A%20newClass%20class%29.%0A%09%09%28newClass%20class%20methodDictionary%20at%3A%20each%20selector%29%20category%3A%20each%20category%5D.%0A%0A%09self%20setupClass%3A%20newClass.%0A%09%5EnewClass'),
-messageSends: ["addSubclassOf:named:instanceVariableNames:package:", "superclass", "instanceVariableNames", "name", "package", "setupClass:", "do:", "values", "methodDictionary", "addCompiledMethod:", "load:forClass:", "new", "source", "category:", "at:", "selector", "category", "class"],
+args: ["aString"],
+source: unescape('compileMethod%3A%20aString%0A%09%7C%20method%20compiler%20%7C%0A%09method%20%3A%3D%20%28compiler%20%3A%3D%20Compiler%20new%29%20load%3A%20aString%20forClass%3A%20class.%0A%09method%20category%3A%20category.%0A%09class%20addCompiledMethod%3A%20method.%0A%09compiler%20setupClass%3A%20class.'),
+messageSends: ["load:forClass:", "new", "category:", "addCompiledMethod:", "setupClass:"],
 referencedClasses: ["Compiler"]
 }),
-smalltalk.ClassBuilder);
-
-
+smalltalk.ClassCategoryReader);
 
-smalltalk.addClass('ClassCategoryReader', smalltalk.Object, ['class', 'category', 'chunkParser'], 'Kernel-Classes');
-smalltalk.ClassCategoryReader.comment=unescape('ClassCategoryReader%20represents%20a%20mechanism%20for%20retrieving%20class%20descriptions%20stored%20on%20a%20file.')
 smalltalk.addMethod(
 unescape('_initialize'),
 smalltalk.method({
@@ -828,23 +866,6 @@ referencedClasses: ["ChunkParser"]
 }),
 smalltalk.ClassCategoryReader);
 
-smalltalk.addMethod(
-unescape('_class_category_'),
-smalltalk.method({
-selector: unescape('class%3Acategory%3A'),
-category: 'accessing',
-fn: function (aClass, aString){
-var self=this;
-(self['@class']=aClass);
-(self['@category']=aString);
-return self;},
-args: ["aClass", "aString"],
-source: unescape('class%3A%20aClass%20category%3A%20aString%0A%09class%20%3A%3D%20aClass.%0A%09category%20%3A%3D%20aString'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.ClassCategoryReader);
-
 smalltalk.addMethod(
 unescape('_scanFrom_'),
 smalltalk.method({
@@ -862,25 +883,6 @@ referencedClasses: []
 }),
 smalltalk.ClassCategoryReader);
 
-smalltalk.addMethod(
-unescape('_compileMethod_'),
-smalltalk.method({
-selector: unescape('compileMethod%3A'),
-category: 'private',
-fn: function (aString){
-var self=this;
-var method=nil;
-(method=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [aString, self['@class']]));
-smalltalk.send(method, "_category_", [self['@category']]);
-smalltalk.send(self['@class'], "_addCompiledMethod_", [method]);
-return self;},
-args: ["aString"],
-source: unescape('compileMethod%3A%20aString%0A%09%7C%20method%20%7C%0A%09method%20%3A%3D%20Compiler%20new%20load%3A%20aString%20forClass%3A%20class.%0A%09method%20category%3A%20category.%0A%09class%20addCompiledMethod%3A%20method'),
-messageSends: ["load:forClass:", "new", "category:", "addCompiledMethod:"],
-referencedClasses: ["Compiler"]
-}),
-smalltalk.ClassCategoryReader);
-
 
 
 smalltalk.addClass('ClassCommentReader', smalltalk.Object, ['class', 'chunkParser'], 'Kernel-Classes');
@@ -901,6 +903,23 @@ referencedClasses: []
 }),
 smalltalk.ClassCommentReader);
 
+smalltalk.addMethod(
+unescape('_initialize'),
+smalltalk.method({
+selector: unescape('initialize'),
+category: 'initialization',
+fn: function (){
+var self=this;
+smalltalk.send(self, "_initialize", [], smalltalk.Object);
+(self['@chunkParser']=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_new", []));
+return self;},
+args: [],
+source: unescape('initialize%0A%09super%20initialize.%0A%09chunkParser%20%3A%3D%20ChunkParser%20new.'),
+messageSends: ["initialize", "new"],
+referencedClasses: ["ChunkParser"]
+}),
+smalltalk.ClassCommentReader);
+
 smalltalk.addMethod(
 unescape('_scanFrom_'),
 smalltalk.method({
@@ -919,23 +938,6 @@ referencedClasses: []
 }),
 smalltalk.ClassCommentReader);
 
-smalltalk.addMethod(
-unescape('_initialize'),
-smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
-fn: function (){
-var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Object);
-(self['@chunkParser']=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_new", []));
-return self;},
-args: [],
-source: unescape('initialize%0A%09super%20initialize.%0A%09chunkParser%20%3A%3D%20ChunkParser%20new.'),
-messageSends: ["initialize", "new"],
-referencedClasses: ["ChunkParser"]
-}),
-smalltalk.ClassCommentReader);
-
 smalltalk.addMethod(
 unescape('_setComment_'),
 smalltalk.method({
@@ -954,3 +956,140 @@ smalltalk.ClassCommentReader);
 
 
 
+smalltalk.addClass('ClassSorterNode', smalltalk.Object, ['theClass', 'level', 'nodes'], 'Kernel-Classes');
+smalltalk.addMethod(
+unescape('_getNodesFrom_'),
+smalltalk.method({
+selector: unescape('getNodesFrom%3A'),
+category: 'accessing',
+fn: function (aCollection){
+var self=this;
+var children=nil;
+var others=nil;
+(children=[]);
+(others=[]);
+smalltalk.send(aCollection, "_do_", [(function(each){return ((($receiver = smalltalk.send(smalltalk.send(each, "_superclass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
+(self['@nodes']=smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassSorterNode || ClassSorterNode), "_on_classes_level_", [each, others, ((($receiver = smalltalk.send(self, "_level", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})]));
+return self;},
+args: ["aCollection"],
+source: unescape('getNodesFrom%3A%20aCollection%0A%09%7C%20children%20others%20%7C%0A%09children%20%3A%3D%20%23%28%29.%0A%09others%20%3A%3D%20%23%28%29.%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%28each%20superclass%20%3D%20self%20theClass%29%0A%09%09%09ifTrue%3A%20%5Bchildren%20add%3A%20each%5D%0A%09%09%09ifFalse%3A%20%5Bothers%20add%3A%20each%5D%5D.%0A%09nodes%3A%3D%20children%20collect%3A%20%5B%3Aeach%20%7C%0A%09%09ClassSorterNode%20on%3A%20each%20classes%3A%20others%20level%3A%20self%20level%20+%201%5D'),
+messageSends: ["do:", "ifTrue:ifFalse:", unescape("%3D"), "superclass", "theClass", "add:", "collect:", "on:classes:level:", unescape("+"), "level"],
+referencedClasses: ["ClassSorterNode"]
+}),
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_level'),
+smalltalk.method({
+selector: unescape('level'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@level'];
+return self;},
+args: [],
+source: unescape('level%0A%09%5Elevel'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_level_'),
+smalltalk.method({
+selector: unescape('level%3A'),
+category: 'accessing',
+fn: function (anInteger){
+var self=this;
+(self['@level']=anInteger);
+return self;},
+args: ["anInteger"],
+source: unescape('level%3A%20anInteger%0A%09level%20%3A%3D%20anInteger'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_nodes'),
+smalltalk.method({
+selector: unescape('nodes'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@nodes'];
+return self;},
+args: [],
+source: unescape('nodes%0A%09%5Enodes'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_theClass'),
+smalltalk.method({
+selector: unescape('theClass'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@theClass'];
+return self;},
+args: [],
+source: unescape('theClass%0A%09%5EtheClass'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_theClass_'),
+smalltalk.method({
+selector: unescape('theClass%3A'),
+category: 'accessing',
+fn: function (aClass){
+var self=this;
+(self['@theClass']=aClass);
+return self;},
+args: ["aClass"],
+source: unescape('theClass%3A%20aClass%0A%09theClass%20%3A%3D%20aClass'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassSorterNode);
+
+smalltalk.addMethod(
+unescape('_traverseClassesWith_'),
+smalltalk.method({
+selector: unescape('traverseClassesWith%3A'),
+category: 'visiting',
+fn: function (aCollection){
+var self=this;
+smalltalk.send(aCollection, "_add_", [smalltalk.send(self, "_theClass", [])]);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_nodes", []), "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(smalltalk.send(a, "_theClass", []), "_name", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", [])]));})]), "_do_", [(function(aNode){return smalltalk.send(aNode, "_traverseClassesWith_", [aCollection]);})]);
+return self;},
+args: ["aCollection"],
+source: unescape('traverseClassesWith%3A%20aCollection%0A%09%22sort%20classes%20alphabetically%20Issue%20%23143%22%0A%0A%09aCollection%20add%3A%20self%20theClass.%0A%09%28self%20nodes%20sorted%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20theClass%20name%20%3C%3D%20b%20theClass%20name%20%5D%29%20do%3A%20%5B%3AaNode%20%7C%0A%09%09aNode%20traverseClassesWith%3A%20aCollection%20%5D.'),
+messageSends: ["add:", "theClass", "do:", "sorted:", "nodes", unescape("%3C%3D"), "name", "traverseClassesWith:"],
+referencedClasses: []
+}),
+smalltalk.ClassSorterNode);
+
+
+smalltalk.addMethod(
+unescape('_on_classes_level_'),
+smalltalk.method({
+selector: unescape('on%3Aclasses%3Alevel%3A'),
+category: 'instance creation',
+fn: function (aClass, aCollection, anInteger){
+var self=this;
+return (function($rec){smalltalk.send($rec, "_theClass_", [aClass]);smalltalk.send($rec, "_level_", [anInteger]);smalltalk.send($rec, "_getNodesFrom_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return self;},
+args: ["aClass", "aCollection", "anInteger"],
+source: unescape('on%3A%20aClass%20classes%3A%20aCollection%20level%3A%20anInteger%0A%09%5Eself%20new%0A%09%09theClass%3A%20aClass%3B%0A%09%09level%3A%20anInteger%3B%0A%09%09getNodesFrom%3A%20aCollection%3B%0A%09%09yourself'),
+messageSends: ["theClass:", "level:", "getNodesFrom:", "yourself", "new"],
+referencedClasses: []
+}),
+smalltalk.ClassSorterNode.klass);
+
+
diff --git a/amber/src/js/Kernel-Collections.deploy.js b/amber/src/js/Kernel-Collections.deploy.js
index ebb1621f202..ff9981ceb09 100644
--- a/amber/src/js/Kernel-Collections.deploy.js
+++ b/amber/src/js/Kernel-Collections.deploy.js
@@ -12,34 +12,36 @@ return self;}
 smalltalk.Association);
 
 smalltalk.addMethod(
-unescape('_key_'),
+unescape('_key'),
 smalltalk.method({
-selector: unescape('key%3A'),
-fn: function (aKey) {
+selector: unescape('key'),
+fn: function () {
 var self=this;
-(self['@key']=aKey);
+return self['@key'];
 return self;}
 }),
 smalltalk.Association);
 
 smalltalk.addMethod(
-unescape('_key'),
+unescape('_key_'),
 smalltalk.method({
-selector: unescape('key'),
-fn: function () {
+selector: unescape('key%3A'),
+fn: function (aKey) {
 var self=this;
-return self['@key'];
+(self['@key']=aKey);
 return self;}
 }),
 smalltalk.Association);
 
 smalltalk.addMethod(
-unescape('_value_'),
+unescape('_storeOn_'),
 smalltalk.method({
-selector: unescape('value%3A'),
-fn: function (aValue) {
+selector: unescape('storeOn%3A'),
+fn: function (aStream) {
 var self=this;
-(self['@value']=aValue);
+smalltalk.send(self['@key'], "_storeOn_", [aStream]);
+smalltalk.send(aStream, "_nextPutAll_", [unescape("-%3E")]);
+smalltalk.send(self['@value'], "_storeOn_", [aStream]);
 return self;}
 }),
 smalltalk.Association);
@@ -56,14 +58,12 @@ return self;}
 smalltalk.Association);
 
 smalltalk.addMethod(
-unescape('_storeOn_'),
+unescape('_value_'),
 smalltalk.method({
-selector: unescape('storeOn%3A'),
-fn: function (aStream) {
+selector: unescape('value%3A'),
+fn: function (aValue) {
 var self=this;
-smalltalk.send(self['@key'], "_storeOn_", [aStream]);
-smalltalk.send(aStream, "_nextPutAll_", [unescape("-%3E")]);
-smalltalk.send(self['@value'], "_storeOn_", [aStream]);
+(self['@value']=aValue);
 return self;}
 }),
 smalltalk.Association);
@@ -81,139 +81,158 @@ return self;}
 smalltalk.Association.klass);
 
 
-smalltalk.addClass('Stream', smalltalk.Object, ['collection', 'position', 'streamSize'], 'Kernel-Collections');
+smalltalk.addClass('Collection', smalltalk.Object, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_collection'),
+unescape('__comma'),
 smalltalk.method({
-selector: unescape('collection'),
-fn: function () {
+selector: unescape('%2C'),
+fn: function (aCollection) {
 var self=this;
-return self['@collection'];
+return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_setCollection_'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('setCollection%3A'),
+selector: unescape('add%3A'),
+fn: function (anObject) {
+var self=this;
+smalltalk.send(self, "_subclassResponsibility", []);
+return self;}
+}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+unescape('_addAll_'),
+smalltalk.method({
+selector: unescape('addAll%3A'),
 fn: function (aCollection) {
 var self=this;
-(self['@collection']=aCollection);
+smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(self, "_add_", [each]);})]);
+return aCollection;
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_position'),
+unescape('_asArray'),
 smalltalk.method({
-selector: unescape('position'),
+selector: unescape('asArray'),
 fn: function () {
 var self=this;
-return (($receiver = self['@position']) == nil || $receiver == undefined) ? (function(){return (self['@position']=(0));})() : $receiver;
+return smalltalk.send((smalltalk.Array || Array), "_withAll_", [self]);
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_position_'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('position%3A'),
-fn: function (anInteger) {
+selector: unescape('asJSON'),
+fn: function (){
 var self=this;
-(self['@position']=anInteger);
+return smalltalk.send(smalltalk.send(self, "_asArray", []), "_collect_", [(function(each){return smalltalk.send(each, "_asJSON", []);})]);
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_streamSize'),
+unescape('_asOrderedCollection'),
 smalltalk.method({
-selector: unescape('streamSize'),
+selector: unescape('asOrderedCollection'),
 fn: function () {
 var self=this;
-return self['@streamSize'];
+return smalltalk.send(self, "_asArray", []);
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_setStreamSize_'),
+unescape('_asSet'),
 smalltalk.method({
-selector: unescape('setStreamSize%3A'),
-fn: function (anInteger) {
+selector: unescape('asSet'),
+fn: function () {
 var self=this;
-(self['@streamSize']=anInteger);
+return smalltalk.send((smalltalk.Set || Set), "_withAll_", [self]);
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_contents'),
+unescape('_collect_'),
 smalltalk.method({
-selector: unescape('contents'),
-fn: function () {
+selector: unescape('collect%3A'),
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [(1), smalltalk.send(self, "_streamSize", [])]);
+var newCollection=nil;
+(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_do_", [(function(each){return smalltalk.send(newCollection, "_add_", [smalltalk.send(aBlock, "_value_", [each])]);})]);
+return newCollection;
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_copyWith_'),
 smalltalk.method({
-selector: unescape('size'),
-fn: function () {
+selector: unescape('copyWith%3A'),
+fn: function (anObject) {
 var self=this;
-return smalltalk.send(self, "_streamSize", []);
+return (function($rec){smalltalk.send($rec, "_add_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_reset'),
+unescape('_copyWithAll_'),
 smalltalk.method({
-selector: unescape('reset'),
-fn: function () {
+selector: unescape('copyWithAll%3A'),
+fn: function (aCollection) {
 var self=this;
-smalltalk.send(self, "_position_", [(0)]);
+return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_close'),
+unescape('_copyWithoutAll_'),
 smalltalk.method({
-selector: unescape('close'),
-fn: function () {
+selector: unescape('copyWithoutAll%3A'),
+fn: function (aCollection) {
 var self=this;
-
+return smalltalk.send(self, "_reject_", [(function(each){return smalltalk.send(aCollection, "_includes_", [each]);})]);
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_flush'),
+unescape('_detect_'),
 smalltalk.method({
-selector: unescape('flush'),
-fn: function () {
+selector: unescape('detect%3A'),
+fn: function (aBlock) {
 var self=this;
-
+return smalltalk.send(self, "_detect_ifNone_", [aBlock, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_resetContents'),
+unescape('_detect_ifNone_'),
 smalltalk.method({
-selector: unescape('resetContents'),
-fn: function () {
+selector: unescape('detect%3AifNone%3A'),
+fn: function (aBlock, anotherBlock) {
 var self=this;
-smalltalk.send(self, "_reset", []);
-smalltalk.send(self, "_setStreamSize_", [(0)]);
+
+		for(var i = 0; i < self.length; i++)
+			if(aBlock(self[i]))
+				return self[i];
+		return anotherBlock();
+	;
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
 unescape('_do_'),
@@ -221,216 +240,197 @@ smalltalk.method({
 selector: unescape('do%3A'),
 fn: function (aBlock) {
 var self=this;
-(function(){while(!(function(){return smalltalk.send(self, "_atEnd", []);})()) {(function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_next", [])]);})()}})();
+for(var i=0;i<self.length;i++){aBlock(self[i]);};
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_setToEnd'),
+unescape('_do_separatedBy_'),
 smalltalk.method({
-selector: unescape('setToEnd'),
-fn: function () {
+selector: unescape('do%3AseparatedBy%3A'),
+fn: function (aBlock, anotherBlock) {
 var self=this;
-smalltalk.send(self, "_position_", [smalltalk.send(self, "_size", [])]);
+var first=nil;
+(first=true);
+smalltalk.send(self, "_do_", [(function(each){((($receiver = first).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (first=false);})() : (function(){return smalltalk.send(anotherBlock, "_value", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (first=false);}), (function(){return smalltalk.send(anotherBlock, "_value", []);})]));return smalltalk.send(aBlock, "_value_", [each]);})]);
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_skip_'),
+unescape('_errorNotFound'),
 smalltalk.method({
-selector: unescape('skip%3A'),
-fn: function (anInteger) {
+selector: unescape('errorNotFound'),
+fn: function () {
 var self=this;
-smalltalk.send(self, "_position_", [smalltalk.send(((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +anInteger : smalltalk.send($receiver, "__plus", [anInteger])), "_min_max_", [smalltalk.send(self, "_size", []), (0)])]);
+smalltalk.send(self, "_error_", ["Object is not in the collection"]);
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_next'),
+unescape('_ifEmpty_'),
 smalltalk.method({
-selector: unescape('next'),
-fn: function () {
+selector: unescape('ifEmpty%3A'),
+fn: function (aBlock){
 var self=this;
-return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return nil;})() : (function(){smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);return smalltalk.send(self['@collection'], "_at_", [smalltalk.send(self, "_position", [])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return nil;}), (function(){smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);return smalltalk.send(self['@collection'], "_at_", [smalltalk.send(self, "_position", [])]);})]));
+return ((($receiver = smalltalk.send(self, "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(aBlock, "_value", []);})() : (function(){return self;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(aBlock, "_value", []);}), (function(){return self;})]));
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_next_'),
+unescape('_ifNotEmpty_'),
 smalltalk.method({
-selector: unescape('next%3A'),
-fn: function (anInteger) {
+selector: unescape('ifNotEmpty%3A'),
+fn: function (aBlock) {
 var self=this;
-var tempCollection=nil;
-(tempCollection=smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_class", []), "_new", []));
-smalltalk.send(anInteger, "_timesRepeat_", [(function(){return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(tempCollection, "_add_", [smalltalk.send(self, "_next", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(tempCollection, "_add_", [smalltalk.send(self, "_next", [])]);})]));})]);
-return tempCollection;
+smalltalk.send(smalltalk.send(self, "_notEmpty", []), "_ifTrue_", [aBlock]);
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_nextPut_'),
+unescape('_includes_'),
 smalltalk.method({
-selector: unescape('nextPut%3A'),
+selector: unescape('includes%3A'),
 fn: function (anObject) {
 var self=this;
-smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);
-smalltalk.send(smalltalk.send(self, "_collection", []), "_at_put_", [smalltalk.send(self, "_position", []), anObject]);
-smalltalk.send(self, "_setStreamSize_", [smalltalk.send(smalltalk.send(self, "_streamSize", []), "_max_", [smalltalk.send(self, "_position", [])])]);
+
+		var i = self.length;
+		while (i--) {
+			if (smalltalk.send(self[i], "__eq", [anObject])) {return true;}	
+		}
+		return false
+	;
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_nextPutAll_'),
+unescape('_inject_into_'),
 smalltalk.method({
-selector: unescape('nextPutAll%3A'),
-fn: function (aCollection) {
+selector: unescape('inject%3Ainto%3A'),
+fn: function (anObject, aBlock) {
 var self=this;
-smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(self, "_nextPut_", [each]);})]);
+var result=nil;
+(result=anObject);
+smalltalk.send(self, "_do_", [(function(each){return (result=smalltalk.send(aBlock, "_value_value_", [result, each]));})]);
+return result;
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_peek'),
+unescape('_isEmpty'),
 smalltalk.method({
-selector: unescape('peek'),
+selector: unescape('isEmpty'),
 fn: function () {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_collection", []), "_at_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_collection", []), "_at_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})]));
-return self;}
-}),
-smalltalk.Stream);
-
-smalltalk.addMethod(
-unescape('_atEnd'),
-smalltalk.method({
-selector: unescape('atEnd'),
-fn: function () {
-var self=this;
-return smalltalk.send(smalltalk.send(self, "_position", []), "__eq", [smalltalk.send(self, "_size", [])]);
+return smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [(0)]);
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_atStart'),
+unescape('_notEmpty'),
 smalltalk.method({
-selector: unescape('atStart'),
+selector: unescape('notEmpty'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_position", []), "__eq", [(0)]);
+return smalltalk.send(smalltalk.send(self, "_isEmpty", []), "_not", []);
 return self;}
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_isEmpty'),
+unescape('_readStream'),
 smalltalk.method({
-selector: unescape('isEmpty'),
+selector: unescape('readStream'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [(0)]);
-return self;}
-}),
-smalltalk.Stream);
-
-
-smalltalk.addMethod(
-unescape('_on_'),
-smalltalk.method({
-selector: unescape('on%3A'),
-fn: function (aCollection) {
-var self=this;
-return (function($rec){smalltalk.send($rec, "_setCollection_", [aCollection]);smalltalk.send($rec, "_setStreamSize_", [smalltalk.send(aCollection, "_size", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return smalltalk.send(self, "_stream", []);
 return self;}
 }),
-smalltalk.Stream.klass);
-
+smalltalk.Collection);
 
-smalltalk.addClass('RegularExpression', smalltalk.Object, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_compile_'),
+unescape('_reject_'),
 smalltalk.method({
-selector: unescape('compile%3A'),
-fn: function (aString) {
+selector: unescape('reject%3A'),
+fn: function (aBlock) {
 var self=this;
-return self.compile(aString);
+return smalltalk.send(self, "_select_", [(function(each){return smalltalk.send(smalltalk.send(aBlock, "_value_", [each]), "__eq", [false]);})]);
 return self;}
 }),
-smalltalk.RegularExpression);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_exec_'),
+unescape('_remove_'),
 smalltalk.method({
-selector: unescape('exec%3A'),
-fn: function (aString) {
+selector: unescape('remove%3A'),
+fn: function (anObject) {
 var self=this;
-return self.exec(aString) || nil;
+return smalltalk.send(self, "_remove_ifAbsent_", [anObject, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
 return self;}
 }),
-smalltalk.RegularExpression);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_test_'),
+unescape('_remove_ifAbsent_'),
 smalltalk.method({
-selector: unescape('test%3A'),
-fn: function (aString) {
+selector: unescape('remove%3AifAbsent%3A'),
+fn: function (anObject, aBlock) {
 var self=this;
-return self.test(aString);
+smalltalk.send(self, "_subclassResponsibility", []);
 return self;}
 }),
-smalltalk.RegularExpression);
-
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_fromString_flag_'),
+unescape('_select_'),
 smalltalk.method({
-selector: unescape('fromString%3Aflag%3A'),
-fn: function (aString, anotherString) {
+selector: unescape('select%3A'),
+fn: function (aBlock) {
 var self=this;
-return new RegExp(aString, anotherString);
+var stream=nil;
+(stream=smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_new", []), "_writeStream", []));
+smalltalk.send(self, "_do_", [(function(each){return ((($receiver = smalltalk.send(aBlock, "_value_", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(stream, "_nextPut_", [each]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(stream, "_nextPut_", [each]);})]));})]);
+return smalltalk.send(stream, "_contents", []);
 return self;}
 }),
-smalltalk.RegularExpression.klass);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_fromString_'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('fromString%3A'),
-fn: function (aString) {
+selector: unescape('size'),
+fn: function () {
 var self=this;
-return smalltalk.send(self, "_fromString_flag_", [aString, ""]);
+smalltalk.send(self, "_subclassResponsibility", []);
 return self;}
 }),
-smalltalk.RegularExpression.klass);
-
+smalltalk.Collection);
 
-smalltalk.addClass('Collection', smalltalk.Object, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_stream'),
 smalltalk.method({
-selector: unescape('size'),
+selector: unescape('stream'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
+return smalltalk.send(smalltalk.send(self, "_streamClass", []), "_on_", [self]);
 return self;}
 }),
 smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_readStream'),
+unescape('_streamClass'),
 smalltalk.method({
-selector: unescape('readStream'),
+selector: unescape('streamClass'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_stream", []);
+return smalltalk.send(smalltalk.send(self, "_class", []), "_streamClass", []);
 return self;}
 }),
 smalltalk.Collection);
@@ -446,16 +446,17 @@ return self;}
 }),
 smalltalk.Collection);
 
+
 smalltalk.addMethod(
-unescape('_stream'),
+unescape('_new_'),
 smalltalk.method({
-selector: unescape('stream'),
-fn: function () {
+selector: unescape('new%3A'),
+fn: function (anInteger) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_streamClass", []), "_on_", [self]);
+return smalltalk.send(self, "_new", []);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
 
 smalltalk.addMethod(
 unescape('_streamClass'),
@@ -463,607 +464,655 @@ smalltalk.method({
 selector: unescape('streamClass'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_streamClass", []);
+return (smalltalk.Stream || Stream);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
 
 smalltalk.addMethod(
-unescape('_add_'),
+unescape('_with_'),
 smalltalk.method({
-selector: unescape('add%3A'),
+selector: unescape('with%3A'),
 fn: function (anObject) {
 var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
+return (function($rec){smalltalk.send($rec, "_add_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
 
 smalltalk.addMethod(
-unescape('_addAll_'),
+unescape('_with_with_'),
 smalltalk.method({
-selector: unescape('addAll%3A'),
-fn: function (aCollection) {
+selector: unescape('with%3Awith%3A'),
+fn: function (anObject, anotherObject) {
 var self=this;
-smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(self, "_add_", [each]);})]);
-return aCollection;
+return (function($rec){smalltalk.send($rec, "_add_", [anObject]);smalltalk.send($rec, "_add_", [anotherObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
 
 smalltalk.addMethod(
-unescape('__comma'),
+unescape('_with_with_with_'),
 smalltalk.method({
-selector: unescape('%2C'),
-fn: function (aCollection) {
+selector: unescape('with%3Awith%3Awith%3A'),
+fn: function (firstObject, secondObject, thirdObject) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
+return (function($rec){smalltalk.send($rec, "_add_", [firstObject]);smalltalk.send($rec, "_add_", [secondObject]);smalltalk.send($rec, "_add_", [thirdObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
 
 smalltalk.addMethod(
-unescape('_copyWith_'),
+unescape('_withAll_'),
 smalltalk.method({
-selector: unescape('copyWith%3A'),
-fn: function (anObject) {
+selector: unescape('withAll%3A'),
+fn: function (aCollection) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_add_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
+return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
 
+
+smalltalk.addClass('HashedCollection', smalltalk.Collection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_copyWithAll_'),
+unescape('__comma'),
 smalltalk.method({
-selector: unescape('copyWithAll%3A'),
+selector: unescape('%2C'),
 fn: function (aCollection) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
+smalltalk.send(self, "_shouldNotImplement", []);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_asArray'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('asArray'),
-fn: function () {
+selector: unescape('%3D'),
+fn: function (aHashedCollection) {
 var self=this;
-return smalltalk.send((smalltalk.Array || Array), "_withAll_", [self]);
-return self;}
+try{((($receiver = smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aHashedCollection, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
+((($receiver = smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [smalltalk.send(aHashedCollection, "_size", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
+(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return smalltalk.send(smalltalk.send(self, "_associations", []), "__eq", [smalltalk.send(aHashedCollection, "_associations", [])])}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_do_'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('do%3A'),
-fn: function (aBlock) {
+selector: unescape('add%3A'),
+fn: function (anAssociation) {
 var self=this;
-for(var i=0;i<self.length;i++){aBlock(self[i]);};
+smalltalk.send(self, "_at_put_", [smalltalk.send(anAssociation, "_key", []), smalltalk.send(anAssociation, "_value", [])]);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_collect_'),
+unescape('_addAll_'),
 smalltalk.method({
-selector: unescape('collect%3A'),
-fn: function (aBlock) {
+selector: unescape('addAll%3A'),
+fn: function (aHashedCollection) {
 var self=this;
-var newCollection=nil;
-(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_do_", [(function(each){return smalltalk.send(newCollection, "_add_", [smalltalk.send(aBlock, "_value_", [each])]);})]);
-return newCollection;
+smalltalk.send(self, "_addAll_", [smalltalk.send(aHashedCollection, "_associations", [])], smalltalk.Collection);
+return aHashedCollection;
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_detect_'),
+unescape('_asDictionary'),
 smalltalk.method({
-selector: unescape('detect%3A'),
-fn: function (aBlock) {
+selector: unescape('asDictionary'),
+fn: function () {
 var self=this;
-return smalltalk.send(self, "_detect_ifNone_", [aBlock, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
+return smalltalk.send((smalltalk.Dictionary || Dictionary), "_fromPairs_", [smalltalk.send(self, "_associations", [])]);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_detect_ifNone_'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('detect%3AifNone%3A'),
-fn: function (aBlock, anotherBlock) {
+selector: unescape('asJSON'),
+fn: function (){
 var self=this;
-
-		for(var i = 0; i < self.length; i++)
-			if(aBlock(self[i]))
-				return self[i];
-		return anotherBlock();
-	;
+var c=nil;
+(c=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(c, "_at_put_", [key, smalltalk.send(value, "_asJSON", [])]);})]);
+return c;
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_do_separatedBy_'),
+unescape('_associations'),
 smalltalk.method({
-selector: unescape('do%3AseparatedBy%3A'),
-fn: function (aBlock, anotherBlock) {
+selector: unescape('associations'),
+fn: function () {
 var self=this;
-var first=nil;
-(first=true);
-smalltalk.send(self, "_do_", [(function(each){((($receiver = first).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (first=false);})() : (function(){return smalltalk.send(anotherBlock, "_value", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (first=false);}), (function(){return smalltalk.send(anotherBlock, "_value", []);})]));return smalltalk.send(aBlock, "_value_", [each]);})]);
+var associations=nil;
+(associations=[]);
+smalltalk.send(smalltalk.send(self, "_keys", []), "_do_", [(function(each){return smalltalk.send(associations, "_add_", [smalltalk.send((smalltalk.Association || Association), "_key_value_", [each, smalltalk.send(self, "_at_", [each])])]);})]);
+return associations;
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_inject_into_'),
+unescape('_associationsDo_'),
 smalltalk.method({
-selector: unescape('inject%3Ainto%3A'),
-fn: function (anObject, aBlock) {
+selector: unescape('associationsDo%3A'),
+fn: function (aBlock) {
 var self=this;
-var result=nil;
-(result=anObject);
-smalltalk.send(self, "_do_", [(function(each){return (result=smalltalk.send(aBlock, "_value_value_", [result, each]));})]);
-return result;
+smalltalk.send(smalltalk.send(self, "_associations", []), "_do_", [aBlock]);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_reject_'),
+unescape('_at_'),
 smalltalk.method({
-selector: unescape('reject%3A'),
-fn: function (aBlock) {
+selector: unescape('at%3A'),
+fn: function (aKey) {
 var self=this;
-return smalltalk.send(self, "_select_", [(function(each){return smalltalk.send(smalltalk.send(aBlock, "_value_", [each]), "__eq", [false]);})]);
+return smalltalk.send(self, "_at_ifAbsent_", [aKey, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_select_'),
+unescape('_at_ifAbsent_'),
 smalltalk.method({
-selector: unescape('select%3A'),
-fn: function (aBlock) {
+selector: unescape('at%3AifAbsent%3A'),
+fn: function (aKey, aBlock) {
 var self=this;
-var stream=nil;
-(stream=smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_new", []), "_writeStream", []));
-smalltalk.send(self, "_do_", [(function(each){return ((($receiver = smalltalk.send(aBlock, "_value_", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(stream, "_nextPut_", [each]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(stream, "_nextPut_", [each]);})]));})]);
-return smalltalk.send(stream, "_contents", []);
+return smalltalk.send(smalltalk.send(self, "_includesKey_", [aKey]), "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_basicAt_", [aKey]);}), aBlock]);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_errorNotFound'),
+unescape('_at_ifAbsentPut_'),
 smalltalk.method({
-selector: unescape('errorNotFound'),
-fn: function () {
+selector: unescape('at%3AifAbsentPut%3A'),
+fn: function (aKey, aBlock) {
 var self=this;
-smalltalk.send(self, "_error_", ["Object is not in the collection"]);
+return smalltalk.send(self, "_at_ifAbsent_", [aKey, (function(){return smalltalk.send(self, "_at_put_", [aKey, smalltalk.send(aBlock, "_value", [])]);})]);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_includes_'),
+unescape('_at_ifPresent_'),
 smalltalk.method({
-selector: unescape('includes%3A'),
-fn: function (anObject) {
+selector: unescape('at%3AifPresent%3A'),
+fn: function (aKey, aBlock) {
 var self=this;
+return (($receiver = smalltalk.send(self, "_basicAt_", [aKey])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_at_", [aKey])]);})() : nil;
+return self;}
+}),
+smalltalk.HashedCollection);
 
-		var i = self.length;
-		while (i--) {
-			if (smalltalk.send(self[i], "__eq", [anObject])) {return true;}	
-		}
-		return false
-	;
+smalltalk.addMethod(
+unescape('_at_ifPresent_ifAbsent_'),
+smalltalk.method({
+selector: unescape('at%3AifPresent%3AifAbsent%3A'),
+fn: function (aKey, aBlock, anotherBlock) {
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_basicAt_", [aKey]), "_ifNil_ifNotNil_", [anotherBlock, (function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_at_", [aKey])]);})]);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_notEmpty'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('notEmpty'),
-fn: function () {
+selector: unescape('at%3Aput%3A'),
+fn: function (aKey, aValue) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_isEmpty", []), "_not", []);
+return smalltalk.send(self, "_basicAt_put_", [aKey, aValue]);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_isEmpty'),
+unescape('_collect_'),
 smalltalk.method({
-selector: unescape('isEmpty'),
-fn: function () {
+selector: unescape('collect%3A'),
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [(0)]);
+var newDict=nil;
+(newDict=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(newDict, "_at_put_", [key, smalltalk.send(aBlock, "_value_", [value])]);})]);
+return newDict;
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_remove_'),
+unescape('_copyFrom_to_'),
 smalltalk.method({
-selector: unescape('remove%3A'),
-fn: function (anObject) {
+selector: unescape('copyFrom%3Ato%3A'),
+fn: function (anIndex, anotherIndex) {
 var self=this;
-return smalltalk.send(self, "_remove_ifAbsent_", [anObject, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
+smalltalk.send(self, "_shouldNotImplement", []);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_asSet'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('asSet'),
+selector: unescape('deepCopy'),
 fn: function () {
 var self=this;
-return smalltalk.send((smalltalk.Set || Set), "_withAll_", [self]);
+var copy=nil;
+(copy=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(copy, "_at_put_", [smalltalk.send(each, "_key", []), smalltalk.send(smalltalk.send(each, "_value", []), "_deepCopy", [])]);})]);
+return copy;
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_ifNotEmpty_'),
+unescape('_detect_ifNone_'),
 smalltalk.method({
-selector: unescape('ifNotEmpty%3A'),
-fn: function (aBlock) {
+selector: unescape('detect%3AifNone%3A'),
+fn: function (aBlock, anotherBlock) {
 var self=this;
-smalltalk.send(smalltalk.send(self, "_notEmpty", []), "_ifTrue_", [aBlock]);
+return smalltalk.send(smalltalk.send(self, "_values", []), "_detect_ifNone_", [aBlock, anotherBlock]);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_ifEmpty_'),
+unescape('_do_'),
 smalltalk.method({
-selector: unescape('ifEmpty%3A'),
-fn: function (aBlock){
+selector: unescape('do%3A'),
+fn: function (aBlock) {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(aBlock, "_value", []);})() : (function(){return self;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(aBlock, "_value", []);}), (function(){return self;})]));
+smalltalk.send(smalltalk.send(self, "_values", []), "_do_", [aBlock]);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_copyWithoutAll_'),
+unescape('_includes_'),
 smalltalk.method({
-selector: unescape('copyWithoutAll%3A'),
-fn: function (aCollection) {
+selector: unescape('includes%3A'),
+fn: function (anObject) {
 var self=this;
-return smalltalk.send(self, "_reject_", [(function(each){return smalltalk.send(aCollection, "_includes_", [each]);})]);
+return smalltalk.send(smalltalk.send(self, "_values", []), "_includes_", [anObject]);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_remove_ifAbsent_'),
+unescape('_includesKey_'),
 smalltalk.method({
-selector: unescape('remove%3AifAbsent%3A'),
-fn: function (anObject, aBlock) {
+selector: unescape('includesKey%3A'),
+fn: function (aKey) {
 var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
+return self.hasOwnProperty(aKey);
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_asOrderedCollection'),
+unescape('_keys'),
 smalltalk.method({
-selector: unescape('asOrderedCollection'),
+selector: unescape('keys'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_asArray", []);
+
+		var keys = [];
+		for(var i in self) {
+			if(self.hasOwnProperty(i)) {
+				keys.push(i);
+			}
+		};
+		return keys;
+	;
 return self;}
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_keysAndValuesDo_'),
 smalltalk.method({
-selector: unescape('asJSON'),
-fn: function (){
+selector: unescape('keysAndValuesDo%3A'),
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asArray", []), "_collect_", [(function(each){return smalltalk.send(each, "_asJSON", []);})]);
+smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(aBlock, "_value_value_", [smalltalk.send(each, "_key", []), smalltalk.send(each, "_value", [])]);})]);
 return self;}
 }),
-smalltalk.Collection);
-
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_streamClass'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('streamClass'),
+selector: unescape('printString'),
 fn: function () {
 var self=this;
-return (smalltalk.Stream || Stream);
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(aStream){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Collection)]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);})(aStream);smalltalk.send(smalltalk.send(self, "_associations", []), "_do_separatedBy_", [(function(anAssociation){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(anAssociation, "_key", []), "_printString", [])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%20-%3E%20")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(anAssociation, "_value", []), "_printString", [])]);})(aStream);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%20%2C%20")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [unescape("%29")]);})]);
 return self;}
 }),
-smalltalk.Collection.klass);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_with_'),
+unescape('_remove_ifAbsent_'),
 smalltalk.method({
-selector: unescape('with%3A'),
-fn: function (anObject) {
+selector: unescape('remove%3AifAbsent%3A'),
+fn: function (aKey, aBlock) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_add_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return smalltalk.send(self, "_removeKey_ifAbsent_", [aKey, aBlock]);
 return self;}
 }),
-smalltalk.Collection.klass);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_with_with_'),
+unescape('_removeKey_'),
 smalltalk.method({
-selector: unescape('with%3Awith%3A'),
-fn: function (anObject, anotherObject) {
+selector: unescape('removeKey%3A'),
+fn: function (aKey){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_add_", [anObject]);smalltalk.send($rec, "_add_", [anotherObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return smalltalk.send(self, "_remove_", [aKey]);
 return self;}
 }),
-smalltalk.Collection.klass);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_with_with_with_'),
+unescape('_removeKey_ifAbsent_'),
 smalltalk.method({
-selector: unescape('with%3Awith%3Awith%3A'),
-fn: function (firstObject, secondObject, thirdObject) {
+selector: unescape('removeKey%3AifAbsent%3A'),
+fn: function (aKey, aBlock) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_add_", [firstObject]);smalltalk.send($rec, "_add_", [secondObject]);smalltalk.send($rec, "_add_", [thirdObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return ((($receiver = smalltalk.send(self, "_includesKey_", [aKey])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(aBlock, "_value", []);})() : (function(){return smalltalk.send(self, "_basicDelete_", [aKey]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(aBlock, "_value", []);}), (function(){return smalltalk.send(self, "_basicDelete_", [aKey]);})]));
 return self;}
 }),
-smalltalk.Collection.klass);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_withAll_'),
+unescape('_select_'),
 smalltalk.method({
-selector: unescape('withAll%3A'),
-fn: function (aCollection) {
+selector: unescape('select%3A'),
+fn: function (aBlock) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+var newDict=nil;
+(newDict=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return ((($receiver = smalltalk.send(aBlock, "_value_", [value])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(newDict, "_at_put_", [key, value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(newDict, "_at_put_", [key, value]);})]));})]);
+return newDict;
 return self;}
 }),
-smalltalk.Collection.klass);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_new_'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('new%3A'),
-fn: function (anInteger) {
+selector: unescape('shallowCopy'),
+fn: function () {
 var self=this;
-return smalltalk.send(self, "_new", []);
+var copy=nil;
+(copy=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(copy, "_at_put_", [smalltalk.send(each, "_key", []), smalltalk.send(each, "_value", [])]);})]);
+return copy;
 return self;}
 }),
-smalltalk.Collection.klass);
-
+smalltalk.HashedCollection);
 
-smalltalk.addClass('SequenceableCollection', smalltalk.Collection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_at_'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('at%3A'),
-fn: function (anIndex) {
+selector: unescape('size'),
+fn: function () {
 var self=this;
-return smalltalk.send(self, "_at_ifAbsent_", [anIndex, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
+return smalltalk.send(smalltalk.send(self, "_keys", []), "_size", []);
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
+unescape('_storeOn_'),
 smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
-fn: function (anIndex, aBlock) {
+selector: unescape('storeOn%3A'),
+fn: function (aStream) {
 var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
+smalltalk.send(aStream, "_nextPutAll_", [unescape("%23%7B")]);
+smalltalk.send(smalltalk.send(self, "_associations", []), "_do_separatedBy_", [(function(each){return smalltalk.send(each, "_storeOn_", [aStream]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [". "]);})]);
+smalltalk.send(aStream, "_nextPutAll_", [unescape("%7D")]);
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_values'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-fn: function (anIndex, anObject) {
+selector: unescape('values'),
+fn: function () {
 var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
+return smalltalk.send(smalltalk.send(self, "_keys", []), "_collect_", [(function(each){return smalltalk.send(self, "_at_", [each]);})]);
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.HashedCollection);
+
 
 smalltalk.addMethod(
-unescape('_copyFrom_to_'),
+unescape('_fromPairs_'),
 smalltalk.method({
-selector: unescape('copyFrom%3Ato%3A'),
-fn: function (anIndex, anotherIndex) {
+selector: unescape('fromPairs%3A'),
+fn: function (aCollection) {
 var self=this;
-var range=nil;
-var newCollection=nil;
-(range=smalltalk.send(anIndex, "_to_", [anotherIndex]));
-(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new_", [smalltalk.send(range, "_size", [])]));
-smalltalk.send(range, "_withIndexDo_", [(function(each, i){return smalltalk.send(newCollection, "_at_put_", [i, smalltalk.send(self, "_at_", [each])]);})]);
-return newCollection;
+var dict=nil;
+(dict=smalltalk.send(self, "_new", []));
+smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(dict, "_add_", [each]);})]);
+return dict;
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.HashedCollection.klass);
+
 
+smalltalk.addClass('Dictionary', smalltalk.HashedCollection, ['keys', 'values'], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_first'),
+unescape('_asHashedCollection'),
 smalltalk.method({
-selector: unescape('first'),
+selector: unescape('asHashedCollection'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_at_", [(1)]);
+return smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_fromPairs_", [smalltalk.send(self, "_associations", [])]);
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_fourth'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('fourth'),
-fn: function () {
+selector: unescape('asJSON'),
+fn: function (){
 var self=this;
-return smalltalk.send(self, "_at_", [(4)]);
+return smalltalk.send(smalltalk.send(self, "_asHashedCollection", []), "_asJSON", []);
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_last'),
+unescape('_at_ifAbsent_'),
 smalltalk.method({
-selector: unescape('last'),
-fn: function () {
+selector: unescape('at%3AifAbsent%3A'),
+fn: function (aKey, aBlock) {
 var self=this;
-return smalltalk.send(self, "_at_", [smalltalk.send(self, "_size", [])]);
+
+		var index;
+		for(var i=0;i<self['@keys'].length;i++){
+			if(self['@keys'][i].__eq(aKey)) {index = i;}
+		};
+		if(typeof index === 'undefined') {
+			return aBlock();
+		} else {
+			return self['@values'][index];
+		}
+	;
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_second'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('second'),
-fn: function () {
+selector: unescape('at%3Aput%3A'),
+fn: function (aKey, aValue) {
 var self=this;
-return smalltalk.send(self, "_at_", [(2)]);
+
+		var index = self['@keys'].indexOf(aKey);
+		if(index === -1) {
+			self['@values'].push(aValue);
+			self['@keys'].push(aKey);
+		} else {
+			self['@values'][index] = aValue;
+		};
+
+		return aValue;
+	;
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_third'),
+unescape('_includesKey_'),
 smalltalk.method({
-selector: unescape('third'),
-fn: function () {
+selector: unescape('includesKey%3A'),
+fn: function (aKey) {
 var self=this;
-return smalltalk.send(self, "_at_", [(3)]);
+return smalltalk.send(self['@keys'], "_includes_", [aKey]);
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_removeLast'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('removeLast'),
+selector: unescape('initialize'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_remove_", [smalltalk.send(self, "_last", [])]);
+smalltalk.send(self, "_initialize", [], smalltalk.HashedCollection);
+(self['@keys']=[]);
+(self['@values']=[]);
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_addLast_'),
+unescape('_keys'),
 smalltalk.method({
-selector: unescape('addLast%3A'),
-fn: function (anObject) {
+selector: unescape('keys'),
+fn: function () {
 var self=this;
-smalltalk.send(self, "_add_", [anObject]);
+return smalltalk.send(self['@keys'], "_copy", []);
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_withIndexDo_'),
+unescape('_removeKey_ifAbsent_'),
 smalltalk.method({
-selector: unescape('withIndexDo%3A'),
-fn: function (aBlock) {
+selector: unescape('removeKey%3AifAbsent%3A'),
+fn: function (aKey, aBlock){
 var self=this;
-for(var i=0;i<self.length;i++){aBlock(self[i], i+1);};
+
+            var index = self['@keys'].indexOf(aKey);
+            if(index === -1) {
+                return aBlock()
+            } else {
+                var value;
+                self['@keys'].splice(index, 1);
+                value = self['@values'].splice(index, 1);
+                return value[0];
+            };
+    ;
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_allButFirst'),
+unescape('_values'),
 smalltalk.method({
-selector: unescape('allButFirst'),
+selector: unescape('values'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_copyFrom_to_", [(2), smalltalk.send(self, "_size", [])]);
+return smalltalk.send(self['@values'], "_copy", []);
 return self;}
 }),
-smalltalk.SequenceableCollection);
+smalltalk.Dictionary);
+
+
 
+smalltalk.addClass('SequenceableCollection', smalltalk.Collection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_allButLast'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('allButLast'),
-fn: function () {
+selector: unescape('%3D'),
+fn: function (aCollection) {
 var self=this;
-return smalltalk.send(self, "_copyFrom_to_", [(1), ((($receiver = smalltalk.send(self, "_size", [])).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)]))]);
-return self;}
+try{((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aCollection, "_class", [])]), "_and_", [(function(){return smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [smalltalk.send(aCollection, "_size", [])]);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
+smalltalk.send(self, "_withIndexDo_", [(function(each, i){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_at_", [i]), "__eq", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));})]);
+(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return true}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}}
 }),
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_indexOf_'),
+unescape('_addLast_'),
 smalltalk.method({
-selector: unescape('indexOf%3A'),
+selector: unescape('addLast%3A'),
 fn: function (anObject) {
 var self=this;
-return smalltalk.send(self, "_indexOf_ifAbsent_", [anObject, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
+smalltalk.send(self, "_add_", [anObject]);
 return self;}
 }),
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_indexOf_ifAbsent_'),
+unescape('_allButFirst'),
 smalltalk.method({
-selector: unescape('indexOf%3AifAbsent%3A'),
-fn: function (anObject, aBlock) {
+selector: unescape('allButFirst'),
+fn: function () {
 var self=this;
-
-		for(var i=0;i<self.length;i++){
-			if(self[i].__eq(anObject)) {return i+1}
-		}
-		return aBlock();
-	;
+return smalltalk.send(self, "_copyFrom_to_", [(2), smalltalk.send(self, "_size", [])]);
 return self;}
 }),
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_indexOf_startingAt_ifAbsent_'),
+unescape('_allButLast'),
 smalltalk.method({
-selector: unescape('indexOf%3AstartingAt%3AifAbsent%3A'),
-fn: function (anObject, start, aBlock) {
+selector: unescape('allButLast'),
+fn: function () {
 var self=this;
-
-		for(var i=start-1;i<self.length;i++){
-			if(self[i].__eq(anObject)) {return i+1}
-		}
-		return aBlock();
-	;
+return smalltalk.send(self, "_copyFrom_to_", [(1), ((($receiver = smalltalk.send(self, "_size", [])).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)]))]);
 return self;}
 }),
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_indexOf_startingAt_'),
+unescape('_at_'),
 smalltalk.method({
-selector: unescape('indexOf%3AstartingAt%3A'),
-fn: function (anObject, start) {
+selector: unescape('at%3A'),
+fn: function (anIndex) {
 var self=this;
-return smalltalk.send(self, "_indexOf_startingAt_ifAbsent_", [anObject, start, (function(){return (0);})]);
+return smalltalk.send(self, "_at_ifAbsent_", [anIndex, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
 return self;}
 }),
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_reversed'),
+unescape('_at_ifAbsent_'),
 smalltalk.method({
-selector: unescape('reversed'),
-fn: function () {
+selector: unescape('at%3AifAbsent%3A'),
+fn: function (anIndex, aBlock) {
 var self=this;
 smalltalk.send(self, "_subclassResponsibility", []);
 return self;}
@@ -1071,39 +1120,38 @@ return self;}
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_atRandom'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('atRandom'),
-fn: function () {
+selector: unescape('at%3Aput%3A'),
+fn: function (anIndex, anObject) {
 var self=this;
-return smalltalk.send(self, "_at_", [smalltalk.send(smalltalk.send(self, "_size", []), "_atRandom", [])]);
+smalltalk.send(self, "_subclassResponsibility", []);
 return self;}
 }),
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_atRandom'),
 smalltalk.method({
-selector: unescape('%3D'),
-fn: function (aCollection) {
+selector: unescape('atRandom'),
+fn: function () {
 var self=this;
-try{((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aCollection, "_class", [])]), "_and_", [(function(){return smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [smalltalk.send(aCollection, "_size", [])]);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
-smalltalk.send(self, "_withIndexDo_", [(function(each, i){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_at_", [i]), "__eq", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));})]);
-(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return true}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}}
+return smalltalk.send(self, "_at_", [smalltalk.send(smalltalk.send(self, "_size", []), "_atRandom", [])]);
+return self;}
 }),
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_copyFrom_to_'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
-fn: function () {
+selector: unescape('copyFrom%3Ato%3A'),
+fn: function (anIndex, anotherIndex) {
 var self=this;
+var range=nil;
 var newCollection=nil;
-(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new_", [smalltalk.send(self, "_size", [])]));
-smalltalk.send(self, "_withIndexDo_", [(function(each, index){return smalltalk.send(newCollection, "_at_put_", [index, each]);})]);
+(range=smalltalk.send(anIndex, "_to_", [anotherIndex]));
+(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new_", [smalltalk.send(range, "_size", [])]));
+smalltalk.send(range, "_withIndexDo_", [(function(each, i){return smalltalk.send(newCollection, "_at_put_", [i, smalltalk.send(self, "_at_", [each])]);})]);
 return newCollection;
 return self;}
 }),
@@ -1124,17 +1172,12 @@ return self;}
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_first'),
 smalltalk.method({
-selector: unescape('printString'),
+selector: unescape('first'),
 fn: function () {
 var self=this;
-var str=nil;
-(str=smalltalk.send("", "_writeStream", []));
-smalltalk.send(str, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_printString", [], smalltalk.Collection), "__comma", [unescape("%20%28")])]);
-smalltalk.send(self, "_do_separatedBy_", [(function(each){return smalltalk.send(str, "_nextPutAll_", [smalltalk.send(each, "_printString", [])]);}), (function(){return smalltalk.send(str, "_nextPutAll_", [" "]);})]);
-smalltalk.send(str, "_nextPutAll_", [unescape("%29")]);
-return smalltalk.send(str, "_contents", []);
+return smalltalk.send(self, "_at_", [(1)]);
 return self;}
 }),
 smalltalk.SequenceableCollection);
@@ -1150,74 +1193,81 @@ return self;}
 }),
 smalltalk.SequenceableCollection);
 
-
-
-smalltalk.addClass('CharacterArray', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_fourth'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-fn: function (anIndex, anObject) {
+selector: unescape('fourth'),
+fn: function () {
 var self=this;
-smalltalk.send(self, "_errorReadOnly", []);
+return smalltalk.send(self, "_at_", [(4)]);
 return self;}
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_add_'),
+unescape('_indexOf_'),
 smalltalk.method({
-selector: unescape('add%3A'),
+selector: unescape('indexOf%3A'),
 fn: function (anObject) {
 var self=this;
-smalltalk.send(self, "_errorReadOnly", []);
+return smalltalk.send(self, "_indexOf_ifAbsent_", [anObject, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
 return self;}
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('__comma'),
+unescape('_indexOf_ifAbsent_'),
 smalltalk.method({
-selector: unescape('%2C'),
-fn: function (aString) {
+selector: unescape('indexOf%3AifAbsent%3A'),
+fn: function (anObject, aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "__comma", [smalltalk.send(aString, "_asString", [])]);
+
+		for(var i=0;i<self.length;i++){
+			if(self[i].__eq(anObject)) {return i+1}
+		}
+		return aBlock();
+	;
 return self;}
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_indexOf_startingAt_'),
 smalltalk.method({
-selector: unescape('asString'),
-fn: function () {
+selector: unescape('indexOf%3AstartingAt%3A'),
+fn: function (anObject, start) {
 var self=this;
-return smalltalk.send(self, "_subclassResponsibility", []);
+return smalltalk.send(self, "_indexOf_startingAt_ifAbsent_", [anObject, start, (function(){return (0);})]);
 return self;}
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_asNumber'),
+unescape('_indexOf_startingAt_ifAbsent_'),
 smalltalk.method({
-selector: unescape('asNumber'),
-fn: function () {
+selector: unescape('indexOf%3AstartingAt%3AifAbsent%3A'),
+fn: function (anObject, start, aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_asNumber", []);
+
+		for(var i=start-1;i<self.length;i++){
+			if(self[i].__eq(anObject)) {return i+1}
+		}
+		return aBlock();
+	;
 return self;}
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_errorReadOnly'),
+unescape('_last'),
 smalltalk.method({
-selector: unescape('errorReadOnly'),
+selector: unescape('last'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_error_", [unescape("Object%20is%20read-only")]);
+return smalltalk.send(self, "_at_", [smalltalk.send(self, "_size", [])]);
 return self;}
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
 unescape('_printString'),
@@ -1225,92 +1275,109 @@ smalltalk.method({
 selector: unescape('printString'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_printString", []);
+var str=nil;
+(str=smalltalk.send("", "_writeStream", []));
+smalltalk.send(str, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_printString", [], smalltalk.Collection), "__comma", [unescape("%20%28")])]);
+smalltalk.send(self, "_do_separatedBy_", [(function(each){return smalltalk.send(str, "_nextPutAll_", [smalltalk.send(each, "_printString", [])]);}), (function(){return smalltalk.send(str, "_nextPutAll_", [" "]);})]);
+smalltalk.send(str, "_nextPutAll_", [unescape("%29")]);
+return smalltalk.send(str, "_contents", []);
 return self;}
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_remove_'),
+unescape('_removeLast'),
 smalltalk.method({
-selector: unescape('remove%3A'),
-fn: function (anObject) {
+selector: unescape('removeLast'),
+fn: function () {
 var self=this;
-smalltalk.send(self, "_errorReadOnly", []);
+smalltalk.send(self, "_remove_", [smalltalk.send(self, "_last", [])]);
 return self;}
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_asUppercase'),
+unescape('_reversed'),
 smalltalk.method({
-selector: unescape('asUppercase'),
+selector: unescape('reversed'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_asUppercase", [])]);
+smalltalk.send(self, "_subclassResponsibility", []);
 return self;}
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_asSymbol'),
+unescape('_second'),
 smalltalk.method({
-selector: unescape('asSymbol'),
+selector: unescape('second'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_subclassResponsibility", []);
+return smalltalk.send(self, "_at_", [(2)]);
 return self;}
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_asLowercase'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('asLowercase'),
+selector: unescape('shallowCopy'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_asLowercase", [])]);
+var newCollection=nil;
+(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new_", [smalltalk.send(self, "_size", [])]));
+smalltalk.send(self, "_withIndexDo_", [(function(each, index){return smalltalk.send(newCollection, "_at_put_", [index, each]);})]);
+return newCollection;
 return self;}
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
+smalltalk.addMethod(
+unescape('_third'),
+smalltalk.method({
+selector: unescape('third'),
+fn: function () {
+var self=this;
+return smalltalk.send(self, "_at_", [(3)]);
+return self;}
+}),
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_fromString_'),
+unescape('_withIndexDo_'),
 smalltalk.method({
-selector: unescape('fromString%3A'),
-fn: function (aString) {
+selector: unescape('withIndexDo%3A'),
+fn: function (aBlock) {
 var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
+for(var i=0;i<self.length;i++){aBlock(self[i], i+1);};
 return self;}
 }),
-smalltalk.CharacterArray.klass);
+smalltalk.SequenceableCollection);
 
 
-smalltalk.addClass('String', smalltalk.CharacterArray, [], 'Kernel-Collections');
+
+smalltalk.addClass('Array', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('%3D'),
-fn: function (aString) {
+selector: unescape('add%3A'),
+fn: function (anObject) {
 var self=this;
-try{((($receiver = smalltalk.send(smalltalk.send(aString, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
-return String(self) === String(aString);
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}}
+self.push(anObject); return anObject;;
+return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_asJavascript'),
 smalltalk.method({
-selector: unescape('size'),
+selector: unescape('asJavascript'),
 fn: function () {
 var self=this;
-return self.length;
+return smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [smalltalk.send(smalltalk.send(self, "_collect_", [(function(each){return smalltalk.send(each, "_asJavascript", []);})]), "_join_", [unescape("%2C%20")])]), "__comma", [unescape("%5D")]);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
 unescape('_at_ifAbsent_'),
@@ -1318,1397 +1385,1426 @@ smalltalk.method({
 selector: unescape('at%3AifAbsent%3A'),
 fn: function (anIndex, aBlock) {
 var self=this;
-return self[anIndex - 1] || aBlock();
+
+	    var value = self[anIndex - 1];
+	    if(value === undefined) {
+		return aBlock();
+	    } else {
+		return value;
+	    }
+	;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_escaped'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('escaped'),
-fn: function () {
+selector: unescape('at%3Aput%3A'),
+fn: function (anIndex, anObject) {
 var self=this;
-return escape(self);
+return self[anIndex - 1] = anObject;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_unescaped'),
+unescape('_join_'),
 smalltalk.method({
-selector: unescape('unescaped'),
-fn: function () {
+selector: unescape('join%3A'),
+fn: function (aString) {
 var self=this;
-return unescape(self);
+return self.join(aString);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('__comma'),
+unescape('_remove_'),
 smalltalk.method({
-selector: unescape('%2C'),
-fn: function (aString) {
+selector: unescape('remove%3A'),
+fn: function (anObject) {
 var self=this;
-return self + aString;
+
+		for(var i=0;i<self.length;i++) {
+			if(self[i] == anObject) {
+				self.splice(i,1);
+				break;
+			}
+		}
+	;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_copyFrom_to_'),
+unescape('_removeFrom_to_'),
 smalltalk.method({
-selector: unescape('copyFrom%3Ato%3A'),
-fn: function (anIndex, anotherIndex) {
+selector: unescape('removeFrom%3Ato%3A'),
+fn: function (aNumber, anotherNumber) {
 var self=this;
-return self.substring(anIndex - 1, anotherIndex);
+self.splice(aNumber - 1,anotherNumber - 1);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_reversed'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
+selector: unescape('reversed'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [self]);
+return self._copy().reverse();
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('deepCopy'),
+selector: unescape('size'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_shallowCopy", []);
+return self.length;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_asSelector'),
+unescape('_sort'),
 smalltalk.method({
-selector: unescape('asSelector'),
+selector: unescape('sort'),
 fn: function () {
 var self=this;
-var selector=nil;
-(selector=smalltalk.send("_", "__comma", [self]));
-(selector=smalltalk.send(selector, "_replace_with_", [":", "_"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B+%5D"), "_plus"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("-"), "_minus"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B*%5D"), "_star"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B/%5D"), "_slash"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3E"), "_gt"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3C"), "_lt"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3D"), "_eq"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%2C"), "_comma"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B@%5D"), "_at"]));
-return selector;
+return smalltalk.send(self, "_basicPerform_", ["sort"]);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_sort_'),
 smalltalk.method({
-selector: unescape('asJavascript'),
-fn: function () {
+selector: unescape('sort%3A'),
+fn: function (aBlock) {
 var self=this;
 
-		if(self.search(/^[a-zA-Z0-9_:.$ ]*$/) == -1)
-			return "unescape(\"" + escape(self) + "\")";
-		else
-			return "\"" + self + "\"";
+		return self.sort(function(a, b) {
+			if(aBlock(a,b)) {return -1} else {return 1}
+		})
 	;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_replace_with_'),
+unescape('_sorted'),
 smalltalk.method({
-selector: unescape('replace%3Awith%3A'),
-fn: function (aString, anotherString) {
+selector: unescape('sorted'),
+fn: function () {
 var self=this;
-return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [aString, "g"]), anotherString]);
+return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort", []);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_replaceRegexp_with_'),
+unescape('_sorted_'),
 smalltalk.method({
-selector: unescape('replaceRegexp%3Awith%3A'),
-fn: function (aRegexp, aString) {
+selector: unescape('sorted%3A'),
+fn: function (aBlock) {
 var self=this;
-return self.replace(aRegexp, aString);
+return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort_", [aBlock]);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
+
 
 smalltalk.addMethod(
-unescape('_tokenize_'),
+unescape('_new_'),
 smalltalk.method({
-selector: unescape('tokenize%3A'),
-fn: function (aString) {
+selector: unescape('new%3A'),
+fn: function (anInteger) {
 var self=this;
-return self.split(aString);
+return new Array(anInteger);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_match_'),
+unescape('_with_'),
 smalltalk.method({
-selector: unescape('match%3A'),
-fn: function (aRegexp) {
+selector: unescape('with%3A'),
+fn: function (anObject) {
 var self=this;
-return self.search(aRegexp) != -1;
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(1)]));
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_with_with_'),
 smalltalk.method({
-selector: unescape('asString'),
-fn: function () {
+selector: unescape('with%3Awith%3A'),
+fn: function (anObject, anObject2) {
 var self=this;
-return self;
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(2)]));
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_asNumber'),
+unescape('_with_with_with_'),
 smalltalk.method({
-selector: unescape('asNumber'),
-fn: function () {
+selector: unescape('with%3Awith%3Awith%3A'),
+fn: function (anObject, anObject2, anObject3) {
 var self=this;
-return Number(self);
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);smalltalk.send($rec, "_at_put_", [(3), anObject3]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(3)]));
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_withAll_'),
 smalltalk.method({
-selector: unescape('printString'),
-fn: function () {
+selector: unescape('withAll%3A'),
+fn: function (aCollection) {
 var self=this;
-return smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [self]), "__comma", [unescape("%27")]);
+var instance=nil;
+(instance=smalltalk.send(self, "_new_", [smalltalk.send(aCollection, "_size", [])]));
+smalltalk.send(aCollection, "_withIndexDo_", [(function(each, index){return smalltalk.send(instance, "_at_put_", [index, each]);})]);
+return instance;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array.klass);
+
 
+smalltalk.addClass('Array', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_printNl'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('printNl'),
-fn: function () {
+selector: unescape('add%3A'),
+fn: function (anObject) {
 var self=this;
-console.log(self);
+self.push(anObject); return anObject;;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_isString'),
+unescape('_asJavascript'),
 smalltalk.method({
-selector: unescape('isString'),
+selector: unescape('asJavascript'),
 fn: function () {
 var self=this;
-return true;
+return smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [smalltalk.send(smalltalk.send(self, "_collect_", [(function(each){return smalltalk.send(each, "_asJavascript", []);})]), "_join_", [unescape("%2C%20")])]), "__comma", [unescape("%5D")]);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('__gt'),
+unescape('_at_ifAbsent_'),
 smalltalk.method({
-selector: unescape('%3E'),
-fn: function (aString) {
+selector: unescape('at%3AifAbsent%3A'),
+fn: function (anIndex, aBlock) {
 var self=this;
-return String(self) > aString._asString();
-return self;}
-}),
-smalltalk.String);
 
-smalltalk.addMethod(
-unescape('__lt'),
-smalltalk.method({
-selector: unescape('%3C'),
-fn: function (aString) {
-var self=this;
-return String(self) < aString._asString();
+	    var value = self[anIndex - 1];
+	    if(value === undefined) {
+		return aBlock();
+	    } else {
+		return value;
+	    }
+	;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('__gt_eq'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('%3E%3D'),
-fn: function (aString) {
+selector: unescape('at%3Aput%3A'),
+fn: function (anIndex, anObject) {
 var self=this;
-return String(self) >= aString._asString();
+return self[anIndex - 1] = anObject;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('__lt_eq'),
+unescape('_join_'),
 smalltalk.method({
-selector: unescape('%3C%3D'),
+selector: unescape('join%3A'),
 fn: function (aString) {
 var self=this;
-return String(self) <= aString._asString();
+return self.join(aString);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_trimLeft_'),
+unescape('_remove_'),
 smalltalk.method({
-selector: unescape('trimLeft%3A'),
-fn: function (separators) {
+selector: unescape('remove%3A'),
+fn: function (anObject) {
 var self=this;
-return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [smalltalk.send(smalltalk.send(unescape("%5E%5B"), "__comma", [separators]), "__comma", [unescape("%5D+")]), "g"]), ""]);
+
+		for(var i=0;i<self.length;i++) {
+			if(self[i] == anObject) {
+				self.splice(i,1);
+				break;
+			}
+		}
+	;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_trimRight_'),
+unescape('_removeFrom_to_'),
 smalltalk.method({
-selector: unescape('trimRight%3A'),
-fn: function (separators) {
+selector: unescape('removeFrom%3Ato%3A'),
+fn: function (aNumber, anotherNumber) {
 var self=this;
-return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [separators]), "__comma", [unescape("%5D+%24")]), "g"]), ""]);
+self.splice(aNumber - 1,anotherNumber - 1);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_trimLeft'),
+unescape('_reversed'),
 smalltalk.method({
-selector: unescape('trimLeft'),
+selector: unescape('reversed'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_trimLeft_", [unescape("%5Cs")]);
+return self._copy().reverse();
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_trimRight'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('trimRight'),
+selector: unescape('size'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_trimRight_", [unescape("%5Cs")]);
+return self.length;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_trimBoth'),
+unescape('_sort'),
 smalltalk.method({
-selector: unescape('trimBoth'),
+selector: unescape('sort'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_trimBoth_", [unescape("%5Cs")]);
+return smalltalk.send(self, "_basicPerform_", ["sort"]);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_trimBoth_'),
+unescape('_sort_'),
 smalltalk.method({
-selector: unescape('trimBoth%3A'),
-fn: function (separators) {
+selector: unescape('sort%3A'),
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_trimLeft_", [separators]), "_trimRight_", [separators]);
+
+		return self.sort(function(a, b) {
+			if(aBlock(a,b)) {return -1} else {return 1}
+		})
+	;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_asLowercase'),
+unescape('_sorted'),
 smalltalk.method({
-selector: unescape('asLowercase'),
+selector: unescape('sorted'),
 fn: function () {
 var self=this;
-return self.toLowerCase();
+return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort", []);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_asUppercase'),
+unescape('_sorted_'),
 smalltalk.method({
-selector: unescape('asUppercase'),
-fn: function () {
+selector: unescape('sorted%3A'),
+fn: function (aBlock) {
 var self=this;
-return self.toUpperCase();
+return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort_", [aBlock]);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array);
+
 
 smalltalk.addMethod(
-unescape('_join_'),
+unescape('_new_'),
 smalltalk.method({
-selector: unescape('join%3A'),
-fn: function (aCollection) {
+selector: unescape('new%3A'),
+fn: function (anInteger) {
 var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){return smalltalk.send(aCollection, "_do_separatedBy_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(each, "_asString", [])]);}), (function(){return smalltalk.send(stream, "_nextPutAll_", [self]);})]);})]);
+return new Array(anInteger);
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_includesSubString_'),
+unescape('_with_'),
 smalltalk.method({
-selector: unescape('includesSubString%3A'),
-fn: function (subString) {
+selector: unescape('with%3A'),
+fn: function (anObject) {
 var self=this;
- return self.indexOf(subString) != -1 ;
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(1)]));
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_asciiValue'),
+unescape('_with_with_'),
 smalltalk.method({
-selector: unescape('asciiValue'),
-fn: function () {
+selector: unescape('with%3Awith%3A'),
+fn: function (anObject, anObject2) {
 var self=this;
-return self.charCodeAt(0);;
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(2)]));
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_lineIndicesDo_'),
+unescape('_with_with_with_'),
 smalltalk.method({
-selector: unescape('lineIndicesDo%3A'),
-fn: function (aBlock) {
+selector: unescape('with%3Awith%3Awith%3A'),
+fn: function (anObject, anObject2, anObject3) {
 var self=this;
-try{var cr=nil;
-var lf=nil;
-var start=nil;
-var sz=nil;
-var nextLF=nil;
-var nextCR=nil;
-(start=(1));
-(sz=smalltalk.send(self, "_size", []));
-(cr=smalltalk.send((smalltalk.String || String), "_cr", []));
-(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, (1)]));
-(lf=smalltalk.send((smalltalk.String || String), "_lf", []));
-(nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, (1)]));
-(function(){while((function(){return ((($receiver = start).klass === smalltalk.Number) ? $receiver <=sz : smalltalk.send($receiver, "__lt_eq", [sz]));})()) {(function(){((($receiver = smalltalk.send(smalltalk.send(nextLF, "__eq", [(0)]), "_and_", [(function(){return smalltalk.send(nextCR, "__eq", [(0)]);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, sz, sz]);return (function(){throw({name: 'stReturn', selector: '_lineIndicesDo_', fn: function(){return self}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, sz, sz]);return (function(){throw({name: 'stReturn', selector: '_lineIndicesDo_', fn: function(){return self}})})();})]));return ((($receiver = smalltalk.send(smalltalk.send(nextCR, "__eq", [(0)]), "_or_", [(function(){return smalltalk.send((0) < nextLF, "_and_", [(function(){return ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver <nextCR : smalltalk.send($receiver, "__lt", [nextCR]));})]);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){return ((($receiver = smalltalk.send((1) + nextCR, "__eq", [nextLF])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){return ((($receiver = smalltalk.send((1) + nextCR, "__eq", [nextLF])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})]));})]));})()}})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_lineIndicesDo_'){return e.fn()} throw(e)}}
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);smalltalk.send($rec, "_at_put_", [(3), anObject3]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(3)]));
+return self;}
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_linesDo_'),
+unescape('_withAll_'),
 smalltalk.method({
-selector: unescape('linesDo%3A'),
-fn: function (aBlock) {
+selector: unescape('withAll%3A'),
+fn: function (aCollection) {
 var self=this;
-smalltalk.send(self, "_lineIndicesDo_", [(function(start, endWithoutDelimiters, end){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])]);})]);
+var instance=nil;
+(instance=smalltalk.send(self, "_new_", [smalltalk.send(aCollection, "_size", [])]));
+smalltalk.send(aCollection, "_withIndexDo_", [(function(each, index){return smalltalk.send(instance, "_at_put_", [index, each]);})]);
+return instance;
 return self;}
 }),
-smalltalk.String);
+smalltalk.Array.klass);
+
 
+smalltalk.addClass('CharacterArray', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_lines'),
+unescape('__comma'),
 smalltalk.method({
-selector: unescape('lines'),
-fn: function () {
+selector: unescape('%2C'),
+fn: function (aString) {
 var self=this;
-var lines=nil;
-(lines=smalltalk.send((smalltalk.Array || Array), "_new", []));
-smalltalk.send(self, "_linesDo_", [(function(aLine){return smalltalk.send(lines, "_add_", [aLine]);})]);
-return lines;
+return smalltalk.send(smalltalk.send(self, "_asString", []), "__comma", [smalltalk.send(aString, "_asString", [])]);
 return self;}
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_lineNumber_'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('lineNumber%3A'),
-fn: function (anIndex) {
+selector: unescape('add%3A'),
+fn: function (anObject) {
 var self=this;
-try{var lineCount=nil;
-(lineCount=(0));
-smalltalk.send(self, "_lineIndicesDo_", [(function(start, endWithoutDelimiters, end){return ((($receiver = smalltalk.send((lineCount=((($receiver = lineCount).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))), "__eq", [anIndex])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])}})})();})]));})]);
-(function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return nil}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_lineNumber_'){return e.fn()} throw(e)}}
+smalltalk.send(self, "_errorReadOnly", []);
+return self;}
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_reversed'),
+unescape('_asLowercase'),
 smalltalk.method({
-selector: unescape('reversed'),
+selector: unescape('asLowercase'),
 fn: function () {
 var self=this;
-return self.split("").reverse().join("");
+return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_asLowercase", [])]);
 return self;}
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_asJavaScriptSelector'),
+unescape('_asNumber'),
 smalltalk.method({
-selector: unescape('asJavaScriptSelector'),
+selector: unescape('asNumber'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(self, "_asSelector", []), "_replace_with_", [unescape("%5E_"), ""]), "_replace_with_", [unescape("_.*"), ""]);
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_asNumber", []);
 return self;}
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_asSymbol'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('asSymbol'),
+selector: unescape('asString'),
 fn: function () {
 var self=this;
-return smalltalk.send((smalltalk.Symbol || Symbol), "_lookup_", [self]);
+return smalltalk.send(self, "_subclassResponsibility", []);
 return self;}
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_asSymbol'),
 smalltalk.method({
-selector: unescape('asJSON'),
-fn: function (){
+selector: unescape('asSymbol'),
+fn: function () {
 var self=this;
-return self;
+return smalltalk.send(self, "_subclassResponsibility", []);
 return self;}
 }),
-smalltalk.String);
-
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_streamClass'),
+unescape('_asUppercase'),
 smalltalk.method({
-selector: unescape('streamClass'),
+selector: unescape('asUppercase'),
 fn: function () {
 var self=this;
-return (smalltalk.StringStream || StringStream);
+return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_asUppercase", [])]);
 return self;}
 }),
-smalltalk.String.klass);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_fromString_'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('fromString%3A'),
-fn: function (aString) {
+selector: unescape('at%3Aput%3A'),
+fn: function (anIndex, anObject) {
 var self=this;
-return new self.fn(aString);
+smalltalk.send(self, "_errorReadOnly", []);
 return self;}
 }),
-smalltalk.String.klass);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_cr'),
+unescape('_errorReadOnly'),
 smalltalk.method({
-selector: unescape('cr'),
+selector: unescape('errorReadOnly'),
 fn: function () {
 var self=this;
-return '\r';
+smalltalk.send(self, "_error_", [unescape("Object%20is%20read-only")]);
 return self;}
 }),
-smalltalk.String.klass);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_lf'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('lf'),
+selector: unescape('printString'),
 fn: function () {
 var self=this;
-return '\n';
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_printString", []);
 return self;}
 }),
-smalltalk.String.klass);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_space'),
+unescape('_remove_'),
 smalltalk.method({
-selector: unescape('space'),
-fn: function () {
+selector: unescape('remove%3A'),
+fn: function (anObject) {
 var self=this;
-return ' ';
+smalltalk.send(self, "_errorReadOnly", []);
 return self;}
 }),
-smalltalk.String.klass);
+smalltalk.CharacterArray);
+
 
 smalltalk.addMethod(
-unescape('_tab'),
+unescape('_fromString_'),
 smalltalk.method({
-selector: unescape('tab'),
-fn: function () {
+selector: unescape('fromString%3A'),
+fn: function (aString) {
 var self=this;
-return '\t';
+smalltalk.send(self, "_subclassResponsibility", []);
 return self;}
 }),
-smalltalk.String.klass);
+smalltalk.CharacterArray.klass);
 
+
+smalltalk.addClass('String', smalltalk.CharacterArray, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_crlf'),
+unescape('__comma'),
 smalltalk.method({
-selector: unescape('crlf'),
-fn: function () {
+selector: unescape('%2C'),
+fn: function (aString) {
 var self=this;
-return '\r\n';
+return self + aString;
 return self;}
 }),
-smalltalk.String.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_streamContents_'),
+unescape('__lt'),
 smalltalk.method({
-selector: unescape('streamContents%3A'),
-fn: function (blockWithArg) {
+selector: unescape('%3C'),
+fn: function (aString) {
 var self=this;
-var stream=nil;
-(stream=smalltalk.send(smalltalk.send(self, "_streamClass", []), "_on_", [smalltalk.send((smalltalk.String || String), "_new", [])]));
-smalltalk.send(blockWithArg, "_value_", [stream]);
-return smalltalk.send(stream, "_contents", []);
+return String(self) < aString._asString();
 return self;}
 }),
-smalltalk.String.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_value_'),
+unescape('__lt_eq'),
 smalltalk.method({
-selector: unescape('value%3A'),
-fn: function (aUTFCharCode) {
+selector: unescape('%3C%3D'),
+fn: function (aString) {
 var self=this;
-return String.fromCharCode(aUTFCharCode);;
+return String(self) <= aString._asString();
 return self;}
 }),
-smalltalk.String.klass);
-
+smalltalk.String);
 
-smalltalk.addClass('Symbol', smalltalk.CharacterArray, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
-fn: function (anIndex, aBlock) {
+selector: unescape('%3D'),
+fn: function (aString) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_at_ifAbsent_", [anIndex, aBlock]);
-return self;}
+try{((($receiver = smalltalk.send(smalltalk.send(aString, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
+return String(self) === String(aString);
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('__gt'),
 smalltalk.method({
-selector: unescape('asString'),
-fn: function () {
+selector: unescape('%3E'),
+fn: function (aString) {
 var self=this;
-return self.value;
+return String(self) > aString._asString();
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('__gt_eq'),
 smalltalk.method({
-selector: unescape('printString'),
-fn: function () {
+selector: unescape('%3E%3D'),
+fn: function (aString) {
 var self=this;
-return smalltalk.send(unescape("%23"), "__comma", [smalltalk.send(self, "_asString", [])]);
+return String(self) >= aString._asString();
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('size'),
-fn: function () {
+selector: unescape('asJSON'),
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_size", []);
+return self;
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asSymbol'),
+unescape('_asJavaScriptSelector'),
 smalltalk.method({
-selector: unescape('asSymbol'),
+selector: unescape('asJavaScriptSelector'),
 fn: function () {
 var self=this;
-return self;
+return smalltalk.send(smalltalk.send(smalltalk.send(self, "_asSelector", []), "_replace_with_", [unescape("%5E_"), ""]), "_replace_with_", [unescape("_.*"), ""]);
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_copyFrom_to_'),
+unescape('_asJavascript'),
 smalltalk.method({
-selector: unescape('copyFrom%3Ato%3A'),
-fn: function (anIndex, anotherIndex) {
+selector: unescape('asJavascript'),
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_copyFrom_to_", [anIndex, anotherIndex])]);
+
+		if(self.search(/^[a-zA-Z0-9_:.$ ]*$/) == -1)
+			return "unescape(\"" + escape(self) + "\")";
+		else
+			return "\"" + self + "\"";
+	;
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_asLowercase'),
 smalltalk.method({
-selector: unescape('deepCopy'),
+selector: unescape('asLowercase'),
 fn: function () {
 var self=this;
-return self;
+return self.toLowerCase();
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('__lt'),
+unescape('_asNumber'),
 smalltalk.method({
-selector: unescape('%3C'),
-fn: function (aSymbol) {
+selector: unescape('asNumber'),
+fn: function () {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(aSymbol, "_asString", [])]));
+return Number(self);
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('__lt_eq'),
+unescape('_asSelector'),
 smalltalk.method({
-selector: unescape('%3C%3D'),
-fn: function (aSymbol) {
+selector: unescape('asSelector'),
+fn: function () {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(aSymbol, "_asString", [])]));
+var selector=nil;
+(selector=smalltalk.send("_", "__comma", [self]));
+(selector=smalltalk.send(selector, "_replace_with_", [":", "_"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B+%5D"), "_plus"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("-"), "_minus"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B*%5D"), "_star"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B/%5D"), "_slash"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3E"), "_gt"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3C"), "_lt"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3D"), "_eq"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%2C"), "_comma"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B@%5D"), "_at"]));
+return selector;
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('__gt_eq'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('%3E%3D'),
-fn: function (aSymbol) {
+selector: unescape('asString'),
+fn: function () {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver >=smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__gt_eq", [smalltalk.send(aSymbol, "_asString", [])]));
+return self;
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_asSymbol'),
 smalltalk.method({
-selector: unescape('%3D'),
-fn: function (aSymbol) {
+selector: unescape('asSymbol'),
+fn: function () {
 var self=this;
-try{((($receiver = smalltalk.send(smalltalk.send(aSymbol, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
-(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return smalltalk.send(smalltalk.send(self, "_asString", []), "__eq", [smalltalk.send(aSymbol, "_asString", [])])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}}
+return smalltalk.send((smalltalk.Symbol || Symbol), "_lookup_", [self]);
+return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_isSymbol'),
+unescape('_asUppercase'),
 smalltalk.method({
-selector: unescape('isSymbol'),
+selector: unescape('asUppercase'),
 fn: function () {
 var self=this;
-return true;
+return self.toUpperCase();
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_asciiValue'),
 smalltalk.method({
-selector: unescape('asJavascript'),
+selector: unescape('asciiValue'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(unescape("smalltalk.symbolFor%28%22"), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%22%29")]);
+return self.charCodeAt(0);;
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('__gt'),
+unescape('_at_ifAbsent_'),
 smalltalk.method({
-selector: unescape('%3E'),
-fn: function (aSymbol) {
+selector: unescape('at%3AifAbsent%3A'),
+fn: function (anIndex, aBlock) {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver >smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__gt", [smalltalk.send(aSymbol, "_asString", [])]));
+return self[anIndex - 1] || aBlock();
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_copyFrom_to_'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
-fn: function () {
+selector: unescape('copyFrom%3Ato%3A'),
+fn: function (anIndex, anotherIndex) {
 var self=this;
-return self;
+return self.substring(anIndex - 1, anotherIndex);
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asSelector'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('asSelector'),
+selector: unescape('deepCopy'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_asSelector", []);
+return smalltalk.send(self, "_shallowCopy", []);
 return self;}
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_escaped'),
 smalltalk.method({
-selector: unescape('asJSON'),
-fn: function (){
+selector: unescape('escaped'),
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_asJSON", []);
+return escape(self);
 return self;}
 }),
-smalltalk.Symbol);
-
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_lookup_'),
+unescape('_includesSubString_'),
 smalltalk.method({
-selector: unescape('lookup%3A'),
-fn: function (aString) {
+selector: unescape('includesSubString%3A'),
+fn: function (subString) {
 var self=this;
-return smalltalk.symbolFor(aString);;
+ return self.indexOf(subString) != -1 ;
 return self;}
 }),
-smalltalk.Symbol.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_basicNew'),
+unescape('_isString'),
 smalltalk.method({
-selector: unescape('basicNew'),
+selector: unescape('isString'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+return true;
 return self;}
 }),
-smalltalk.Symbol.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_fromString_'),
+unescape('_join_'),
 smalltalk.method({
-selector: unescape('fromString%3A'),
-fn: function (aString) {
+selector: unescape('join%3A'),
+fn: function (aCollection) {
 var self=this;
-return smalltalk.send(self, "_lookup_", [aString]);
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){return smalltalk.send(aCollection, "_do_separatedBy_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(each, "_asString", [])]);}), (function(){return smalltalk.send(stream, "_nextPutAll_", [self]);})]);})]);
 return self;}
 }),
-smalltalk.Symbol.klass);
-
+smalltalk.String);
 
-smalltalk.addClass('Array', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_lineIndicesDo_'),
 smalltalk.method({
-selector: unescape('size'),
-fn: function () {
+selector: unescape('lineIndicesDo%3A'),
+fn: function (aBlock) {
 var self=this;
-return self.length;
-return self;}
+try{var cr=nil;
+var lf=nil;
+var start=nil;
+var sz=nil;
+var nextLF=nil;
+var nextCR=nil;
+(start=(1));
+(sz=smalltalk.send(self, "_size", []));
+(cr=smalltalk.send((smalltalk.String || String), "_cr", []));
+(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, (1)]));
+(lf=smalltalk.send((smalltalk.String || String), "_lf", []));
+(nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, (1)]));
+(function(){while((function(){return ((($receiver = start).klass === smalltalk.Number) ? $receiver <=sz : smalltalk.send($receiver, "__lt_eq", [sz]));})()) {(function(){((($receiver = smalltalk.send(smalltalk.send(nextLF, "__eq", [(0)]), "_and_", [(function(){return smalltalk.send(nextCR, "__eq", [(0)]);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, sz, sz]);return (function(){throw({name: 'stReturn', selector: '_lineIndicesDo_', fn: function(){return self}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, sz, sz]);return (function(){throw({name: 'stReturn', selector: '_lineIndicesDo_', fn: function(){return self}})})();})]));return ((($receiver = smalltalk.send(smalltalk.send(nextCR, "__eq", [(0)]), "_or_", [(function(){return smalltalk.send((0) < nextLF, "_and_", [(function(){return ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver <nextCR : smalltalk.send($receiver, "__lt", [nextCR]));})]);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){return ((($receiver = smalltalk.send((1) + nextCR, "__eq", [nextLF])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){return ((($receiver = smalltalk.send((1) + nextCR, "__eq", [nextLF])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})]));})]));})()}})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_lineIndicesDo_'){return e.fn()} throw(e)}}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_lineNumber_'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-fn: function (anIndex, anObject) {
+selector: unescape('lineNumber%3A'),
+fn: function (anIndex) {
 var self=this;
-return self[anIndex - 1] = anObject;
-return self;}
+try{var lineCount=nil;
+(lineCount=(0));
+smalltalk.send(self, "_lineIndicesDo_", [(function(start, endWithoutDelimiters, end){return ((($receiver = smalltalk.send((lineCount=((($receiver = lineCount).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))), "__eq", [anIndex])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])}})})();})]));})]);
+(function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return nil}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_lineNumber_'){return e.fn()} throw(e)}}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
+unescape('_lines'),
 smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
-fn: function (anIndex, aBlock) {
+selector: unescape('lines'),
+fn: function () {
 var self=this;
-
-	    var value = self[anIndex - 1];
-	    if(value === undefined) {
-		return aBlock();
-	    } else {
-		return value;
-	    }
-	;
+var lines=nil;
+(lines=smalltalk.send((smalltalk.Array || Array), "_new", []));
+smalltalk.send(self, "_linesDo_", [(function(aLine){return smalltalk.send(lines, "_add_", [aLine]);})]);
+return lines;
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_add_'),
+unescape('_linesDo_'),
 smalltalk.method({
-selector: unescape('add%3A'),
-fn: function (anObject) {
+selector: unescape('linesDo%3A'),
+fn: function (aBlock) {
 var self=this;
-self.push(anObject); return anObject;;
+smalltalk.send(self, "_lineIndicesDo_", [(function(start, endWithoutDelimiters, end){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])]);})]);
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_join_'),
+unescape('_match_'),
 smalltalk.method({
-selector: unescape('join%3A'),
-fn: function (aString) {
+selector: unescape('match%3A'),
+fn: function (aRegexp) {
 var self=this;
-return self.join(aString);
+return self.search(aRegexp) != -1;
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_printNl'),
 smalltalk.method({
-selector: unescape('asJavascript'),
+selector: unescape('printNl'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [smalltalk.send(smalltalk.send(self, "_collect_", [(function(each){return smalltalk.send(each, "_asJavascript", []);})]), "_join_", [unescape("%2C%20")])]), "__comma", [unescape("%5D")]);
+console.log(self);
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_sort'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('sort'),
+selector: unescape('printString'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_basicPerform_", ["sort"]);
+return smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [self]), "__comma", [unescape("%27")]);
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_sort_'),
+unescape('_replace_with_'),
 smalltalk.method({
-selector: unescape('sort%3A'),
-fn: function (aBlock) {
+selector: unescape('replace%3Awith%3A'),
+fn: function (aString, anotherString) {
 var self=this;
-
-		return self.sort(function(a, b) {
-			if(aBlock(a,b)) {return -1} else {return 1}
-		})
-	;
+return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [aString, "g"]), anotherString]);
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_remove_'),
+unescape('_replaceRegexp_with_'),
 smalltalk.method({
-selector: unescape('remove%3A'),
-fn: function (anObject) {
+selector: unescape('replaceRegexp%3Awith%3A'),
+fn: function (aRegexp, aString) {
 var self=this;
-
-		for(var i=0;i<self.length;i++) {
-			if(self[i] == anObject) {
-				self.splice(i,1);
-				break;
-			}
-		}
-	;
+return self.replace(aRegexp, aString);
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_sorted'),
+unescape('_reversed'),
 smalltalk.method({
-selector: unescape('sorted'),
+selector: unescape('reversed'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort", []);
+return self.split("").reverse().join("");
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_sorted_'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('sorted%3A'),
-fn: function (aBlock) {
+selector: unescape('shallowCopy'),
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort_", [aBlock]);
+return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [self]);
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_removeFrom_to_'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('removeFrom%3Ato%3A'),
-fn: function (aNumber, anotherNumber) {
+selector: unescape('size'),
+fn: function () {
 var self=this;
-self.splice(aNumber - 1,anotherNumber - 1);
+return self.length;
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_reversed'),
+unescape('_tokenize_'),
 smalltalk.method({
-selector: unescape('reversed'),
-fn: function () {
+selector: unescape('tokenize%3A'),
+fn: function (aString) {
 var self=this;
-return self._copy().reverse();
+return self.split(aString);
 return self;}
 }),
-smalltalk.Array);
-
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_new_'),
+unescape('_trimBoth'),
 smalltalk.method({
-selector: unescape('new%3A'),
-fn: function (anInteger) {
+selector: unescape('trimBoth'),
+fn: function () {
 var self=this;
-return new Array(anInteger);
+return smalltalk.send(self, "_trimBoth_", [unescape("%5Cs")]);
 return self;}
 }),
-smalltalk.Array.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_with_'),
+unescape('_trimBoth_'),
 smalltalk.method({
-selector: unescape('with%3A'),
-fn: function (anObject) {
+selector: unescape('trimBoth%3A'),
+fn: function (separators) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(1)]));
+return smalltalk.send(smalltalk.send(self, "_trimLeft_", [separators]), "_trimRight_", [separators]);
 return self;}
 }),
-smalltalk.Array.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_with_with_'),
+unescape('_trimLeft'),
 smalltalk.method({
-selector: unescape('with%3Awith%3A'),
-fn: function (anObject, anObject2) {
+selector: unescape('trimLeft'),
+fn: function () {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(2)]));
+return smalltalk.send(self, "_trimLeft_", [unescape("%5Cs")]);
 return self;}
 }),
-smalltalk.Array.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_with_with_with_'),
+unescape('_trimLeft_'),
 smalltalk.method({
-selector: unescape('with%3Awith%3Awith%3A'),
-fn: function (anObject, anObject2, anObject3) {
+selector: unescape('trimLeft%3A'),
+fn: function (separators) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);smalltalk.send($rec, "_at_put_", [(3), anObject3]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(3)]));
+return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [smalltalk.send(smalltalk.send(unescape("%5E%5B"), "__comma", [separators]), "__comma", [unescape("%5D+")]), "g"]), ""]);
 return self;}
 }),
-smalltalk.Array.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_withAll_'),
+unescape('_trimRight'),
 smalltalk.method({
-selector: unescape('withAll%3A'),
-fn: function (aCollection) {
+selector: unescape('trimRight'),
+fn: function () {
 var self=this;
-var instance=nil;
-(instance=smalltalk.send(self, "_new_", [smalltalk.send(aCollection, "_size", [])]));
-smalltalk.send(aCollection, "_withIndexDo_", [(function(each, index){return smalltalk.send(instance, "_at_put_", [index, each]);})]);
-return instance;
+return smalltalk.send(self, "_trimRight_", [unescape("%5Cs")]);
 return self;}
 }),
-smalltalk.Array.klass);
-
+smalltalk.String);
 
-smalltalk.addClass('Array', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_trimRight_'),
 smalltalk.method({
-selector: unescape('size'),
-fn: function () {
+selector: unescape('trimRight%3A'),
+fn: function (separators) {
 var self=this;
-return self.length;
+return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [separators]), "__comma", [unescape("%5D+%24")]), "g"]), ""]);
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_unescaped'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-fn: function (anIndex, anObject) {
+selector: unescape('unescaped'),
+fn: function () {
 var self=this;
-return self[anIndex - 1] = anObject;
+return unescape(self);
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String);
+
 
 smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
+unescape('_cr'),
 smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
-fn: function (anIndex, aBlock) {
+selector: unescape('cr'),
+fn: function () {
 var self=this;
-
-	    var value = self[anIndex - 1];
-	    if(value === undefined) {
-		return aBlock();
-	    } else {
-		return value;
-	    }
-	;
+return '\r';
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_add_'),
+unescape('_crlf'),
 smalltalk.method({
-selector: unescape('add%3A'),
-fn: function (anObject) {
+selector: unescape('crlf'),
+fn: function () {
 var self=this;
-self.push(anObject); return anObject;;
+return '\r\n';
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_join_'),
+unescape('_fromString_'),
 smalltalk.method({
-selector: unescape('join%3A'),
+selector: unescape('fromString%3A'),
 fn: function (aString) {
 var self=this;
-return self.join(aString);
+return new self.fn(aString);
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_lf'),
 smalltalk.method({
-selector: unescape('asJavascript'),
+selector: unescape('lf'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [smalltalk.send(smalltalk.send(self, "_collect_", [(function(each){return smalltalk.send(each, "_asJavascript", []);})]), "_join_", [unescape("%2C%20")])]), "__comma", [unescape("%5D")]);
+return '\n';
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_sort'),
+unescape('_space'),
 smalltalk.method({
-selector: unescape('sort'),
+selector: unescape('space'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_basicPerform_", ["sort"]);
+return ' ';
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_sort_'),
+unescape('_streamClass'),
 smalltalk.method({
-selector: unescape('sort%3A'),
-fn: function (aBlock) {
+selector: unescape('streamClass'),
+fn: function () {
 var self=this;
-
-		return self.sort(function(a, b) {
-			if(aBlock(a,b)) {return -1} else {return 1}
-		})
-	;
+return (smalltalk.StringStream || StringStream);
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_remove_'),
+unescape('_streamContents_'),
 smalltalk.method({
-selector: unescape('remove%3A'),
-fn: function (anObject) {
+selector: unescape('streamContents%3A'),
+fn: function (blockWithArg) {
 var self=this;
-
-		for(var i=0;i<self.length;i++) {
-			if(self[i] == anObject) {
-				self.splice(i,1);
-				break;
-			}
-		}
-	;
+var stream=nil;
+(stream=smalltalk.send(smalltalk.send(self, "_streamClass", []), "_on_", [smalltalk.send((smalltalk.String || String), "_new", [])]));
+smalltalk.send(blockWithArg, "_value_", [stream]);
+return smalltalk.send(stream, "_contents", []);
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_sorted'),
+unescape('_tab'),
 smalltalk.method({
-selector: unescape('sorted'),
+selector: unescape('tab'),
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort", []);
+return '\t';
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_sorted_'),
+unescape('_value_'),
 smalltalk.method({
-selector: unescape('sorted%3A'),
-fn: function (aBlock) {
+selector: unescape('value%3A'),
+fn: function (aUTFCharCode) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort_", [aBlock]);
+return String.fromCharCode(aUTFCharCode);;
 return self;}
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
-smalltalk.addMethod(
-unescape('_removeFrom_to_'),
+
+smalltalk.addClass('Symbol', smalltalk.CharacterArray, [], 'Kernel-Collections');
+smalltalk.addMethod(
+unescape('__lt'),
 smalltalk.method({
-selector: unescape('removeFrom%3Ato%3A'),
-fn: function (aNumber, anotherNumber) {
+selector: unescape('%3C'),
+fn: function (aSymbol) {
 var self=this;
-self.splice(aNumber - 1,anotherNumber - 1);
+return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(aSymbol, "_asString", [])]));
 return self;}
 }),
-smalltalk.Array);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_reversed'),
+unescape('__lt_eq'),
 smalltalk.method({
-selector: unescape('reversed'),
-fn: function () {
+selector: unescape('%3C%3D'),
+fn: function (aSymbol) {
 var self=this;
-return self._copy().reverse();
+return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(aSymbol, "_asString", [])]));
 return self;}
 }),
-smalltalk.Array);
+smalltalk.Symbol);
 
+smalltalk.addMethod(
+unescape('__eq'),
+smalltalk.method({
+selector: unescape('%3D'),
+fn: function (aSymbol) {
+var self=this;
+try{((($receiver = smalltalk.send(smalltalk.send(aSymbol, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
+(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return smalltalk.send(smalltalk.send(self, "_asString", []), "__eq", [smalltalk.send(aSymbol, "_asString", [])])}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}}
+}),
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_new_'),
+unescape('__gt'),
 smalltalk.method({
-selector: unescape('new%3A'),
-fn: function (anInteger) {
+selector: unescape('%3E'),
+fn: function (aSymbol) {
 var self=this;
-return new Array(anInteger);
+return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver >smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__gt", [smalltalk.send(aSymbol, "_asString", [])]));
 return self;}
 }),
-smalltalk.Array.klass);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_with_'),
+unescape('__gt_eq'),
 smalltalk.method({
-selector: unescape('with%3A'),
-fn: function (anObject) {
+selector: unescape('%3E%3D'),
+fn: function (aSymbol) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(1)]));
+return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver >=smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__gt_eq", [smalltalk.send(aSymbol, "_asString", [])]));
 return self;}
 }),
-smalltalk.Array.klass);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_with_with_'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('with%3Awith%3A'),
-fn: function (anObject, anObject2) {
+selector: unescape('asJSON'),
+fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(2)]));
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_asJSON", []);
 return self;}
 }),
-smalltalk.Array.klass);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_with_with_with_'),
+unescape('_asJavascript'),
 smalltalk.method({
-selector: unescape('with%3Awith%3Awith%3A'),
-fn: function (anObject, anObject2, anObject3) {
+selector: unescape('asJavascript'),
+fn: function () {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);smalltalk.send($rec, "_at_put_", [(3), anObject3]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(3)]));
+return smalltalk.send(smalltalk.send(unescape("smalltalk.symbolFor%28%22"), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%22%29")]);
 return self;}
 }),
-smalltalk.Array.klass);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_withAll_'),
+unescape('_asSelector'),
 smalltalk.method({
-selector: unescape('withAll%3A'),
-fn: function (aCollection) {
+selector: unescape('asSelector'),
+fn: function () {
 var self=this;
-var instance=nil;
-(instance=smalltalk.send(self, "_new_", [smalltalk.send(aCollection, "_size", [])]));
-smalltalk.send(aCollection, "_withIndexDo_", [(function(each, index){return smalltalk.send(instance, "_at_put_", [index, each]);})]);
-return instance;
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_asSelector", []);
 return self;}
 }),
-smalltalk.Array.klass);
+smalltalk.Symbol);
 
+smalltalk.addMethod(
+unescape('_asString'),
+smalltalk.method({
+selector: unescape('asString'),
+fn: function () {
+var self=this;
+return self.value;
+return self;}
+}),
+smalltalk.Symbol);
 
-smalltalk.addClass('StringStream', smalltalk.Stream, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_next_'),
+unescape('_asSymbol'),
 smalltalk.method({
-selector: unescape('next%3A'),
-fn: function (anInteger) {
+selector: unescape('asSymbol'),
+fn: function () {
 var self=this;
-var tempCollection=nil;
-(tempCollection=smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_class", []), "_new", []));
-smalltalk.send(anInteger, "_timesRepeat_", [(function(){return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (tempCollection=smalltalk.send(tempCollection, "__comma", [smalltalk.send(self, "_next", [])]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (tempCollection=smalltalk.send(tempCollection, "__comma", [smalltalk.send(self, "_next", [])]));})]));})]);
-return tempCollection;
+return self;
 return self;}
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_nextPut_'),
+unescape('_at_ifAbsent_'),
 smalltalk.method({
-selector: unescape('nextPut%3A'),
-fn: function (aString) {
+selector: unescape('at%3AifAbsent%3A'),
+fn: function (anIndex, aBlock) {
 var self=this;
-smalltalk.send(self, "_nextPutAll_", [aString]);
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_at_ifAbsent_", [anIndex, aBlock]);
 return self;}
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_nextPutAll_'),
+unescape('_copyFrom_to_'),
 smalltalk.method({
-selector: unescape('nextPutAll%3A'),
-fn: function (aString) {
+selector: unescape('copyFrom%3Ato%3A'),
+fn: function (anIndex, anotherIndex) {
 var self=this;
-smalltalk.send(self, "_setCollection_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [(1), smalltalk.send(self, "_position", [])]), "__comma", [aString]), "__comma", [smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [((($receiver = ((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])])), smalltalk.send(smalltalk.send(self, "_collection", []), "_size", [])])])]);
-smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])]))]);
-smalltalk.send(self, "_setStreamSize_", [smalltalk.send(smalltalk.send(self, "_streamSize", []), "_max_", [smalltalk.send(self, "_position", [])])]);
+return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_copyFrom_to_", [anIndex, anotherIndex])]);
 return self;}
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_cr'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('cr'),
+selector: unescape('deepCopy'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_cr", [])]);
+return self;
 return self;}
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_crlf'),
+unescape('_isSymbol'),
 smalltalk.method({
-selector: unescape('crlf'),
+selector: unescape('isSymbol'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_crlf", [])]);
+return true;
 return self;}
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_lf'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('lf'),
+selector: unescape('printString'),
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_lf", [])]);
+return smalltalk.send(unescape("%23"), "__comma", [smalltalk.send(self, "_asString", [])]);
 return self;}
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_space'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('space'),
+selector: unescape('shallowCopy'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_nextPut_", [" "]);
+return self;
 return self;}
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
+smalltalk.addMethod(
+unescape('_size'),
+smalltalk.method({
+selector: unescape('size'),
+fn: function () {
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_size", []);
+return self;}
+}),
+smalltalk.Symbol);
 
 
-smalltalk.addClass('Set', smalltalk.Collection, ['elements'], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_add_'),
+unescape('_basicNew'),
 smalltalk.method({
-selector: unescape('add%3A'),
-fn: function (anObject) {
+selector: unescape('basicNew'),
+fn: function () {
 var self=this;
+smalltalk.send(self, "_shouldNotImplement", []);
+return self;}
+}),
+smalltalk.Symbol.klass);
 
-		var found;
-		for(var i=0; i < self['@elements'].length; i++) {
-			if(anObject == self['@elements'][i]) {
-				found = true;
-				break;
-			}
-		}
-		if(!found) {self['@elements'].push(anObject)}
-	;
+smalltalk.addMethod(
+unescape('_fromString_'),
+smalltalk.method({
+selector: unescape('fromString%3A'),
+fn: function (aString) {
+var self=this;
+return smalltalk.send(self, "_lookup_", [aString]);
 return self;}
 }),
-smalltalk.Set);
+smalltalk.Symbol.klass);
 
 smalltalk.addMethod(
-unescape('_remove_'),
+unescape('_lookup_'),
 smalltalk.method({
-selector: unescape('remove%3A'),
-fn: function (anObject) {
+selector: unescape('lookup%3A'),
+fn: function (aString) {
 var self=this;
-smalltalk.send(self['@elements'], "_remove_", [anObject]);
+return smalltalk.symbolFor(aString);;
 return self;}
 }),
-smalltalk.Set);
+smalltalk.Symbol.klass);
+
 
+smalltalk.addClass('Set', smalltalk.Collection, ['elements'], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('initialize'),
-fn: function () {
+selector: unescape('%3D'),
+fn: function (aCollection) {
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Collection);
-(self['@elements']=[]);
+return smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aCollection, "_class", [])]), "_and_", [(function(){return smalltalk.send(self['@elements'], "__eq", [smalltalk.send(aCollection, "_asArray", [])]);})]);
 return self;}
 }),
 smalltalk.Set);
 
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('size'),
-fn: function () {
+selector: unescape('add%3A'),
+fn: function (anObject) {
 var self=this;
-return smalltalk.send(self['@elements'], "_size", []);
+
+		var found;
+		for(var i=0; i < self['@elements'].length; i++) {
+			if(anObject == self['@elements'][i]) {
+				found = true;
+				break;
+			}
+		}
+		if(!found) {self['@elements'].push(anObject)}
+	;
 return self;}
 }),
 smalltalk.Set);
@@ -2758,563 +2854,468 @@ return self;}
 smalltalk.Set);
 
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('%3D'),
-fn: function (aCollection) {
+selector: unescape('initialize'),
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aCollection, "_class", [])]), "_and_", [(function(){return smalltalk.send(self['@elements'], "__eq", [smalltalk.send(aCollection, "_asArray", [])]);})]);
+smalltalk.send(self, "_initialize", [], smalltalk.Collection);
+(self['@elements']=[]);
 return self;}
 }),
 smalltalk.Set);
 
 smalltalk.addMethod(
-unescape('_select_'),
+unescape('_remove_'),
 smalltalk.method({
-selector: unescape('select%3A'),
-fn: function (aBlock) {
+selector: unescape('remove%3A'),
+fn: function (anObject) {
 var self=this;
-var collection=nil;
-(collection=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_do_", [(function(each){return ((($receiver = smalltalk.send(aBlock, "_value_", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(collection, "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(collection, "_add_", [each]);})]));})]);
-return collection;
+smalltalk.send(self['@elements'], "_remove_", [anObject]);
 return self;}
 }),
 smalltalk.Set);
 
-
-
-smalltalk.addClass('HashedCollection', smalltalk.Collection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_select_'),
 smalltalk.method({
-selector: unescape('size'),
-fn: function () {
+selector: unescape('select%3A'),
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_keys", []), "_size", []);
+var collection=nil;
+(collection=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_do_", [(function(each){return ((($receiver = smalltalk.send(aBlock, "_value_", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(collection, "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(collection, "_add_", [each]);})]));})]);
+return collection;
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Set);
 
 smalltalk.addMethod(
-unescape('_associations'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('associations'),
+selector: unescape('size'),
 fn: function () {
 var self=this;
-var associations=nil;
-(associations=[]);
-smalltalk.send(smalltalk.send(self, "_keys", []), "_do_", [(function(each){return smalltalk.send(associations, "_add_", [smalltalk.send((smalltalk.Association || Association), "_key_value_", [each, smalltalk.send(self, "_at_", [each])])]);})]);
-return associations;
+return smalltalk.send(self['@elements'], "_size", []);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Set);
 
-smalltalk.addMethod(
-unescape('_keys'),
-smalltalk.method({
-selector: unescape('keys'),
-fn: function () {
-var self=this;
 
-		var keys = [];
-		for(var i in self) {
-			if(self.hasOwnProperty(i)) {
-				keys.push(i);
-			}
-		};
-		return keys;
-	;
-return self;}
-}),
-smalltalk.HashedCollection);
 
+smalltalk.addClass('RegularExpression', smalltalk.Object, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_values'),
+unescape('_compile_'),
 smalltalk.method({
-selector: unescape('values'),
-fn: function () {
+selector: unescape('compile%3A'),
+fn: function (aString) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_keys", []), "_collect_", [(function(each){return smalltalk.send(self, "_at_", [each]);})]);
+return self.compile(aString);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.RegularExpression);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_exec_'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-fn: function (aKey, aValue) {
+selector: unescape('exec%3A'),
+fn: function (aString) {
 var self=this;
-return smalltalk.send(self, "_basicAt_put_", [aKey, aValue]);
+return self.exec(aString) || nil;
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.RegularExpression);
 
 smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
+unescape('_test_'),
 smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
-fn: function (aKey, aBlock) {
+selector: unescape('test%3A'),
+fn: function (aString) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_includesKey_", [aKey]), "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_basicAt_", [aKey]);}), aBlock]);
+return self.test(aString);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.RegularExpression);
+
 
 smalltalk.addMethod(
-unescape('_at_ifAbsentPut_'),
+unescape('_fromString_'),
 smalltalk.method({
-selector: unescape('at%3AifAbsentPut%3A'),
-fn: function (aKey, aBlock) {
+selector: unescape('fromString%3A'),
+fn: function (aString) {
 var self=this;
-return smalltalk.send(self, "_at_ifAbsent_", [aKey, (function(){return smalltalk.send(self, "_at_put_", [aKey, smalltalk.send(aBlock, "_value", [])]);})]);
+return smalltalk.send(self, "_fromString_flag_", [aString, ""]);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.RegularExpression.klass);
 
 smalltalk.addMethod(
-unescape('_at_ifPresent_'),
+unescape('_fromString_flag_'),
 smalltalk.method({
-selector: unescape('at%3AifPresent%3A'),
-fn: function (aKey, aBlock) {
+selector: unescape('fromString%3Aflag%3A'),
+fn: function (aString, anotherString) {
 var self=this;
-return (($receiver = smalltalk.send(self, "_basicAt_", [aKey])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_at_", [aKey])]);})() : nil;
+return new RegExp(aString, anotherString);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.RegularExpression.klass);
+
 
+smalltalk.addClass('Stream', smalltalk.Object, ['collection', 'position', 'streamSize'], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_at_ifPresent_ifAbsent_'),
+unescape('_atEnd'),
 smalltalk.method({
-selector: unescape('at%3AifPresent%3AifAbsent%3A'),
-fn: function (aKey, aBlock, anotherBlock) {
+selector: unescape('atEnd'),
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_basicAt_", [aKey]), "_ifNil_ifNotNil_", [anotherBlock, (function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_at_", [aKey])]);})]);
+return smalltalk.send(smalltalk.send(self, "_position", []), "__eq", [smalltalk.send(self, "_size", [])]);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_at_'),
+unescape('_atStart'),
 smalltalk.method({
-selector: unescape('at%3A'),
-fn: function (aKey) {
+selector: unescape('atStart'),
+fn: function () {
 var self=this;
-return smalltalk.send(self, "_at_ifAbsent_", [aKey, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
+return smalltalk.send(smalltalk.send(self, "_position", []), "__eq", [(0)]);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_add_'),
+unescape('_close'),
 smalltalk.method({
-selector: unescape('add%3A'),
-fn: function (anAssociation) {
+selector: unescape('close'),
+fn: function () {
 var self=this;
-smalltalk.send(self, "_at_put_", [smalltalk.send(anAssociation, "_key", []), smalltalk.send(anAssociation, "_value", [])]);
+
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_addAll_'),
+unescape('_collection'),
 smalltalk.method({
-selector: unescape('addAll%3A'),
-fn: function (aHashedCollection) {
+selector: unescape('collection'),
+fn: function () {
 var self=this;
-smalltalk.send(self, "_addAll_", [smalltalk.send(aHashedCollection, "_associations", [])], smalltalk.Collection);
-return aHashedCollection;
+return self['@collection'];
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_removeKey_'),
+unescape('_contents'),
 smalltalk.method({
-selector: unescape('removeKey%3A'),
-fn: function (aKey) {
+selector: unescape('contents'),
+fn: function () {
 var self=this;
-smalltalk.send(self, "_remove_", [aKey]);
+return smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [(1), smalltalk.send(self, "_streamSize", [])]);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_remove_ifAbsent_'),
+unescape('_do_'),
 smalltalk.method({
-selector: unescape('remove%3AifAbsent%3A'),
-fn: function (aKey, aBlock) {
+selector: unescape('do%3A'),
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(self, "_removeKey_ifAbsent_", [aKey, aBlock]);
+(function(){while(!(function(){return smalltalk.send(self, "_atEnd", []);})()) {(function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_next", [])]);})()}})();
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_removeKey_ifAbsent_'),
+unescape('_flush'),
 smalltalk.method({
-selector: unescape('removeKey%3AifAbsent%3A'),
-fn: function (aKey, aBlock) {
+selector: unescape('flush'),
+fn: function () {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_includesKey_", [aKey])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(aBlock, "_value", []);})() : (function(){return smalltalk.send(self, "_basicDelete_", [aKey]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(aBlock, "_value", []);}), (function(){return smalltalk.send(self, "_basicDelete_", [aKey]);})]));
+
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_isEmpty'),
 smalltalk.method({
-selector: unescape('%3D'),
-fn: function (aHashedCollection) {
+selector: unescape('isEmpty'),
+fn: function () {
 var self=this;
-try{((($receiver = smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aHashedCollection, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
-((($receiver = smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [smalltalk.send(aHashedCollection, "_size", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
-(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return smalltalk.send(smalltalk.send(self, "_associations", []), "__eq", [smalltalk.send(aHashedCollection, "_associations", [])])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}}
+return smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [(0)]);
+return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_next'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
+selector: unescape('next'),
 fn: function () {
 var self=this;
-var copy=nil;
-(copy=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(copy, "_at_put_", [smalltalk.send(each, "_key", []), smalltalk.send(each, "_value", [])]);})]);
-return copy;
+return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return nil;})() : (function(){smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);return smalltalk.send(self['@collection'], "_at_", [smalltalk.send(self, "_position", [])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return nil;}), (function(){smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);return smalltalk.send(self['@collection'], "_at_", [smalltalk.send(self, "_position", [])]);})]));
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('__comma'),
+unescape('_next_'),
 smalltalk.method({
-selector: unescape('%2C'),
-fn: function (aCollection) {
+selector: unescape('next%3A'),
+fn: function (anInteger) {
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+var tempCollection=nil;
+(tempCollection=smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_class", []), "_new", []));
+smalltalk.send(anInteger, "_timesRepeat_", [(function(){return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(tempCollection, "_add_", [smalltalk.send(self, "_next", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(tempCollection, "_add_", [smalltalk.send(self, "_next", [])]);})]));})]);
+return tempCollection;
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_copyFrom_to_'),
+unescape('_nextPut_'),
 smalltalk.method({
-selector: unescape('copyFrom%3Ato%3A'),
-fn: function (anIndex, anotherIndex) {
+selector: unescape('nextPut%3A'),
+fn: function (anObject) {
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);
+smalltalk.send(smalltalk.send(self, "_collection", []), "_at_put_", [smalltalk.send(self, "_position", []), anObject]);
+smalltalk.send(self, "_setStreamSize_", [smalltalk.send(smalltalk.send(self, "_streamSize", []), "_max_", [smalltalk.send(self, "_position", [])])]);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_nextPutAll_'),
 smalltalk.method({
-selector: unescape('deepCopy'),
-fn: function () {
+selector: unescape('nextPutAll%3A'),
+fn: function (aCollection) {
 var self=this;
-var copy=nil;
-(copy=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(copy, "_at_put_", [smalltalk.send(each, "_key", []), smalltalk.send(smalltalk.send(each, "_value", []), "_deepCopy", [])]);})]);
-return copy;
+smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(self, "_nextPut_", [each]);})]);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_associationsDo_'),
+unescape('_peek'),
 smalltalk.method({
-selector: unescape('associationsDo%3A'),
-fn: function (aBlock) {
+selector: unescape('peek'),
+fn: function () {
 var self=this;
-smalltalk.send(smalltalk.send(self, "_associations", []), "_do_", [aBlock]);
+return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_collection", []), "_at_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_collection", []), "_at_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})]));
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_keysAndValuesDo_'),
+unescape('_position'),
 smalltalk.method({
-selector: unescape('keysAndValuesDo%3A'),
-fn: function (aBlock) {
+selector: unescape('position'),
+fn: function () {
 var self=this;
-smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(aBlock, "_value_value_", [smalltalk.send(each, "_key", []), smalltalk.send(each, "_value", [])]);})]);
+return (($receiver = self['@position']) == nil || $receiver == undefined) ? (function(){return (self['@position']=(0));})() : $receiver;
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_do_'),
+unescape('_position_'),
 smalltalk.method({
-selector: unescape('do%3A'),
-fn: function (aBlock) {
+selector: unescape('position%3A'),
+fn: function (anInteger) {
 var self=this;
-smalltalk.send(smalltalk.send(self, "_values", []), "_do_", [aBlock]);
+(self['@position']=anInteger);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_select_'),
+unescape('_reset'),
 smalltalk.method({
-selector: unescape('select%3A'),
-fn: function (aBlock) {
+selector: unescape('reset'),
+fn: function () {
 var self=this;
-var newDict=nil;
-(newDict=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return ((($receiver = smalltalk.send(aBlock, "_value_", [value])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(newDict, "_at_put_", [key, value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(newDict, "_at_put_", [key, value]);})]));})]);
-return newDict;
+smalltalk.send(self, "_position_", [(0)]);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_collect_'),
+unescape('_resetContents'),
 smalltalk.method({
-selector: unescape('collect%3A'),
-fn: function (aBlock) {
+selector: unescape('resetContents'),
+fn: function () {
 var self=this;
-var newDict=nil;
-(newDict=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(newDict, "_at_put_", [key, smalltalk.send(aBlock, "_value_", [value])]);})]);
-return newDict;
+smalltalk.send(self, "_reset", []);
+smalltalk.send(self, "_setStreamSize_", [(0)]);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_detect_ifNone_'),
+unescape('_setCollection_'),
 smalltalk.method({
-selector: unescape('detect%3AifNone%3A'),
-fn: function (aBlock, anotherBlock) {
+selector: unescape('setCollection%3A'),
+fn: function (aCollection) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_values", []), "_detect_ifNone_", [aBlock, anotherBlock]);
+(self['@collection']=aCollection);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_includes_'),
+unescape('_setStreamSize_'),
 smalltalk.method({
-selector: unescape('includes%3A'),
-fn: function (anObject) {
+selector: unescape('setStreamSize%3A'),
+fn: function (anInteger) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_values", []), "_includes_", [anObject]);
+(self['@streamSize']=anInteger);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_setToEnd'),
 smalltalk.method({
-selector: unescape('printString'),
+selector: unescape('setToEnd'),
 fn: function () {
 var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(aStream){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Collection)]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);})(aStream);smalltalk.send(smalltalk.send(self, "_associations", []), "_do_separatedBy_", [(function(anAssociation){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(anAssociation, "_key", []), "_printString", [])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%20-%3E%20")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(anAssociation, "_value", []), "_printString", [])]);})(aStream);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%20%2C%20")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [unescape("%29")]);})]);
+smalltalk.send(self, "_position_", [smalltalk.send(self, "_size", [])]);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_storeOn_'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('storeOn%3A'),
-fn: function (aStream) {
+selector: unescape('size'),
+fn: function () {
 var self=this;
-smalltalk.send(aStream, "_nextPutAll_", [unescape("%23%7B")]);
-smalltalk.send(smalltalk.send(self, "_associations", []), "_do_separatedBy_", [(function(each){return smalltalk.send(each, "_storeOn_", [aStream]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [". "]);})]);
-smalltalk.send(aStream, "_nextPutAll_", [unescape("%7D")]);
+return smalltalk.send(self, "_streamSize", []);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_includesKey_'),
+unescape('_skip_'),
 smalltalk.method({
-selector: unescape('includesKey%3A'),
-fn: function (aKey) {
+selector: unescape('skip%3A'),
+fn: function (anInteger) {
 var self=this;
-return self.hasOwnProperty(aKey);
+smalltalk.send(self, "_position_", [smalltalk.send(((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +anInteger : smalltalk.send($receiver, "__plus", [anInteger])), "_min_max_", [smalltalk.send(self, "_size", []), (0)])]);
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_asDictionary'),
+unescape('_streamSize'),
 smalltalk.method({
-selector: unescape('asDictionary'),
+selector: unescape('streamSize'),
 fn: function () {
 var self=this;
-return smalltalk.send((smalltalk.Dictionary || Dictionary), "_fromPairs_", [smalltalk.send(self, "_associations", [])]);
-return self;}
-}),
-smalltalk.HashedCollection);
-
-smalltalk.addMethod(
-unescape('_asJSON'),
-smalltalk.method({
-selector: unescape('asJSON'),
-fn: function (){
-var self=this;
-var c=nil;
-(c=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(c, "_at_put_", [key, smalltalk.send(value, "_asJSON", [])]);})]);
-return c;
+return self['@streamSize'];
 return self;}
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 
 smalltalk.addMethod(
-unescape('_fromPairs_'),
+unescape('_on_'),
 smalltalk.method({
-selector: unescape('fromPairs%3A'),
+selector: unescape('on%3A'),
 fn: function (aCollection) {
 var self=this;
-var dict=nil;
-(dict=smalltalk.send(self, "_new", []));
-smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(dict, "_add_", [each]);})]);
-return dict;
+return (function($rec){smalltalk.send($rec, "_setCollection_", [aCollection]);smalltalk.send($rec, "_setStreamSize_", [smalltalk.send(aCollection, "_size", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
-smalltalk.HashedCollection.klass);
-
+smalltalk.Stream.klass);
 
-smalltalk.addClass('Dictionary', smalltalk.HashedCollection, ['keys', 'values'], 'Kernel-Collections');
-smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
-smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
-fn: function (aKey, aBlock) {
-var self=this;
-
-		var index;
-		for(var i=0;i<self['@keys'].length;i++){
-			if(self['@keys'][i].__eq(aKey)) {index = i;}
-		};
-		if(typeof index === 'undefined') {
-			return aBlock();
-		} else {
-			return self['@values'][index];
-		}
-	;
-return self;}
-}),
-smalltalk.Dictionary);
 
+smalltalk.addClass('StringStream', smalltalk.Stream, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_keys'),
+unescape('_cr'),
 smalltalk.method({
-selector: unescape('keys'),
+selector: unescape('cr'),
 fn: function () {
 var self=this;
-return smalltalk.send(self['@keys'], "_copy", []);
+return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_cr", [])]);
 return self;}
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_values'),
+unescape('_crlf'),
 smalltalk.method({
-selector: unescape('values'),
+selector: unescape('crlf'),
 fn: function () {
 var self=this;
-return smalltalk.send(self['@values'], "_copy", []);
+return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_crlf", [])]);
 return self;}
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_lf'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-fn: function (aKey, aValue) {
+selector: unescape('lf'),
+fn: function () {
 var self=this;
-
-		var index = self['@keys'].indexOf(aKey);
-		if(index === -1) {
-			self['@values'].push(aValue);
-			self['@keys'].push(aKey);
-		} else {
-			self['@values'][index] = aValue;
-		};
-
-		return aValue;
-	;
+return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_lf", [])]);
 return self;}
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_removeKey_ifAbsent_'),
+unescape('_next_'),
 smalltalk.method({
-selector: unescape('removeKey%3AifAbsent%3A'),
-fn: function (aKey, aBlock) {
+selector: unescape('next%3A'),
+fn: function (anInteger) {
 var self=this;
-
-		var index = self['@keys'].indexOf(aKey);
-		if(index === -1) {
-			return aBlock()
-		} else {
-			self['@keys'].splice(i, 1);
-			self['@values'].splice(i, 1);
-			return aKey
-		};
-	;
+var tempCollection=nil;
+(tempCollection=smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_class", []), "_new", []));
+smalltalk.send(anInteger, "_timesRepeat_", [(function(){return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (tempCollection=smalltalk.send(tempCollection, "__comma", [smalltalk.send(self, "_next", [])]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (tempCollection=smalltalk.send(tempCollection, "__comma", [smalltalk.send(self, "_next", [])]));})]));})]);
+return tempCollection;
 return self;}
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_nextPut_'),
 smalltalk.method({
-selector: unescape('initialize'),
-fn: function () {
+selector: unescape('nextPut%3A'),
+fn: function (aString) {
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.HashedCollection);
-(self['@keys']=[]);
-(self['@values']=[]);
+smalltalk.send(self, "_nextPutAll_", [aString]);
 return self;}
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_includesKey_'),
+unescape('_nextPutAll_'),
 smalltalk.method({
-selector: unescape('includesKey%3A'),
-fn: function (aKey) {
+selector: unescape('nextPutAll%3A'),
+fn: function (aString) {
 var self=this;
-return smalltalk.send(self['@keys'], "_includes_", [aKey]);
+smalltalk.send(self, "_setCollection_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [(1), smalltalk.send(self, "_position", [])]), "__comma", [aString]), "__comma", [smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [((($receiver = ((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])])), smalltalk.send(smalltalk.send(self, "_collection", []), "_size", [])])])]);
+smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])]))]);
+smalltalk.send(self, "_setStreamSize_", [smalltalk.send(smalltalk.send(self, "_streamSize", []), "_max_", [smalltalk.send(self, "_position", [])])]);
 return self;}
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_asHashedCollection'),
+unescape('_space'),
 smalltalk.method({
-selector: unescape('asHashedCollection'),
+selector: unescape('space'),
 fn: function () {
 var self=this;
-return smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_fromPairs_", [smalltalk.send(self, "_associations", [])]);
-return self;}
-}),
-smalltalk.Dictionary);
-
-smalltalk.addMethod(
-unescape('_asJSON'),
-smalltalk.method({
-selector: unescape('asJSON'),
-fn: function (){
-var self=this;
-return smalltalk.send(smalltalk.send(self, "_asHashedCollection", []), "_asJSON", []);
+smalltalk.send(self, "_nextPut_", [" "]);
 return self;}
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 
 
diff --git a/amber/src/js/Kernel-Collections.js b/amber/src/js/Kernel-Collections.js
index a5f8de61e49..94475532767 100644
--- a/amber/src/js/Kernel-Collections.js
+++ b/amber/src/js/Kernel-Collections.js
@@ -17,49 +17,51 @@ referencedClasses: []
 smalltalk.Association);
 
 smalltalk.addMethod(
-unescape('_key_'),
+unescape('_key'),
 smalltalk.method({
-selector: unescape('key%3A'),
+selector: unescape('key'),
 category: 'accessing',
-fn: function (aKey) {
+fn: function () {
 var self=this;
-(self['@key']=aKey);
+return self['@key'];
 return self;},
-args: ["aKey"],
-source: unescape('key%3A%20aKey%0A%09key%20%3A%3D%20aKey'),
+args: [],
+source: unescape('key%0A%09%5Ekey'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Association);
 
 smalltalk.addMethod(
-unescape('_key'),
+unescape('_key_'),
 smalltalk.method({
-selector: unescape('key'),
+selector: unescape('key%3A'),
 category: 'accessing',
-fn: function () {
+fn: function (aKey) {
 var self=this;
-return self['@key'];
+(self['@key']=aKey);
 return self;},
-args: [],
-source: unescape('key%0A%09%5Ekey'),
+args: ["aKey"],
+source: unescape('key%3A%20aKey%0A%09key%20%3A%3D%20aKey'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Association);
 
 smalltalk.addMethod(
-unescape('_value_'),
+unescape('_storeOn_'),
 smalltalk.method({
-selector: unescape('value%3A'),
-category: 'accessing',
-fn: function (aValue) {
+selector: unescape('storeOn%3A'),
+category: 'comparing',
+fn: function (aStream) {
 var self=this;
-(self['@value']=aValue);
+smalltalk.send(self['@key'], "_storeOn_", [aStream]);
+smalltalk.send(aStream, "_nextPutAll_", [unescape("-%3E")]);
+smalltalk.send(self['@value'], "_storeOn_", [aStream]);
 return self;},
-args: ["aValue"],
-source: unescape('value%3A%20aValue%0A%09value%20%3A%3D%20aValue'),
-messageSends: [],
+args: ["aStream"],
+source: unescape('storeOn%3A%20aStream%0A%09%22Store%20in%20the%20format%20%28key-%3Evalue%29%22%0A%0A%09%22aStream%20nextPutAll%3A%20%27%28%27.%22%0A%09key%20storeOn%3A%20aStream.%0A%09aStream%20nextPutAll%3A%20%27-%3E%27.%0A%09value%20storeOn%3A%20aStream.%0A%09%22aStream%20nextPutAll%3A%20%27%29%27%22'),
+messageSends: ["storeOn:", "nextPutAll:"],
 referencedClasses: []
 }),
 smalltalk.Association);
@@ -81,19 +83,17 @@ referencedClasses: []
 smalltalk.Association);
 
 smalltalk.addMethod(
-unescape('_storeOn_'),
+unescape('_value_'),
 smalltalk.method({
-selector: unescape('storeOn%3A'),
-category: 'comparing',
-fn: function (aStream) {
+selector: unescape('value%3A'),
+category: 'accessing',
+fn: function (aValue) {
 var self=this;
-smalltalk.send(self['@key'], "_storeOn_", [aStream]);
-smalltalk.send(aStream, "_nextPutAll_", [unescape("-%3E")]);
-smalltalk.send(self['@value'], "_storeOn_", [aStream]);
+(self['@value']=aValue);
 return self;},
-args: ["aStream"],
-source: unescape('storeOn%3A%20aStream%0A%09%22Store%20in%20the%20format%20%28key-%3Evalue%29%22%0A%0A%09%22aStream%20nextPutAll%3A%20%27%28%27.%22%0A%09key%20storeOn%3A%20aStream.%0A%09aStream%20nextPutAll%3A%20%27-%3E%27.%0A%09value%20storeOn%3A%20aStream.%0A%09%22aStream%20nextPutAll%3A%20%27%29%27%22'),
-messageSends: ["storeOn:", "nextPutAll:"],
+args: ["aValue"],
+source: unescape('value%3A%20aValue%0A%09value%20%3A%3D%20aValue'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Association);
@@ -116,364 +116,346 @@ referencedClasses: []
 smalltalk.Association.klass);
 
 
-smalltalk.addClass('Stream', smalltalk.Object, ['collection', 'position', 'streamSize'], 'Kernel-Collections');
-smalltalk.addMethod(
-unescape('_collection'),
-smalltalk.method({
-selector: unescape('collection'),
-category: 'accessing',
-fn: function () {
-var self=this;
-return self['@collection'];
-return self;},
-args: [],
-source: unescape('collection%0A%09%5Ecollection'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Stream);
-
+smalltalk.addClass('Collection', smalltalk.Object, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_setCollection_'),
+unescape('__comma'),
 smalltalk.method({
-selector: unescape('setCollection%3A'),
-category: 'accessing',
+selector: unescape('%2C'),
+category: 'copying',
 fn: function (aCollection) {
 var self=this;
-(self['@collection']=aCollection);
+return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
 return self;},
 args: ["aCollection"],
-source: unescape('setCollection%3A%20aCollection%0A%09collection%20%3A%3D%20aCollection'),
-messageSends: [],
+source: unescape('%2C%20aCollection%0A%09%5Eself%20copy%20%0A%09%20%20%20%20addAll%3A%20aCollection%3B%20%0A%09%20%20%20%20yourself'),
+messageSends: ["addAll:", "yourself", "copy"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_position'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('position'),
-category: 'accessing',
-fn: function () {
+selector: unescape('add%3A'),
+category: 'adding/removing',
+fn: function (anObject) {
 var self=this;
-return (($receiver = self['@position']) == nil || $receiver == undefined) ? (function(){return (self['@position']=(0));})() : $receiver;
+smalltalk.send(self, "_subclassResponsibility", []);
 return self;},
-args: [],
-source: unescape('position%0A%09%5Eposition%20ifNil%3A%20%5Bposition%20%3A%3D%200%5D'),
-messageSends: ["ifNil:"],
+args: ["anObject"],
+source: unescape('add%3A%20anObject%0A%09self%20subclassResponsibility'),
+messageSends: ["subclassResponsibility"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_position_'),
+unescape('_addAll_'),
 smalltalk.method({
-selector: unescape('position%3A'),
-category: 'accessing',
-fn: function (anInteger) {
+selector: unescape('addAll%3A'),
+category: 'adding/removing',
+fn: function (aCollection) {
 var self=this;
-(self['@position']=anInteger);
+smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(self, "_add_", [each]);})]);
+return aCollection;
 return self;},
-args: ["anInteger"],
-source: unescape('position%3A%20anInteger%0A%09position%20%3A%3D%20anInteger'),
-messageSends: [],
+args: ["aCollection"],
+source: unescape('addAll%3A%20aCollection%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20add%3A%20each%5D.%0A%09%5EaCollection'),
+messageSends: ["do:", "add:"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_streamSize'),
+unescape('_asArray'),
 smalltalk.method({
-selector: unescape('streamSize'),
-category: 'accessing',
+selector: unescape('asArray'),
+category: 'converting',
 fn: function () {
 var self=this;
-return self['@streamSize'];
+return smalltalk.send((smalltalk.Array || Array), "_withAll_", [self]);
 return self;},
 args: [],
-source: unescape('streamSize%0A%09%5EstreamSize'),
-messageSends: [],
-referencedClasses: []
+source: unescape('asArray%0A%09%5EArray%20withAll%3A%20self'),
+messageSends: ["withAll:"],
+referencedClasses: ["Array"]
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_setStreamSize_'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('setStreamSize%3A'),
-category: 'accessing',
-fn: function (anInteger) {
+selector: unescape('asJSON'),
+category: 'converting',
+fn: function (){
 var self=this;
-(self['@streamSize']=anInteger);
+return smalltalk.send(smalltalk.send(self, "_asArray", []), "_collect_", [(function(each){return smalltalk.send(each, "_asJSON", []);})]);
 return self;},
-args: ["anInteger"],
-source: unescape('setStreamSize%3A%20anInteger%0A%09streamSize%20%3A%3D%20anInteger'),
-messageSends: [],
+args: [],
+source: unescape('asJSON%0A%09%5Eself%20asArray%20collect%3A%20%5B%3Aeach%20%7C%20each%20asJSON%5D'),
+messageSends: ["collect:", "asArray", "asJSON"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_contents'),
+unescape('_asOrderedCollection'),
 smalltalk.method({
-selector: unescape('contents'),
-category: 'accessing',
+selector: unescape('asOrderedCollection'),
+category: 'converting',
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [(1), smalltalk.send(self, "_streamSize", [])]);
+return smalltalk.send(self, "_asArray", []);
 return self;},
 args: [],
-source: unescape('contents%0A%09%5Eself%20collection%0A%09%20%20%20%20copyFrom%3A%201%20%0A%09%20%20%20%20to%3A%20self%20streamSize'),
-messageSends: ["copyFrom:to:", "collection", "streamSize"],
+source: unescape('asOrderedCollection%0A%09%5Eself%20asArray'),
+messageSends: ["asArray"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_asSet'),
 smalltalk.method({
-selector: unescape('size'),
-category: 'accessing',
+selector: unescape('asSet'),
+category: 'converting',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_streamSize", []);
+return smalltalk.send((smalltalk.Set || Set), "_withAll_", [self]);
 return self;},
 args: [],
-source: unescape('size%0A%09%5Eself%20streamSize'),
-messageSends: ["streamSize"],
-referencedClasses: []
+source: unescape('asSet%0A%09%5ESet%20withAll%3A%20self'),
+messageSends: ["withAll:"],
+referencedClasses: ["Set"]
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_reset'),
+unescape('_collect_'),
 smalltalk.method({
-selector: unescape('reset'),
-category: 'actions',
-fn: function () {
+selector: unescape('collect%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
 var self=this;
-smalltalk.send(self, "_position_", [(0)]);
+var newCollection=nil;
+(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_do_", [(function(each){return smalltalk.send(newCollection, "_add_", [smalltalk.send(aBlock, "_value_", [each])]);})]);
+return newCollection;
 return self;},
-args: [],
-source: unescape('reset%0A%09self%20position%3A%200'),
-messageSends: ["position:"],
+args: ["aBlock"],
+source: unescape('collect%3A%20aBlock%0A%09%7C%20newCollection%20%7C%0A%09newCollection%20%3A%3D%20self%20class%20new.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20newCollection%20add%3A%20%28aBlock%20value%3A%20each%29%5D.%0A%09%5EnewCollection'),
+messageSends: ["new", "class", "do:", "add:", "value:"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_close'),
+unescape('_copyWith_'),
 smalltalk.method({
-selector: unescape('close'),
-category: 'actions',
-fn: function () {
+selector: unescape('copyWith%3A'),
+category: 'copying',
+fn: function (anObject) {
 var self=this;
-
+return (function($rec){smalltalk.send($rec, "_add_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
 return self;},
-args: [],
-source: unescape('close'),
-messageSends: [],
+args: ["anObject"],
+source: unescape('copyWith%3A%20anObject%0A%09%5Eself%20copy%20add%3A%20anObject%3B%20yourself'),
+messageSends: ["add:", "yourself", "copy"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_flush'),
+unescape('_copyWithAll_'),
 smalltalk.method({
-selector: unescape('flush'),
-category: 'actions',
-fn: function () {
+selector: unescape('copyWithAll%3A'),
+category: 'copying',
+fn: function (aCollection) {
 var self=this;
-
+return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
 return self;},
-args: [],
-source: unescape('flush'),
-messageSends: [],
+args: ["aCollection"],
+source: unescape('copyWithAll%3A%20aCollection%0A%09%5Eself%20copy%20addAll%3A%20aCollection%3B%20yourself'),
+messageSends: ["addAll:", "yourself", "copy"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_resetContents'),
+unescape('_copyWithoutAll_'),
 smalltalk.method({
-selector: unescape('resetContents'),
-category: 'actions',
-fn: function () {
-var self=this;
-smalltalk.send(self, "_reset", []);
-smalltalk.send(self, "_setStreamSize_", [(0)]);
+selector: unescape('copyWithoutAll%3A'),
+category: 'copying',
+fn: function (aCollection) {
+var self=this;
+return smalltalk.send(self, "_reject_", [(function(each){return smalltalk.send(aCollection, "_includes_", [each]);})]);
 return self;},
-args: [],
-source: unescape('resetContents%0A%09self%20reset.%0A%09self%20setStreamSize%3A%200'),
-messageSends: ["reset", "setStreamSize:"],
+args: ["aCollection"],
+source: unescape('copyWithoutAll%3A%20aCollection%0A%09%22Answer%20a%20copy%20of%20the%20receiver%20that%20does%20not%20contain%20any%20elements%20%0A%09equal%20to%20those%20in%20aCollection.%22%0A%0A%09%5E%20self%20reject%3A%20%5B%3Aeach%20%7C%20aCollection%20includes%3A%20each%5D'),
+messageSends: ["reject:", "includes:"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_do_'),
+unescape('_detect_'),
 smalltalk.method({
-selector: unescape('do%3A'),
+selector: unescape('detect%3A'),
 category: 'enumerating',
 fn: function (aBlock) {
 var self=this;
-(function(){while(!(function(){return smalltalk.send(self, "_atEnd", []);})()) {(function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_next", [])]);})()}})();
+return smalltalk.send(self, "_detect_ifNone_", [aBlock, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
 return self;},
 args: ["aBlock"],
-source: unescape('do%3A%20aBlock%0A%09%5Bself%20atEnd%5D%20whileFalse%3A%20%5BaBlock%20value%3A%20self%20next%5D'),
-messageSends: ["whileFalse:", "atEnd", "value:", "next"],
+source: unescape('detect%3A%20aBlock%0A%09%5Eself%20detect%3A%20aBlock%20ifNone%3A%20%5Bself%20errorNotFound%5D'),
+messageSends: ["detect:ifNone:", "errorNotFound"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_setToEnd'),
+unescape('_detect_ifNone_'),
 smalltalk.method({
-selector: unescape('setToEnd'),
-category: 'positioning',
-fn: function () {
+selector: unescape('detect%3AifNone%3A'),
+category: 'enumerating',
+fn: function (aBlock, anotherBlock) {
 var self=this;
-smalltalk.send(self, "_position_", [smalltalk.send(self, "_size", [])]);
-return self;},
-args: [],
-source: unescape('setToEnd%0A%09self%20position%3A%20self%20size'),
-messageSends: ["position:", "size"],
-referencedClasses: []
-}),
-smalltalk.Stream);
 
-smalltalk.addMethod(
-unescape('_skip_'),
-smalltalk.method({
-selector: unescape('skip%3A'),
-category: 'positioning',
-fn: function (anInteger) {
-var self=this;
-smalltalk.send(self, "_position_", [smalltalk.send(((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +anInteger : smalltalk.send($receiver, "__plus", [anInteger])), "_min_max_", [smalltalk.send(self, "_size", []), (0)])]);
+		for(var i = 0; i < self.length; i++)
+			if(aBlock(self[i]))
+				return self[i];
+		return anotherBlock();
+	;
 return self;},
-args: ["anInteger"],
-source: unescape('skip%3A%20anInteger%0A%09self%20position%3A%20%28%28self%20position%20+%20anInteger%29%20min%3A%20self%20size%20max%3A%200%29'),
-messageSends: ["position:", "min:max:", unescape("+"), "position", "size"],
+args: ["aBlock", "anotherBlock"],
+source: unescape('detect%3A%20aBlock%20ifNone%3A%20anotherBlock%0A%09%3C%0A%09%09for%28var%20i%20%3D%200%3B%20i%20%3C%20self.length%3B%20i++%29%0A%09%09%09if%28aBlock%28self%5Bi%5D%29%29%0A%09%09%09%09return%20self%5Bi%5D%3B%0A%09%09return%20anotherBlock%28%29%3B%0A%09%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_next'),
+unescape('_do_'),
 smalltalk.method({
-selector: unescape('next'),
-category: 'reading',
-fn: function () {
+selector: unescape('do%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return nil;})() : (function(){smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);return smalltalk.send(self['@collection'], "_at_", [smalltalk.send(self, "_position", [])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return nil;}), (function(){smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);return smalltalk.send(self['@collection'], "_at_", [smalltalk.send(self, "_position", [])]);})]));
+for(var i=0;i<self.length;i++){aBlock(self[i]);};
 return self;},
-args: [],
-source: unescape('next%0A%09%5Eself%20atEnd%20%0A%09%09ifTrue%3A%20%5Bnil%5D%0A%09%09ifFalse%3A%20%5B%0A%09%09%09self%20position%3A%20self%20position%20+%201.%20%0A%09%09%09collection%20at%3A%20self%20position%5D'),
-messageSends: ["ifTrue:ifFalse:", "atEnd", "position:", unescape("+"), "position", "at:"],
+args: ["aBlock"],
+source: unescape('do%3A%20aBlock%0A%09%3Cfor%28var%20i%3D0%3Bi%3Cself.length%3Bi++%29%7BaBlock%28self%5Bi%5D%29%3B%7D%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_next_'),
+unescape('_do_separatedBy_'),
 smalltalk.method({
-selector: unescape('next%3A'),
-category: 'reading',
-fn: function (anInteger) {
+selector: unescape('do%3AseparatedBy%3A'),
+category: 'enumerating',
+fn: function (aBlock, anotherBlock) {
 var self=this;
-var tempCollection=nil;
-(tempCollection=smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_class", []), "_new", []));
-smalltalk.send(anInteger, "_timesRepeat_", [(function(){return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(tempCollection, "_add_", [smalltalk.send(self, "_next", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(tempCollection, "_add_", [smalltalk.send(self, "_next", [])]);})]));})]);
-return tempCollection;
+var first=nil;
+(first=true);
+smalltalk.send(self, "_do_", [(function(each){((($receiver = first).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (first=false);})() : (function(){return smalltalk.send(anotherBlock, "_value", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (first=false);}), (function(){return smalltalk.send(anotherBlock, "_value", []);})]));return smalltalk.send(aBlock, "_value_", [each]);})]);
 return self;},
-args: ["anInteger"],
-source: unescape('next%3A%20anInteger%0A%09%7C%20tempCollection%20%7C%0A%09tempCollection%20%3A%3D%20self%20collection%20class%20new.%0A%09anInteger%20timesRepeat%3A%20%5B%0A%09%20%20%20%20self%20atEnd%20ifFalse%3A%20%5B%0A%09%09tempCollection%20add%3A%20self%20next%5D%5D.%0A%09%5EtempCollection'),
-messageSends: ["new", "class", "collection", "timesRepeat:", "ifFalse:", "atEnd", "add:", "next"],
+args: ["aBlock", "anotherBlock"],
+source: unescape('do%3A%20aBlock%20separatedBy%3A%20anotherBlock%0A%09%7C%20first%20%7C%0A%09first%20%3A%3D%20true.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20first%0A%09%09ifTrue%3A%20%5Bfirst%20%3A%3D%20false%5D%0A%09%09ifFalse%3A%20%5BanotherBlock%20value%5D.%0A%09%20%20%20%20aBlock%20value%3A%20each%5D'),
+messageSends: ["do:", "ifTrue:ifFalse:", "value", "value:"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_nextPut_'),
+unescape('_errorNotFound'),
 smalltalk.method({
-selector: unescape('nextPut%3A'),
-category: 'writing',
-fn: function (anObject) {
+selector: unescape('errorNotFound'),
+category: 'error handling',
+fn: function () {
 var self=this;
-smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);
-smalltalk.send(smalltalk.send(self, "_collection", []), "_at_put_", [smalltalk.send(self, "_position", []), anObject]);
-smalltalk.send(self, "_setStreamSize_", [smalltalk.send(smalltalk.send(self, "_streamSize", []), "_max_", [smalltalk.send(self, "_position", [])])]);
+smalltalk.send(self, "_error_", ["Object is not in the collection"]);
 return self;},
-args: ["anObject"],
-source: unescape('nextPut%3A%20anObject%0A%09self%20position%3A%20self%20position%20+%201.%0A%09self%20collection%20at%3A%20self%20position%20put%3A%20anObject.%0A%09self%20setStreamSize%3A%20%28self%20streamSize%20max%3A%20self%20position%29'),
-messageSends: ["position:", unescape("+"), "position", "at:put:", "collection", "setStreamSize:", "max:", "streamSize"],
+args: [],
+source: unescape('errorNotFound%0A%09self%20error%3A%20%27Object%20is%20not%20in%20the%20collection%27'),
+messageSends: ["error:"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_nextPutAll_'),
+unescape('_ifEmpty_'),
 smalltalk.method({
-selector: unescape('nextPutAll%3A'),
-category: 'writing',
-fn: function (aCollection) {
+selector: unescape('ifEmpty%3A'),
+category: 'testing',
+fn: function (aBlock){
 var self=this;
-smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(self, "_nextPut_", [each]);})]);
+return ((($receiver = smalltalk.send(self, "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(aBlock, "_value", []);})() : (function(){return self;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(aBlock, "_value", []);}), (function(){return self;})]));
 return self;},
-args: ["aCollection"],
-source: unescape('nextPutAll%3A%20aCollection%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20nextPut%3A%20each%5D'),
-messageSends: ["do:", "nextPut:"],
+args: ["aBlock"],
+source: unescape('ifEmpty%3A%20aBlock%0A%09%22Evaluate%20the%20given%20block%20with%20the%20receiver%20as%20argument%2C%20answering%20its%20value%20if%20the%20receiver%20is%20empty%2C%20otherwise%20answer%20the%20receiver.%20Note%20that%20the%20fact%20that%20this%20method%20returns%20its%20argument%20in%20case%20the%20receiver%20is%20not%20empty%20allows%20one%20to%20write%20expressions%20like%20the%20following%20ones%3A%20self%20classifyMethodAs%3A%20%0A%09%09%28myProtocol%20ifEmpty%3A%20%5B%27As%20yet%20unclassified%27%5D%29%22%0A%09%5E%20self%20isEmpty%20%0A%09%09ifTrue%3A%20%5B%20aBlock%20value%20%5D%0A%09%09ifFalse%3A%20%5B%20self%20%5D'),
+messageSends: ["ifTrue:ifFalse:", "isEmpty", "value"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_peek'),
+unescape('_ifNotEmpty_'),
 smalltalk.method({
-selector: unescape('peek'),
-category: 'reading',
-fn: function () {
+selector: unescape('ifNotEmpty%3A'),
+category: 'testing',
+fn: function (aBlock) {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_collection", []), "_at_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_collection", []), "_at_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})]));
+smalltalk.send(smalltalk.send(self, "_notEmpty", []), "_ifTrue_", [aBlock]);
 return self;},
-args: [],
-source: unescape('peek%0A%09%5Eself%20atEnd%20ifFalse%3A%20%5B%0A%09%20%20%20%20self%20collection%20at%3A%20self%20position%20+%201%5D'),
-messageSends: ["ifFalse:", "atEnd", "at:", "collection", unescape("+"), "position"],
+args: ["aBlock"],
+source: unescape('ifNotEmpty%3A%20aBlock%0A%09self%20notEmpty%20ifTrue%3A%20aBlock.'),
+messageSends: ["ifTrue:", "notEmpty"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_atEnd'),
+unescape('_includes_'),
 smalltalk.method({
-selector: unescape('atEnd'),
+selector: unescape('includes%3A'),
 category: 'testing',
-fn: function () {
+fn: function (anObject) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_position", []), "__eq", [smalltalk.send(self, "_size", [])]);
+
+		var i = self.length;
+		while (i--) {
+			if (smalltalk.send(self[i], "__eq", [anObject])) {return true;}	
+		}
+		return false
+	;
 return self;},
-args: [],
-source: unescape('atEnd%0A%09%5Eself%20position%20%3D%20self%20size'),
-messageSends: [unescape("%3D"), "position", "size"],
+args: ["anObject"],
+source: unescape('includes%3A%20anObject%0A%09%3C%0A%09%09var%20i%20%3D%20self.length%3B%0A%09%09while%20%28i--%29%20%7B%0A%09%09%09if%20%28smalltalk.send%28self%5Bi%5D%2C%20%22__eq%22%2C%20%5BanObject%5D%29%29%20%7Breturn%20true%3B%7D%09%0A%09%09%7D%0A%09%09return%20false%0A%09%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_atStart'),
+unescape('_inject_into_'),
 smalltalk.method({
-selector: unescape('atStart'),
-category: 'testing',
-fn: function () {
+selector: unescape('inject%3Ainto%3A'),
+category: 'enumerating',
+fn: function (anObject, aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_position", []), "__eq", [(0)]);
+var result=nil;
+(result=anObject);
+smalltalk.send(self, "_do_", [(function(each){return (result=smalltalk.send(aBlock, "_value_value_", [result, each]));})]);
+return result;
 return self;},
-args: [],
-source: unescape('atStart%0A%09%5Eself%20position%20%3D%200'),
-messageSends: [unescape("%3D"), "position"],
+args: ["anObject", "aBlock"],
+source: unescape('inject%3A%20anObject%20into%3A%20aBlock%0A%09%7C%20result%20%7C%0A%09result%20%3A%3D%20anObject.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%20%20%20%20result%20%3A%3D%20aBlock%20value%3A%20result%20value%3A%20each%5D.%0A%09%5Eresult'),
+messageSends: ["do:", "value:value:"],
 referencedClasses: []
 }),
-smalltalk.Stream);
+smalltalk.Collection);
 
 smalltalk.addMethod(
 unescape('_isEmpty'),
@@ -489,110 +471,107 @@ source: unescape('isEmpty%0A%09%5Eself%20size%20%3D%200'),
 messageSends: [unescape("%3D"), "size"],
 referencedClasses: []
 }),
-smalltalk.Stream);
-
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_on_'),
+unescape('_notEmpty'),
 smalltalk.method({
-selector: unescape('on%3A'),
-category: 'instance creation',
-fn: function (aCollection) {
+selector: unescape('notEmpty'),
+category: 'testing',
+fn: function () {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_setCollection_", [aCollection]);smalltalk.send($rec, "_setStreamSize_", [smalltalk.send(aCollection, "_size", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return smalltalk.send(smalltalk.send(self, "_isEmpty", []), "_not", []);
 return self;},
-args: ["aCollection"],
-source: unescape('on%3A%20aCollection%0A%09%20%20%20%20%5Eself%20new%20%0A%09%09setCollection%3A%20aCollection%3B%0A%09%09setStreamSize%3A%20aCollection%20size%3B%0A%09%09yourself'),
-messageSends: ["setCollection:", "setStreamSize:", "size", "yourself", "new"],
+args: [],
+source: unescape('notEmpty%0A%09%5Eself%20isEmpty%20not'),
+messageSends: ["not", "isEmpty"],
 referencedClasses: []
 }),
-smalltalk.Stream.klass);
-
+smalltalk.Collection);
 
-smalltalk.addClass('RegularExpression', smalltalk.Object, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_compile_'),
+unescape('_readStream'),
 smalltalk.method({
-selector: unescape('compile%3A'),
-category: 'evaluating',
-fn: function (aString) {
+selector: unescape('readStream'),
+category: 'accessing',
+fn: function () {
 var self=this;
-return self.compile(aString);
+return smalltalk.send(self, "_stream", []);
 return self;},
-args: ["aString"],
-source: unescape('compile%3A%20aString%0A%09%3Creturn%20self.compile%28aString%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('readStream%0A%09%5Eself%20stream'),
+messageSends: ["stream"],
 referencedClasses: []
 }),
-smalltalk.RegularExpression);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_exec_'),
+unescape('_reject_'),
 smalltalk.method({
-selector: unescape('exec%3A'),
-category: 'evaluating',
-fn: function (aString) {
+selector: unescape('reject%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
 var self=this;
-return self.exec(aString) || nil;
+return smalltalk.send(self, "_select_", [(function(each){return smalltalk.send(smalltalk.send(aBlock, "_value_", [each]), "__eq", [false]);})]);
 return self;},
-args: ["aString"],
-source: unescape('exec%3A%20aString%0A%09%3Creturn%20self.exec%28aString%29%20%7C%7C%20nil%3E'),
-messageSends: [],
+args: ["aBlock"],
+source: unescape('reject%3A%20aBlock%0A%09%5Eself%20select%3A%20%5B%3Aeach%20%7C%20%28aBlock%20value%3A%20each%29%20%3D%20false%5D'),
+messageSends: ["select:", unescape("%3D"), "value:"],
 referencedClasses: []
 }),
-smalltalk.RegularExpression);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_test_'),
+unescape('_remove_'),
 smalltalk.method({
-selector: unescape('test%3A'),
-category: 'evaluating',
-fn: function (aString) {
+selector: unescape('remove%3A'),
+category: 'adding/removing',
+fn: function (anObject) {
 var self=this;
-return self.test(aString);
+return smalltalk.send(self, "_remove_ifAbsent_", [anObject, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
 return self;},
-args: ["aString"],
-source: unescape('test%3A%20aString%0A%09%3Creturn%20self.test%28aString%29%3E'),
-messageSends: [],
+args: ["anObject"],
+source: unescape('remove%3A%20anObject%0A%20%20%20%20%5Eself%20remove%3A%20anObject%20ifAbsent%3A%20%5Bself%20errorNotFound%5D'),
+messageSends: ["remove:ifAbsent:", "errorNotFound"],
 referencedClasses: []
 }),
-smalltalk.RegularExpression);
-
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_fromString_flag_'),
+unescape('_remove_ifAbsent_'),
 smalltalk.method({
-selector: unescape('fromString%3Aflag%3A'),
-category: 'instance creation',
-fn: function (aString, anotherString) {
+selector: unescape('remove%3AifAbsent%3A'),
+category: 'adding/removing',
+fn: function (anObject, aBlock) {
 var self=this;
-return new RegExp(aString, anotherString);
+smalltalk.send(self, "_subclassResponsibility", []);
 return self;},
-args: ["aString", "anotherString"],
-source: unescape('fromString%3A%20aString%20flag%3A%20anotherString%0A%09%3Creturn%20new%20RegExp%28aString%2C%20anotherString%29%3E'),
-messageSends: [],
+args: ["anObject", "aBlock"],
+source: unescape('remove%3A%20anObject%20ifAbsent%3A%20aBlock%0A%20%20%20%20self%20subclassResponsibility'),
+messageSends: ["subclassResponsibility"],
 referencedClasses: []
 }),
-smalltalk.RegularExpression.klass);
+smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_fromString_'),
+unescape('_select_'),
 smalltalk.method({
-selector: unescape('fromString%3A'),
-category: 'instance creation',
-fn: function (aString) {
+selector: unescape('select%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(self, "_fromString_flag_", [aString, ""]);
+var stream=nil;
+(stream=smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_new", []), "_writeStream", []));
+smalltalk.send(self, "_do_", [(function(each){return ((($receiver = smalltalk.send(aBlock, "_value_", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(stream, "_nextPut_", [each]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(stream, "_nextPut_", [each]);})]));})]);
+return smalltalk.send(stream, "_contents", []);
 return self;},
-args: ["aString"],
-source: unescape('fromString%3A%20aString%0A%09%20%20%20%20%5Eself%20fromString%3A%20aString%20flag%3A%20%27%27'),
-messageSends: ["fromString:flag:"],
+args: ["aBlock"],
+source: unescape('select%3A%20aBlock%0A%09%7C%20stream%20%7C%0A%09stream%20%3A%3D%20self%20class%20new%20writeStream.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20%28aBlock%20value%3A%20each%29%20ifTrue%3A%20%5B%0A%09%09stream%20nextPut%3A%20each%5D%5D.%0A%09%5Estream%20contents'),
+messageSends: ["writeStream", "new", "class", "do:", "ifTrue:", "value:", "nextPut:", "contents"],
 referencedClasses: []
 }),
-smalltalk.RegularExpression.klass);
-
+smalltalk.Collection);
 
-smalltalk.addClass('Collection', smalltalk.Object, [], 'Kernel-Collections');
 smalltalk.addMethod(
 unescape('_size'),
 smalltalk.method({
@@ -610,17 +589,33 @@ referencedClasses: []
 smalltalk.Collection);
 
 smalltalk.addMethod(
-unescape('_readStream'),
+unescape('_stream'),
 smalltalk.method({
-selector: unescape('readStream'),
+selector: unescape('stream'),
 category: 'accessing',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_stream", []);
+return smalltalk.send(smalltalk.send(self, "_streamClass", []), "_on_", [self]);
 return self;},
 args: [],
-source: unescape('readStream%0A%09%5Eself%20stream'),
-messageSends: ["stream"],
+source: unescape('stream%0A%09%5Eself%20streamClass%20on%3A%20self'),
+messageSends: ["on:", "streamClass"],
+referencedClasses: []
+}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+unescape('_streamClass'),
+smalltalk.method({
+selector: unescape('streamClass'),
+category: 'accessing',
+fn: function () {
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_class", []), "_streamClass", []);
+return self;},
+args: [],
+source: unescape('streamClass%0A%09%5Eself%20class%20streamClass'),
+messageSends: ["streamClass", "class"],
 referencedClasses: []
 }),
 smalltalk.Collection);
@@ -641,21 +636,22 @@ referencedClasses: []
 }),
 smalltalk.Collection);
 
+
 smalltalk.addMethod(
-unescape('_stream'),
+unescape('_new_'),
 smalltalk.method({
-selector: unescape('stream'),
-category: 'accessing',
-fn: function () {
+selector: unescape('new%3A'),
+category: 'instance creation',
+fn: function (anInteger) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_streamClass", []), "_on_", [self]);
+return smalltalk.send(self, "_new", []);
 return self;},
-args: [],
-source: unescape('stream%0A%09%5Eself%20streamClass%20on%3A%20self'),
-messageSends: ["on:", "streamClass"],
+args: ["anInteger"],
+source: unescape('new%3A%20anInteger%0A%09%5Eself%20new'),
+messageSends: ["new"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
 
 smalltalk.addMethod(
 unescape('_streamClass'),
@@ -664,162 +660,369 @@ selector: unescape('streamClass'),
 category: 'accessing',
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_streamClass", []);
+return (smalltalk.Stream || Stream);
 return self;},
 args: [],
-source: unescape('streamClass%0A%09%5Eself%20class%20streamClass'),
-messageSends: ["streamClass", "class"],
-referencedClasses: []
+source: unescape('streamClass%0A%09%20%20%20%20%5EStream'),
+messageSends: [],
+referencedClasses: ["Stream"]
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
 
 smalltalk.addMethod(
-unescape('_add_'),
+unescape('_with_'),
 smalltalk.method({
-selector: unescape('add%3A'),
-category: 'adding/removing',
+selector: unescape('with%3A'),
+category: 'instance creation',
 fn: function (anObject) {
 var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
+return (function($rec){smalltalk.send($rec, "_add_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
 args: ["anObject"],
-source: unescape('add%3A%20anObject%0A%09self%20subclassResponsibility'),
-messageSends: ["subclassResponsibility"],
+source: unescape('with%3A%20anObject%0A%09%20%20%20%20%5Eself%20new%0A%09%09add%3A%20anObject%3B%0A%09%09yourself'),
+messageSends: ["add:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
 
 smalltalk.addMethod(
-unescape('_addAll_'),
+unescape('_with_with_'),
 smalltalk.method({
-selector: unescape('addAll%3A'),
-category: 'adding/removing',
-fn: function (aCollection) {
+selector: unescape('with%3Awith%3A'),
+category: 'instance creation',
+fn: function (anObject, anotherObject) {
 var self=this;
-smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(self, "_add_", [each]);})]);
-return aCollection;
+return (function($rec){smalltalk.send($rec, "_add_", [anObject]);smalltalk.send($rec, "_add_", [anotherObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-args: ["aCollection"],
-source: unescape('addAll%3A%20aCollection%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20add%3A%20each%5D.%0A%09%5EaCollection'),
-messageSends: ["do:", "add:"],
+args: ["anObject", "anotherObject"],
+source: unescape('with%3A%20anObject%20with%3A%20anotherObject%0A%09%20%20%20%20%5Eself%20new%0A%09%09add%3A%20anObject%3B%0A%09%09add%3A%20anotherObject%3B%0A%09%09yourself'),
+messageSends: ["add:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
 
 smalltalk.addMethod(
-unescape('__comma'),
+unescape('_with_with_with_'),
 smalltalk.method({
-selector: unescape('%2C'),
-category: 'copying',
-fn: function (aCollection) {
+selector: unescape('with%3Awith%3Awith%3A'),
+category: 'instance creation',
+fn: function (firstObject, secondObject, thirdObject) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
+return (function($rec){smalltalk.send($rec, "_add_", [firstObject]);smalltalk.send($rec, "_add_", [secondObject]);smalltalk.send($rec, "_add_", [thirdObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-args: ["aCollection"],
-source: unescape('%2C%20aCollection%0A%09%5Eself%20copy%20%0A%09%20%20%20%20addAll%3A%20aCollection%3B%20%0A%09%20%20%20%20yourself'),
-messageSends: ["addAll:", "yourself", "copy"],
+args: ["firstObject", "secondObject", "thirdObject"],
+source: unescape('with%3A%20firstObject%20with%3A%20secondObject%20with%3A%20thirdObject%0A%09%20%20%20%20%5Eself%20new%0A%09%09add%3A%20firstObject%3B%0A%09%09add%3A%20secondObject%3B%0A%09%09add%3A%20thirdObject%3B%0A%09%09yourself'),
+messageSends: ["add:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
 
 smalltalk.addMethod(
-unescape('_copyWith_'),
+unescape('_withAll_'),
 smalltalk.method({
-selector: unescape('copyWith%3A'),
-category: 'copying',
-fn: function (anObject) {
+selector: unescape('withAll%3A'),
+category: 'instance creation',
+fn: function (aCollection) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_add_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
+return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-args: ["anObject"],
-source: unescape('copyWith%3A%20anObject%0A%09%5Eself%20copy%20add%3A%20anObject%3B%20yourself'),
-messageSends: ["add:", "yourself", "copy"],
+args: ["aCollection"],
+source: unescape('withAll%3A%20aCollection%0A%09%20%20%20%20%5Eself%20new%0A%09%09addAll%3A%20aCollection%3B%0A%09%09yourself'),
+messageSends: ["addAll:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.Collection.klass);
+
 
+smalltalk.addClass('HashedCollection', smalltalk.Collection, [], 'Kernel-Collections');
+smalltalk.HashedCollection.comment=unescape('A%20HashedCollection%20is%20a%20traditional%20JavaScript%20object%2C%20or%20a%20Smalltalk%20Dictionary.%0A%0AUnlike%20a%20Dictionary%2C%20it%20can%20only%20have%20strings%20as%20keys.')
 smalltalk.addMethod(
-unescape('_copyWithAll_'),
+unescape('__comma'),
 smalltalk.method({
-selector: unescape('copyWithAll%3A'),
+selector: unescape('%2C'),
 category: 'copying',
 fn: function (aCollection) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_copy", []));
+smalltalk.send(self, "_shouldNotImplement", []);
 return self;},
 args: ["aCollection"],
-source: unescape('copyWithAll%3A%20aCollection%0A%09%5Eself%20copy%20addAll%3A%20aCollection%3B%20yourself'),
-messageSends: ["addAll:", "yourself", "copy"],
+source: unescape('%2C%20aCollection%0A%09self%20shouldNotImplement'),
+messageSends: ["shouldNotImplement"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_asArray'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('asArray'),
-category: 'converting',
-fn: function () {
+selector: unescape('%3D'),
+category: 'comparing',
+fn: function (aHashedCollection) {
 var self=this;
-return smalltalk.send((smalltalk.Array || Array), "_withAll_", [self]);
-return self;},
-args: [],
-source: unescape('asArray%0A%09%5EArray%20withAll%3A%20self'),
-messageSends: ["withAll:"],
-referencedClasses: ["Array"]
+try{((($receiver = smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aHashedCollection, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
+((($receiver = smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [smalltalk.send(aHashedCollection, "_size", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
+(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return smalltalk.send(smalltalk.send(self, "_associations", []), "__eq", [smalltalk.send(aHashedCollection, "_associations", [])])}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}},
+args: ["aHashedCollection"],
+source: unescape('%3D%20aHashedCollection%0A%09self%20class%20%3D%20aHashedCollection%20class%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09self%20size%20%3D%20aHashedCollection%20size%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09%5Eself%20associations%20%3D%20aHashedCollection%20associations'),
+messageSends: ["ifFalse:", unescape("%3D"), "class", "size", "associations"],
+referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_do_'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('do%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
+selector: unescape('add%3A'),
+category: 'adding/removing',
+fn: function (anAssociation) {
 var self=this;
-for(var i=0;i<self.length;i++){aBlock(self[i]);};
+smalltalk.send(self, "_at_put_", [smalltalk.send(anAssociation, "_key", []), smalltalk.send(anAssociation, "_value", [])]);
 return self;},
-args: ["aBlock"],
-source: unescape('do%3A%20aBlock%0A%09%3Cfor%28var%20i%3D0%3Bi%3Cself.length%3Bi++%29%7BaBlock%28self%5Bi%5D%29%3B%7D%3E'),
-messageSends: [],
+args: ["anAssociation"],
+source: unescape('add%3A%20anAssociation%0A%09self%20at%3A%20anAssociation%20key%20put%3A%20anAssociation%20value'),
+messageSends: ["at:put:", "key", "value"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_collect_'),
+unescape('_addAll_'),
 smalltalk.method({
-selector: unescape('collect%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
-var self=this;
-var newCollection=nil;
-(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_do_", [(function(each){return smalltalk.send(newCollection, "_add_", [smalltalk.send(aBlock, "_value_", [each])]);})]);
-return newCollection;
+selector: unescape('addAll%3A'),
+category: 'adding/removing',
+fn: function (aHashedCollection) {
+var self=this;
+smalltalk.send(self, "_addAll_", [smalltalk.send(aHashedCollection, "_associations", [])], smalltalk.Collection);
+return aHashedCollection;
+return self;},
+args: ["aHashedCollection"],
+source: unescape('addAll%3A%20aHashedCollection%0A%09super%20addAll%3A%20aHashedCollection%20associations.%0A%09%5EaHashedCollection'),
+messageSends: ["addAll:", "associations"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_asDictionary'),
+smalltalk.method({
+selector: unescape('asDictionary'),
+category: 'converting',
+fn: function () {
+var self=this;
+return smalltalk.send((smalltalk.Dictionary || Dictionary), "_fromPairs_", [smalltalk.send(self, "_associations", [])]);
+return self;},
+args: [],
+source: unescape('asDictionary%0A%09%5EDictionary%20fromPairs%3A%20self%20associations'),
+messageSends: ["fromPairs:", "associations"],
+referencedClasses: ["Dictionary"]
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_asJSON'),
+smalltalk.method({
+selector: unescape('asJSON'),
+category: 'converting',
+fn: function (){
+var self=this;
+var c=nil;
+(c=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(c, "_at_put_", [key, smalltalk.send(value, "_asJSON", [])]);})]);
+return c;
+return self;},
+args: [],
+source: unescape('asJSON%0A%09%7C%20c%20%7C%0A%09c%20%3A%3D%20self%20class%20new.%0A%09self%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%09c%20at%3A%20key%20put%3A%20value%20asJSON%5D.%0A%09%5Ec'),
+messageSends: ["new", "class", "keysAndValuesDo:", "at:put:", "asJSON"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_associations'),
+smalltalk.method({
+selector: unescape('associations'),
+category: 'accessing',
+fn: function () {
+var self=this;
+var associations=nil;
+(associations=[]);
+smalltalk.send(smalltalk.send(self, "_keys", []), "_do_", [(function(each){return smalltalk.send(associations, "_add_", [smalltalk.send((smalltalk.Association || Association), "_key_value_", [each, smalltalk.send(self, "_at_", [each])])]);})]);
+return associations;
+return self;},
+args: [],
+source: unescape('associations%0A%09%7C%20associations%20%7C%0A%09associations%20%3A%3D%20%23%28%29.%0A%09self%20keys%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20associations%20add%3A%20%28Association%20key%3A%20each%20value%3A%20%28self%20at%3A%20each%29%29%5D.%0A%09%5Eassociations'),
+messageSends: ["do:", "keys", "add:", "key:value:", "at:"],
+referencedClasses: ["Association"]
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_associationsDo_'),
+smalltalk.method({
+selector: unescape('associationsDo%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
+var self=this;
+smalltalk.send(smalltalk.send(self, "_associations", []), "_do_", [aBlock]);
 return self;},
 args: ["aBlock"],
-source: unescape('collect%3A%20aBlock%0A%09%7C%20newCollection%20%7C%0A%09newCollection%20%3A%3D%20self%20class%20new.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20newCollection%20add%3A%20%28aBlock%20value%3A%20each%29%5D.%0A%09%5EnewCollection'),
-messageSends: ["new", "class", "do:", "add:", "value:"],
+source: unescape('associationsDo%3A%20aBlock%0A%09self%20associations%20do%3A%20aBlock'),
+messageSends: ["do:", "associations"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_detect_'),
+unescape('_at_'),
 smalltalk.method({
-selector: unescape('detect%3A'),
+selector: unescape('at%3A'),
+category: 'accessing',
+fn: function (aKey) {
+var self=this;
+return smalltalk.send(self, "_at_ifAbsent_", [aKey, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
+return self;},
+args: ["aKey"],
+source: unescape('at%3A%20aKey%0A%09%5Eself%20at%3A%20aKey%20ifAbsent%3A%20%5Bself%20errorNotFound%5D'),
+messageSends: ["at:ifAbsent:", "errorNotFound"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_at_ifAbsent_'),
+smalltalk.method({
+selector: unescape('at%3AifAbsent%3A'),
+category: 'accessing',
+fn: function (aKey, aBlock) {
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_includesKey_", [aKey]), "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_basicAt_", [aKey]);}), aBlock]);
+return self;},
+args: ["aKey", "aBlock"],
+source: unescape('at%3A%20aKey%20ifAbsent%3A%20aBlock%0A%09%5E%28self%20includesKey%3A%20aKey%29%0A%09%09ifTrue%3A%20%5Bself%20basicAt%3A%20aKey%5D%0A%09%09ifFalse%3A%20aBlock'),
+messageSends: ["ifTrue:ifFalse:", "includesKey:", "basicAt:"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_at_ifAbsentPut_'),
+smalltalk.method({
+selector: unescape('at%3AifAbsentPut%3A'),
+category: 'accessing',
+fn: function (aKey, aBlock) {
+var self=this;
+return smalltalk.send(self, "_at_ifAbsent_", [aKey, (function(){return smalltalk.send(self, "_at_put_", [aKey, smalltalk.send(aBlock, "_value", [])]);})]);
+return self;},
+args: ["aKey", "aBlock"],
+source: unescape('at%3A%20aKey%20ifAbsentPut%3A%20aBlock%0A%09%5Eself%20at%3A%20aKey%20ifAbsent%3A%20%5B%0A%09%20%20%20%20self%20at%3A%20aKey%20put%3A%20aBlock%20value%5D'),
+messageSends: ["at:ifAbsent:", "at:put:", "value"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_at_ifPresent_'),
+smalltalk.method({
+selector: unescape('at%3AifPresent%3A'),
+category: 'accessing',
+fn: function (aKey, aBlock) {
+var self=this;
+return (($receiver = smalltalk.send(self, "_basicAt_", [aKey])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_at_", [aKey])]);})() : nil;
+return self;},
+args: ["aKey", "aBlock"],
+source: unescape('at%3A%20aKey%20ifPresent%3A%20aBlock%0A%09%5E%28self%20basicAt%3A%20aKey%29%20ifNotNil%3A%20%5BaBlock%20value%3A%20%28self%20at%3A%20aKey%29%5D'),
+messageSends: ["ifNotNil:", "basicAt:", "value:", "at:"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_at_ifPresent_ifAbsent_'),
+smalltalk.method({
+selector: unescape('at%3AifPresent%3AifAbsent%3A'),
+category: 'accessing',
+fn: function (aKey, aBlock, anotherBlock) {
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_basicAt_", [aKey]), "_ifNil_ifNotNil_", [anotherBlock, (function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_at_", [aKey])]);})]);
+return self;},
+args: ["aKey", "aBlock", "anotherBlock"],
+source: unescape('at%3A%20aKey%20ifPresent%3A%20aBlock%20ifAbsent%3A%20anotherBlock%0A%09%5E%28self%20basicAt%3A%20aKey%29%0A%09%20%20%20%20ifNil%3A%20anotherBlock%0A%09%20%20%20%20ifNotNil%3A%20%5BaBlock%20value%3A%20%28self%20at%3A%20aKey%29%5D'),
+messageSends: ["ifNil:ifNotNil:", "basicAt:", "value:", "at:"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_at_put_'),
+smalltalk.method({
+selector: unescape('at%3Aput%3A'),
+category: 'accessing',
+fn: function (aKey, aValue) {
+var self=this;
+return smalltalk.send(self, "_basicAt_put_", [aKey, aValue]);
+return self;},
+args: ["aKey", "aValue"],
+source: unescape('at%3A%20aKey%20put%3A%20aValue%0A%09%5Eself%20basicAt%3A%20aKey%20put%3A%20aValue'),
+messageSends: ["basicAt:put:"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_collect_'),
+smalltalk.method({
+selector: unescape('collect%3A'),
 category: 'enumerating',
 fn: function (aBlock) {
 var self=this;
-return smalltalk.send(self, "_detect_ifNone_", [aBlock, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
+var newDict=nil;
+(newDict=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(newDict, "_at_put_", [key, smalltalk.send(aBlock, "_value_", [value])]);})]);
+return newDict;
 return self;},
 args: ["aBlock"],
-source: unescape('detect%3A%20aBlock%0A%09%5Eself%20detect%3A%20aBlock%20ifNone%3A%20%5Bself%20errorNotFound%5D'),
-messageSends: ["detect:ifNone:", "errorNotFound"],
+source: unescape('collect%3A%20aBlock%0A%09%7C%20newDict%20%7C%0A%09newDict%20%3A%3D%20self%20class%20new.%0A%09self%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%20%20%20%20newDict%20at%3A%20key%20put%3A%20%28aBlock%20value%3A%20value%29%5D.%0A%09%5EnewDict'),
+messageSends: ["new", "class", "keysAndValuesDo:", "at:put:", "value:"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_copyFrom_to_'),
+smalltalk.method({
+selector: unescape('copyFrom%3Ato%3A'),
+category: 'copying',
+fn: function (anIndex, anotherIndex) {
+var self=this;
+smalltalk.send(self, "_shouldNotImplement", []);
+return self;},
+args: ["anIndex", "anotherIndex"],
+source: unescape('copyFrom%3A%20anIndex%20to%3A%20anotherIndex%0A%09self%20shouldNotImplement'),
+messageSends: ["shouldNotImplement"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_deepCopy'),
+smalltalk.method({
+selector: unescape('deepCopy'),
+category: 'copying',
+fn: function () {
+var self=this;
+var copy=nil;
+(copy=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(copy, "_at_put_", [smalltalk.send(each, "_key", []), smalltalk.send(smalltalk.send(each, "_value", []), "_deepCopy", [])]);})]);
+return copy;
+return self;},
+args: [],
+source: unescape('deepCopy%0A%09%7C%20copy%20%7C%0A%09copy%20%3A%3D%20self%20class%20new.%0A%09self%20associationsDo%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20copy%20at%3A%20each%20key%20%20put%3A%20each%20value%20deepCopy%5D.%0A%09%5Ecopy'),
+messageSends: ["new", "class", "associationsDo:", "at:put:", "key", "deepCopy", "value"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
 unescape('_detect_ifNone_'),
@@ -828,72 +1031,166 @@ selector: unescape('detect%3AifNone%3A'),
 category: 'enumerating',
 fn: function (aBlock, anotherBlock) {
 var self=this;
-
-		for(var i = 0; i < self.length; i++)
-			if(aBlock(self[i]))
-				return self[i];
-		return anotherBlock();
-	;
+return smalltalk.send(smalltalk.send(self, "_values", []), "_detect_ifNone_", [aBlock, anotherBlock]);
 return self;},
 args: ["aBlock", "anotherBlock"],
-source: unescape('detect%3A%20aBlock%20ifNone%3A%20anotherBlock%0A%09%3C%0A%09%09for%28var%20i%20%3D%200%3B%20i%20%3C%20self.length%3B%20i++%29%0A%09%09%09if%28aBlock%28self%5Bi%5D%29%29%0A%09%09%09%09return%20self%5Bi%5D%3B%0A%09%09return%20anotherBlock%28%29%3B%0A%09%3E'),
-messageSends: [],
+source: unescape('detect%3A%20aBlock%20ifNone%3A%20anotherBlock%0A%09%5Eself%20values%20detect%3A%20aBlock%20ifNone%3A%20anotherBlock'),
+messageSends: ["detect:ifNone:", "values"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_do_separatedBy_'),
+unescape('_do_'),
 smalltalk.method({
-selector: unescape('do%3AseparatedBy%3A'),
+selector: unescape('do%3A'),
 category: 'enumerating',
-fn: function (aBlock, anotherBlock) {
+fn: function (aBlock) {
 var self=this;
-var first=nil;
-(first=true);
-smalltalk.send(self, "_do_", [(function(each){((($receiver = first).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (first=false);})() : (function(){return smalltalk.send(anotherBlock, "_value", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (first=false);}), (function(){return smalltalk.send(anotherBlock, "_value", []);})]));return smalltalk.send(aBlock, "_value_", [each]);})]);
+smalltalk.send(smalltalk.send(self, "_values", []), "_do_", [aBlock]);
 return self;},
-args: ["aBlock", "anotherBlock"],
-source: unescape('do%3A%20aBlock%20separatedBy%3A%20anotherBlock%0A%09%7C%20first%20%7C%0A%09first%20%3A%3D%20true.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20first%0A%09%09ifTrue%3A%20%5Bfirst%20%3A%3D%20false%5D%0A%09%09ifFalse%3A%20%5BanotherBlock%20value%5D.%0A%09%20%20%20%20aBlock%20value%3A%20each%5D'),
-messageSends: ["do:", "ifTrue:ifFalse:", "value", "value:"],
+args: ["aBlock"],
+source: unescape('do%3A%20aBlock%0A%09self%20values%20do%3A%20aBlock'),
+messageSends: ["do:", "values"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_inject_into_'),
+unescape('_includes_'),
 smalltalk.method({
-selector: unescape('inject%3Ainto%3A'),
+selector: unescape('includes%3A'),
 category: 'enumerating',
-fn: function (anObject, aBlock) {
+fn: function (anObject) {
 var self=this;
-var result=nil;
-(result=anObject);
-smalltalk.send(self, "_do_", [(function(each){return (result=smalltalk.send(aBlock, "_value_value_", [result, each]));})]);
-return result;
+return smalltalk.send(smalltalk.send(self, "_values", []), "_includes_", [anObject]);
 return self;},
-args: ["anObject", "aBlock"],
-source: unescape('inject%3A%20anObject%20into%3A%20aBlock%0A%09%7C%20result%20%7C%0A%09result%20%3A%3D%20anObject.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%20%20%20%20result%20%3A%3D%20aBlock%20value%3A%20result%20value%3A%20each%5D.%0A%09%5Eresult'),
-messageSends: ["do:", "value:value:"],
+args: ["anObject"],
+source: unescape('includes%3A%20anObject%0A%09%5Eself%20values%20includes%3A%20anObject'),
+messageSends: ["includes:", "values"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_reject_'),
+unescape('_includesKey_'),
 smalltalk.method({
-selector: unescape('reject%3A'),
+selector: unescape('includesKey%3A'),
+category: 'testing',
+fn: function (aKey) {
+var self=this;
+return self.hasOwnProperty(aKey);
+return self;},
+args: ["aKey"],
+source: unescape('includesKey%3A%20aKey%0A%09%3Creturn%20self.hasOwnProperty%28aKey%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_keys'),
+smalltalk.method({
+selector: unescape('keys'),
+category: 'accessing',
+fn: function () {
+var self=this;
+
+		var keys = [];
+		for(var i in self) {
+			if(self.hasOwnProperty(i)) {
+				keys.push(i);
+			}
+		};
+		return keys;
+	;
+return self;},
+args: [],
+source: unescape('keys%0A%09%3C%0A%09%09var%20keys%20%3D%20%5B%5D%3B%0A%09%09for%28var%20i%20in%20self%29%20%7B%0A%09%09%09if%28self.hasOwnProperty%28i%29%29%20%7B%0A%09%09%09%09keys.push%28i%29%3B%0A%09%09%09%7D%0A%09%09%7D%3B%0A%09%09return%20keys%3B%0A%09%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_keysAndValuesDo_'),
+smalltalk.method({
+selector: unescape('keysAndValuesDo%3A'),
 category: 'enumerating',
 fn: function (aBlock) {
 var self=this;
-return smalltalk.send(self, "_select_", [(function(each){return smalltalk.send(smalltalk.send(aBlock, "_value_", [each]), "__eq", [false]);})]);
+smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(aBlock, "_value_value_", [smalltalk.send(each, "_key", []), smalltalk.send(each, "_value", [])]);})]);
 return self;},
 args: ["aBlock"],
-source: unescape('reject%3A%20aBlock%0A%09%5Eself%20select%3A%20%5B%3Aeach%20%7C%20%28aBlock%20value%3A%20each%29%20%3D%20false%5D'),
-messageSends: ["select:", unescape("%3D"), "value:"],
+source: unescape('keysAndValuesDo%3A%20aBlock%0A%09self%20associationsDo%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20aBlock%20value%3A%20each%20key%20value%3A%20each%20value%5D'),
+messageSends: ["associationsDo:", "value:value:", "key", "value"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_printString'),
+smalltalk.method({
+selector: unescape('printString'),
+category: 'printing',
+fn: function () {
+var self=this;
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(aStream){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Collection)]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);})(aStream);smalltalk.send(smalltalk.send(self, "_associations", []), "_do_separatedBy_", [(function(anAssociation){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(anAssociation, "_key", []), "_printString", [])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%20-%3E%20")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(anAssociation, "_value", []), "_printString", [])]);})(aStream);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%20%2C%20")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [unescape("%29")]);})]);
+return self;},
+args: [],
+source: unescape('printString%0A%09%5EString%20streamContents%3A%20%5B%3AaStream%7C%20%20%0A%09%09aStream%20%0A%09%09%09nextPutAll%3A%20super%20printString%3B%0A%09%09%09nextPutAll%3A%20%27%28%27.%0A%09%09%09%09self%20associations%20%0A%09%09%09%09%09do%3A%20%5B%3AanAssociation%7C%20%20%0A%09%09%09%09%09%09aStream%20%0A%09%09%09%09%09%09%09nextPutAll%3A%20anAssociation%20key%20printString%3B%0A%09%09%09%09%09%09%09%09nextPutAll%3A%20%27%20-%3E%20%27%3B%0A%09%09%09%09%09%09%09%09nextPutAll%3A%20anAssociation%20value%20printString%5D%0A%09%09%09%09%09%09%09separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%20%2C%20%27%5D.%0A%09%09%09%09%09%09aStream%20nextPutAll%3A%20%27%29%27%5D'),
+messageSends: ["streamContents:", "nextPutAll:", "printString", "do:separatedBy:", "associations", "key", "value"],
+referencedClasses: ["String"]
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_remove_ifAbsent_'),
+smalltalk.method({
+selector: unescape('remove%3AifAbsent%3A'),
+category: 'adding/removing',
+fn: function (aKey, aBlock) {
+var self=this;
+return smalltalk.send(self, "_removeKey_ifAbsent_", [aKey, aBlock]);
+return self;},
+args: ["aKey", "aBlock"],
+source: unescape('remove%3A%20aKey%20ifAbsent%3A%20aBlock%0A%20%20%20%20%5Eself%20removeKey%3A%20aKey%20ifAbsent%3A%20aBlock'),
+messageSends: ["removeKey:ifAbsent:"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_removeKey_'),
+smalltalk.method({
+selector: unescape('removeKey%3A'),
+category: 'adding/removing',
+fn: function (aKey){
+var self=this;
+return smalltalk.send(self, "_remove_", [aKey]);
+return self;},
+args: ["aKey"],
+source: unescape('removeKey%3A%20aKey%0A%20%20%20%20%5Eself%20remove%3A%20aKey'),
+messageSends: ["remove:"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
+
+smalltalk.addMethod(
+unescape('_removeKey_ifAbsent_'),
+smalltalk.method({
+selector: unescape('removeKey%3AifAbsent%3A'),
+category: 'adding/removing',
+fn: function (aKey, aBlock) {
+var self=this;
+return ((($receiver = smalltalk.send(self, "_includesKey_", [aKey])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(aBlock, "_value", []);})() : (function(){return smalltalk.send(self, "_basicDelete_", [aKey]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(aBlock, "_value", []);}), (function(){return smalltalk.send(self, "_basicDelete_", [aKey]);})]));
+return self;},
+args: ["aKey", "aBlock"],
+source: unescape('removeKey%3A%20aKey%20ifAbsent%3A%20aBlock%0A%09%5E%28self%20includesKey%3A%20aKey%29%20%0A%09%09ifFalse%3A%20%5BaBlock%20value%5D%0A%09%09ifTrue%3A%20%5Bself%20basicDelete%3A%20aKey%5D'),
+messageSends: ["ifFalse:ifTrue:", "includesKey:", "value", "basicDelete:"],
+referencedClasses: []
+}),
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
 unescape('_select_'),
@@ -902,315 +1199,355 @@ selector: unescape('select%3A'),
 category: 'enumerating',
 fn: function (aBlock) {
 var self=this;
-var stream=nil;
-(stream=smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_new", []), "_writeStream", []));
-smalltalk.send(self, "_do_", [(function(each){return ((($receiver = smalltalk.send(aBlock, "_value_", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(stream, "_nextPut_", [each]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(stream, "_nextPut_", [each]);})]));})]);
-return smalltalk.send(stream, "_contents", []);
+var newDict=nil;
+(newDict=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return ((($receiver = smalltalk.send(aBlock, "_value_", [value])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(newDict, "_at_put_", [key, value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(newDict, "_at_put_", [key, value]);})]));})]);
+return newDict;
 return self;},
 args: ["aBlock"],
-source: unescape('select%3A%20aBlock%0A%09%7C%20stream%20%7C%0A%09stream%20%3A%3D%20self%20class%20new%20writeStream.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20%28aBlock%20value%3A%20each%29%20ifTrue%3A%20%5B%0A%09%09stream%20nextPut%3A%20each%5D%5D.%0A%09%5Estream%20contents'),
-messageSends: ["writeStream", "new", "class", "do:", "ifTrue:", "value:", "nextPut:", "contents"],
+source: unescape('select%3A%20aBlock%0A%09%7C%20newDict%20%7C%0A%09newDict%20%3A%3D%20self%20class%20new.%0A%09self%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%20%20%20%20%28aBlock%20value%3A%20value%29%20ifTrue%3A%20%5BnewDict%20at%3A%20key%20put%3A%20value%5D%5D.%0A%09%5EnewDict'),
+messageSends: ["new", "class", "keysAndValuesDo:", "ifTrue:", "value:", "at:put:"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_errorNotFound'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('errorNotFound'),
-category: 'error handling',
+selector: unescape('shallowCopy'),
+category: 'copying',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_error_", ["Object is not in the collection"]);
+var copy=nil;
+(copy=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(copy, "_at_put_", [smalltalk.send(each, "_key", []), smalltalk.send(each, "_value", [])]);})]);
+return copy;
 return self;},
 args: [],
-source: unescape('errorNotFound%0A%09self%20error%3A%20%27Object%20is%20not%20in%20the%20collection%27'),
-messageSends: ["error:"],
+source: unescape('shallowCopy%0A%09%7C%20copy%20%7C%0A%09copy%20%3A%3D%20self%20class%20new.%0A%09self%20associationsDo%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20copy%20at%3A%20each%20key%20%20put%3A%20each%20value%5D.%0A%09%5Ecopy'),
+messageSends: ["new", "class", "associationsDo:", "at:put:", "key", "value"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_includes_'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('includes%3A'),
-category: 'testing',
-fn: function (anObject) {
+selector: unescape('size'),
+category: 'accessing',
+fn: function () {
 var self=this;
-
-		var i = self.length;
-		while (i--) {
-			if (smalltalk.send(self[i], "__eq", [anObject])) {return true;}	
-		}
-		return false
-	;
+return smalltalk.send(smalltalk.send(self, "_keys", []), "_size", []);
 return self;},
-args: ["anObject"],
-source: unescape('includes%3A%20anObject%0A%09%3C%0A%09%09var%20i%20%3D%20self.length%3B%0A%09%09while%20%28i--%29%20%7B%0A%09%09%09if%20%28smalltalk.send%28self%5Bi%5D%2C%20%22__eq%22%2C%20%5BanObject%5D%29%29%20%7Breturn%20true%3B%7D%09%0A%09%09%7D%0A%09%09return%20false%0A%09%3E'),
-messageSends: [],
+args: [],
+source: unescape('size%0A%09%5Eself%20keys%20size'),
+messageSends: ["size", "keys"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_notEmpty'),
+unescape('_storeOn_'),
 smalltalk.method({
-selector: unescape('notEmpty'),
-category: 'testing',
-fn: function () {
+selector: unescape('storeOn%3A'),
+category: 'printing',
+fn: function (aStream) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_isEmpty", []), "_not", []);
+smalltalk.send(aStream, "_nextPutAll_", [unescape("%23%7B")]);
+smalltalk.send(smalltalk.send(self, "_associations", []), "_do_separatedBy_", [(function(each){return smalltalk.send(each, "_storeOn_", [aStream]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [". "]);})]);
+smalltalk.send(aStream, "_nextPutAll_", [unescape("%7D")]);
 return self;},
-args: [],
-source: unescape('notEmpty%0A%09%5Eself%20isEmpty%20not'),
-messageSends: ["not", "isEmpty"],
+args: ["aStream"],
+source: unescape('storeOn%3A%20aStream%0A%09aStream%20nextPutAll%3A%20%27%23%7B%27.%0A%09self%20associations%0A%09%09do%3A%20%5B%3Aeach%20%7C%20each%20storeOn%3A%20aStream%5D%0A%09%09separatedBy%3A%20%5B%20aStream%20nextPutAll%3A%20%27.%20%27%5D.%0A%09aStream%20nextPutAll%3A%20%27%7D%27'),
+messageSends: ["nextPutAll:", "do:separatedBy:", "associations", "storeOn:"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-unescape('_isEmpty'),
+unescape('_values'),
 smalltalk.method({
-selector: unescape('isEmpty'),
-category: 'testing',
+selector: unescape('values'),
+category: 'accessing',
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [(0)]);
+return smalltalk.send(smalltalk.send(self, "_keys", []), "_collect_", [(function(each){return smalltalk.send(self, "_at_", [each]);})]);
 return self;},
 args: [],
-source: unescape('isEmpty%0A%09%5Eself%20size%20%3D%200'),
-messageSends: [unescape("%3D"), "size"],
+source: unescape('values%0A%09%5Eself%20keys%20collect%3A%20%5B%3Aeach%20%7C%20self%20at%3A%20each%5D'),
+messageSends: ["collect:", "keys", "at:"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection);
+
 
 smalltalk.addMethod(
-unescape('_remove_'),
+unescape('_fromPairs_'),
 smalltalk.method({
-selector: unescape('remove%3A'),
-category: 'adding/removing',
-fn: function (anObject) {
+selector: unescape('fromPairs%3A'),
+category: 'instance creation',
+fn: function (aCollection) {
 var self=this;
-return smalltalk.send(self, "_remove_ifAbsent_", [anObject, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
+var dict=nil;
+(dict=smalltalk.send(self, "_new", []));
+smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(dict, "_add_", [each]);})]);
+return dict;
 return self;},
-args: ["anObject"],
-source: unescape('remove%3A%20anObject%0A%20%20%20%20%5Eself%20remove%3A%20anObject%20ifAbsent%3A%20%5Bself%20errorNotFound%5D'),
-messageSends: ["remove:ifAbsent:", "errorNotFound"],
+args: ["aCollection"],
+source: unescape('fromPairs%3A%20aCollection%0A%09%7C%20dict%20%7C%0A%09dict%20%3A%3D%20self%20new.%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%20dict%20add%3A%20each%5D.%0A%09%5Edict'),
+messageSends: ["new", "do:", "add:"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.HashedCollection.klass);
 
+
+smalltalk.addClass('Dictionary', smalltalk.HashedCollection, ['keys', 'values'], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_asSet'),
+unescape('_asHashedCollection'),
 smalltalk.method({
-selector: unescape('asSet'),
+selector: unescape('asHashedCollection'),
 category: 'converting',
 fn: function () {
 var self=this;
-return smalltalk.send((smalltalk.Set || Set), "_withAll_", [self]);
+return smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_fromPairs_", [smalltalk.send(self, "_associations", [])]);
 return self;},
 args: [],
-source: unescape('asSet%0A%09%5ESet%20withAll%3A%20self'),
-messageSends: ["withAll:"],
-referencedClasses: ["Set"]
+source: unescape('asHashedCollection%0A%09%5EHashedCollection%20fromPairs%3A%20self%20associations'),
+messageSends: ["fromPairs:", "associations"],
+referencedClasses: ["HashedCollection"]
 }),
-smalltalk.Collection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_ifNotEmpty_'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('ifNotEmpty%3A'),
-category: 'testing',
-fn: function (aBlock) {
+selector: unescape('asJSON'),
+category: 'converting',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_notEmpty", []), "_ifTrue_", [aBlock]);
+return smalltalk.send(smalltalk.send(self, "_asHashedCollection", []), "_asJSON", []);
 return self;},
-args: ["aBlock"],
-source: unescape('ifNotEmpty%3A%20aBlock%0A%09self%20notEmpty%20ifTrue%3A%20aBlock.'),
-messageSends: ["ifTrue:", "notEmpty"],
+args: [],
+source: unescape('asJSON%0A%09%5Eself%20asHashedCollection%20asJSON'),
+messageSends: ["asJSON", "asHashedCollection"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_ifEmpty_'),
+unescape('_at_ifAbsent_'),
 smalltalk.method({
-selector: unescape('ifEmpty%3A'),
-category: 'testing',
-fn: function (aBlock){
+selector: unescape('at%3AifAbsent%3A'),
+category: 'accessing',
+fn: function (aKey, aBlock) {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(aBlock, "_value", []);})() : (function(){return self;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(aBlock, "_value", []);}), (function(){return self;})]));
+
+		var index;
+		for(var i=0;i<self['@keys'].length;i++){
+			if(self['@keys'][i].__eq(aKey)) {index = i;}
+		};
+		if(typeof index === 'undefined') {
+			return aBlock();
+		} else {
+			return self['@values'][index];
+		}
+	;
 return self;},
-args: ["aBlock"],
-source: unescape('ifEmpty%3A%20aBlock%0A%09%22Evaluate%20the%20given%20block%20with%20the%20receiver%20as%20argument%2C%20answering%20its%20value%20if%20the%20receiver%20is%20empty%2C%20otherwise%20answer%20the%20receiver.%20Note%20that%20the%20fact%20that%20this%20method%20returns%20its%20argument%20in%20case%20the%20receiver%20is%20not%20empty%20allows%20one%20to%20write%20expressions%20like%20the%20following%20ones%3A%20self%20classifyMethodAs%3A%20%0A%09%09%28myProtocol%20ifEmpty%3A%20%5B%27As%20yet%20unclassified%27%5D%29%22%0A%09%5E%20self%20isEmpty%20%0A%09%09ifTrue%3A%20%5B%20aBlock%20value%20%5D%0A%09%09ifFalse%3A%20%5B%20self%20%5D'),
-messageSends: ["ifTrue:ifFalse:", "isEmpty", "value"],
+args: ["aKey", "aBlock"],
+source: unescape('at%3A%20aKey%20ifAbsent%3A%20aBlock%0A%09%3C%0A%09%09var%20index%3B%0A%09%09for%28var%20i%3D0%3Bi%3Cself%5B%27@keys%27%5D.length%3Bi++%29%7B%0A%09%09%09if%28self%5B%27@keys%27%5D%5Bi%5D.__eq%28aKey%29%29%20%7Bindex%20%3D%20i%3B%7D%0A%09%09%7D%3B%0A%09%09if%28typeof%20index%20%3D%3D%3D%20%27undefined%27%29%20%7B%0A%09%09%09return%20aBlock%28%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09return%20self%5B%27@values%27%5D%5Bindex%5D%3B%0A%09%09%7D%0A%09%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_copyWithoutAll_'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('copyWithoutAll%3A'),
-category: 'copying',
-fn: function (aCollection) {
+selector: unescape('at%3Aput%3A'),
+category: 'accessing',
+fn: function (aKey, aValue) {
 var self=this;
-return smalltalk.send(self, "_reject_", [(function(each){return smalltalk.send(aCollection, "_includes_", [each]);})]);
+
+		var index = self['@keys'].indexOf(aKey);
+		if(index === -1) {
+			self['@values'].push(aValue);
+			self['@keys'].push(aKey);
+		} else {
+			self['@values'][index] = aValue;
+		};
+
+		return aValue;
+	;
 return self;},
-args: ["aCollection"],
-source: unescape('copyWithoutAll%3A%20aCollection%0A%09%22Answer%20a%20copy%20of%20the%20receiver%20that%20does%20not%20contain%20any%20elements%20%0A%09equal%20to%20those%20in%20aCollection.%22%0A%0A%09%5E%20self%20reject%3A%20%5B%3Aeach%20%7C%20aCollection%20includes%3A%20each%5D'),
-messageSends: ["reject:", "includes:"],
+args: ["aKey", "aValue"],
+source: unescape('at%3A%20aKey%20put%3A%20aValue%0A%09%3C%0A%09%09var%20index%20%3D%20self%5B%27@keys%27%5D.indexOf%28aKey%29%3B%0A%09%09if%28index%20%3D%3D%3D%20-1%29%20%7B%0A%09%09%09self%5B%27@values%27%5D.push%28aValue%29%3B%0A%09%09%09self%5B%27@keys%27%5D.push%28aKey%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09self%5B%27@values%27%5D%5Bindex%5D%20%3D%20aValue%3B%0A%09%09%7D%3B%0A%0A%09%09return%20aValue%3B%0A%09%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_remove_ifAbsent_'),
+unescape('_includesKey_'),
 smalltalk.method({
-selector: unescape('remove%3AifAbsent%3A'),
-category: 'adding/removing',
-fn: function (anObject, aBlock) {
+selector: unescape('includesKey%3A'),
+category: 'testing',
+fn: function (aKey) {
 var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
+return smalltalk.send(self['@keys'], "_includes_", [aKey]);
 return self;},
-args: ["anObject", "aBlock"],
-source: unescape('remove%3A%20anObject%20ifAbsent%3A%20aBlock%0A%20%20%20%20self%20subclassResponsibility'),
-messageSends: ["subclassResponsibility"],
+args: ["aKey"],
+source: unescape('includesKey%3A%20aKey%0A%09%5Ekeys%20includes%3A%20aKey'),
+messageSends: ["includes:"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_asOrderedCollection'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('asOrderedCollection'),
-category: 'converting',
+selector: unescape('initialize'),
+category: 'initialization',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_asArray", []);
+smalltalk.send(self, "_initialize", [], smalltalk.HashedCollection);
+(self['@keys']=[]);
+(self['@values']=[]);
 return self;},
 args: [],
-source: unescape('asOrderedCollection%0A%09%5Eself%20asArray'),
-messageSends: ["asArray"],
+source: unescape('initialize%0A%09super%20initialize.%0A%09keys%20%3A%3D%20%23%28%29.%0A%09values%20%3A%3D%20%23%28%29'),
+messageSends: ["initialize"],
 referencedClasses: []
 }),
-smalltalk.Collection);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_keys'),
 smalltalk.method({
-selector: unescape('asJSON'),
-category: 'converting',
-fn: function (){
+selector: unescape('keys'),
+category: 'accessing',
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asArray", []), "_collect_", [(function(each){return smalltalk.send(each, "_asJSON", []);})]);
+return smalltalk.send(self['@keys'], "_copy", []);
 return self;},
 args: [],
-source: unescape('asJSON%0A%09%5Eself%20asArray%20collect%3A%20%5B%3Aeach%20%7C%20each%20asJSON%5D'),
-messageSends: ["collect:", "asArray", "asJSON"],
+source: unescape('keys%0A%09%5Ekeys%20copy'),
+messageSends: ["copy"],
 referencedClasses: []
 }),
-smalltalk.Collection);
-
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_streamClass'),
+unescape('_removeKey_ifAbsent_'),
 smalltalk.method({
-selector: unescape('streamClass'),
-category: 'accessing',
-fn: function () {
+selector: unescape('removeKey%3AifAbsent%3A'),
+category: 'adding/removing',
+fn: function (aKey, aBlock){
 var self=this;
-return (smalltalk.Stream || Stream);
+
+            var index = self['@keys'].indexOf(aKey);
+            if(index === -1) {
+                return aBlock()
+            } else {
+                var value;
+                self['@keys'].splice(index, 1);
+                value = self['@values'].splice(index, 1);
+                return value[0];
+            };
+    ;
 return self;},
-args: [],
-source: unescape('streamClass%0A%09%20%20%20%20%5EStream'),
+args: ["aKey", "aBlock"],
+source: unescape('removeKey%3A%20aKey%20ifAbsent%3A%20aBlock%0A%20%20%20%20%3C%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20index%20%3D%20self%5B%27@keys%27%5D.indexOf%28aKey%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%28index%20%3D%3D%3D%20-1%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20aBlock%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%5B%27@keys%27%5D.splice%28index%2C%201%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%20%3D%20self%5B%27@values%27%5D.splice%28index%2C%201%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20value%5B0%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%3E'),
 messageSends: [],
-referencedClasses: ["Stream"]
+referencedClasses: []
 }),
-smalltalk.Collection.klass);
+smalltalk.Dictionary);
 
 smalltalk.addMethod(
-unescape('_with_'),
+unescape('_values'),
 smalltalk.method({
-selector: unescape('with%3A'),
-category: 'instance creation',
-fn: function (anObject) {
+selector: unescape('values'),
+category: 'accessing',
+fn: function () {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_add_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return smalltalk.send(self['@values'], "_copy", []);
 return self;},
-args: ["anObject"],
-source: unescape('with%3A%20anObject%0A%09%20%20%20%20%5Eself%20new%0A%09%09add%3A%20anObject%3B%0A%09%09yourself'),
-messageSends: ["add:", "yourself", "new"],
+args: [],
+source: unescape('values%0A%09%5Evalues%20copy'),
+messageSends: ["copy"],
 referencedClasses: []
 }),
-smalltalk.Collection.klass);
+smalltalk.Dictionary);
+
 
+
+smalltalk.addClass('SequenceableCollection', smalltalk.Collection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_with_with_'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('with%3Awith%3A'),
-category: 'instance creation',
-fn: function (anObject, anotherObject) {
+selector: unescape('%3D'),
+category: 'comparing',
+fn: function (aCollection) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_add_", [anObject]);smalltalk.send($rec, "_add_", [anotherObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
-return self;},
-args: ["anObject", "anotherObject"],
-source: unescape('with%3A%20anObject%20with%3A%20anotherObject%0A%09%20%20%20%20%5Eself%20new%0A%09%09add%3A%20anObject%3B%0A%09%09add%3A%20anotherObject%3B%0A%09%09yourself'),
-messageSends: ["add:", "yourself", "new"],
+try{((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aCollection, "_class", [])]), "_and_", [(function(){return smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [smalltalk.send(aCollection, "_size", [])]);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
+smalltalk.send(self, "_withIndexDo_", [(function(each, i){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_at_", [i]), "__eq", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));})]);
+(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return true}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}},
+args: ["aCollection"],
+source: unescape('%3D%20aCollection%0A%09%28self%20class%20%3D%20aCollection%20class%20and%3A%20%5B%0A%09%09self%20size%20%3D%20aCollection%20size%5D%29%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09self%20withIndexDo%3A%20%5B%3Aeach%20%3Ai%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28aCollection%20at%3A%20i%29%20%3D%20each%20ifFalse%3A%20%5B%5Efalse%5D%5D.%0A%09%5Etrue'),
+messageSends: ["ifFalse:", "and:", unescape("%3D"), "class", "size", "withIndexDo:", "at:"],
 referencedClasses: []
 }),
-smalltalk.Collection.klass);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_with_with_with_'),
+unescape('_addLast_'),
 smalltalk.method({
-selector: unescape('with%3Awith%3Awith%3A'),
-category: 'instance creation',
-fn: function (firstObject, secondObject, thirdObject) {
+selector: unescape('addLast%3A'),
+category: 'adding',
+fn: function (anObject) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_add_", [firstObject]);smalltalk.send($rec, "_add_", [secondObject]);smalltalk.send($rec, "_add_", [thirdObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+smalltalk.send(self, "_add_", [anObject]);
 return self;},
-args: ["firstObject", "secondObject", "thirdObject"],
-source: unescape('with%3A%20firstObject%20with%3A%20secondObject%20with%3A%20thirdObject%0A%09%20%20%20%20%5Eself%20new%0A%09%09add%3A%20firstObject%3B%0A%09%09add%3A%20secondObject%3B%0A%09%09add%3A%20thirdObject%3B%0A%09%09yourself'),
-messageSends: ["add:", "yourself", "new"],
+args: ["anObject"],
+source: unescape('addLast%3A%20anObject%0A%09self%20add%3A%20anObject'),
+messageSends: ["add:"],
 referencedClasses: []
 }),
-smalltalk.Collection.klass);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_withAll_'),
+unescape('_allButFirst'),
 smalltalk.method({
-selector: unescape('withAll%3A'),
-category: 'instance creation',
-fn: function (aCollection) {
+selector: unescape('allButFirst'),
+category: 'accessing',
+fn: function () {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_addAll_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return smalltalk.send(self, "_copyFrom_to_", [(2), smalltalk.send(self, "_size", [])]);
 return self;},
-args: ["aCollection"],
-source: unescape('withAll%3A%20aCollection%0A%09%20%20%20%20%5Eself%20new%0A%09%09addAll%3A%20aCollection%3B%0A%09%09yourself'),
-messageSends: ["addAll:", "yourself", "new"],
+args: [],
+source: unescape('allButFirst%0A%09%5Eself%20copyFrom%3A%202%20to%3A%20self%20size'),
+messageSends: ["copyFrom:to:", "size"],
 referencedClasses: []
 }),
-smalltalk.Collection.klass);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_new_'),
+unescape('_allButLast'),
 smalltalk.method({
-selector: unescape('new%3A'),
-category: 'instance creation',
-fn: function (anInteger) {
+selector: unescape('allButLast'),
+category: 'accessing',
+fn: function () {
 var self=this;
-return smalltalk.send(self, "_new", []);
+return smalltalk.send(self, "_copyFrom_to_", [(1), ((($receiver = smalltalk.send(self, "_size", [])).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)]))]);
 return self;},
-args: ["anInteger"],
-source: unescape('new%3A%20anInteger%0A%09%5Eself%20new'),
-messageSends: ["new"],
+args: [],
+source: unescape('allButLast%0A%09%5Eself%20copyFrom%3A%201%20to%3A%20self%20size%20-%201'),
+messageSends: ["copyFrom:to:", unescape("-"), "size"],
 referencedClasses: []
 }),
-smalltalk.Collection.klass);
-
+smalltalk.SequenceableCollection);
 
-smalltalk.addClass('SequenceableCollection', smalltalk.Collection, [], 'Kernel-Collections');
 smalltalk.addMethod(
 unescape('_at_'),
 smalltalk.method({
@@ -1259,6 +1596,22 @@ referencedClasses: []
 }),
 smalltalk.SequenceableCollection);
 
+smalltalk.addMethod(
+unescape('_atRandom'),
+smalltalk.method({
+selector: unescape('atRandom'),
+category: 'accessing',
+fn: function () {
+var self=this;
+return smalltalk.send(self, "_at_", [smalltalk.send(smalltalk.send(self, "_size", []), "_atRandom", [])]);
+return self;},
+args: [],
+source: unescape('atRandom%0A%09%5E%20self%20at%3A%20self%20size%20atRandom'),
+messageSends: ["at:", "atRandom", "size"],
+referencedClasses: []
+}),
+smalltalk.SequenceableCollection);
+
 smalltalk.addMethod(
 unescape('_copyFrom_to_'),
 smalltalk.method({
@@ -1281,165 +1634,72 @@ referencedClasses: []
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_first'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('first'),
-category: 'accessing',
+selector: unescape('deepCopy'),
+category: 'copying',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_at_", [(1)]);
+var newCollection=nil;
+(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new_", [smalltalk.send(self, "_size", [])]));
+smalltalk.send(self, "_withIndexDo_", [(function(each, index){return smalltalk.send(newCollection, "_at_put_", [index, smalltalk.send(each, "_deepCopy", [])]);})]);
+return newCollection;
 return self;},
 args: [],
-source: unescape('first%0A%09%5Eself%20at%3A%201'),
-messageSends: ["at:"],
+source: unescape('deepCopy%0A%09%7C%20newCollection%20%7C%0A%09newCollection%20%3A%3D%20self%20class%20new%3A%20self%20size.%0A%09self%20withIndexDo%3A%20%5B%3Aeach%20%3Aindex%20%7C%20%0A%09%09newCollection%20at%3A%20index%20put%3A%20each%20deepCopy%5D.%0A%09%5EnewCollection'),
+messageSends: ["new:", "class", "size", "withIndexDo:", "at:put:", "deepCopy"],
 referencedClasses: []
 }),
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_fourth'),
+unescape('_first'),
 smalltalk.method({
-selector: unescape('fourth'),
+selector: unescape('first'),
 category: 'accessing',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_at_", [(4)]);
+return smalltalk.send(self, "_at_", [(1)]);
 return self;},
 args: [],
-source: unescape('fourth%0A%09%5Eself%20at%3A%204'),
+source: unescape('first%0A%09%5Eself%20at%3A%201'),
 messageSends: ["at:"],
 referencedClasses: []
 }),
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_last'),
-smalltalk.method({
-selector: unescape('last'),
-category: 'accessing',
-fn: function () {
-var self=this;
-return smalltalk.send(self, "_at_", [smalltalk.send(self, "_size", [])]);
-return self;},
-args: [],
-source: unescape('last%0A%09%5Eself%20at%3A%20self%20size'),
-messageSends: ["at:", "size"],
-referencedClasses: []
-}),
-smalltalk.SequenceableCollection);
-
-smalltalk.addMethod(
-unescape('_second'),
+unescape('_first_'),
 smalltalk.method({
-selector: unescape('second'),
+selector: unescape('first%3A'),
 category: 'accessing',
-fn: function () {
+fn: function (n){
 var self=this;
-return smalltalk.send(self, "_at_", [(2)]);
+return smalltalk.send(self, "_copyFrom_to_", [(1), n]);
 return self;},
-args: [],
-source: unescape('second%0A%09%5Eself%20at%3A%202'),
-messageSends: ["at:"],
+args: ["n"],
+source: unescape('first%3A%20n%0A%09%22Answer%20the%20first%20n%20elements%20of%20the%20receiver.%0A%09Raise%20an%20error%20if%20there%20are%20not%20enough%20elements.%22%0A%0A%09%5E%20self%20copyFrom%3A%201%20to%3A%20n'),
+messageSends: ["copyFrom:to:"],
 referencedClasses: []
 }),
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_third'),
+unescape('_fourth'),
 smalltalk.method({
-selector: unescape('third'),
+selector: unescape('fourth'),
 category: 'accessing',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_at_", [(3)]);
+return smalltalk.send(self, "_at_", [(4)]);
 return self;},
 args: [],
-source: unescape('third%0A%09%5Eself%20at%3A%203'),
+source: unescape('fourth%0A%09%5Eself%20at%3A%204'),
 messageSends: ["at:"],
 referencedClasses: []
 }),
 smalltalk.SequenceableCollection);
 
-smalltalk.addMethod(
-unescape('_removeLast'),
-smalltalk.method({
-selector: unescape('removeLast'),
-category: 'adding',
-fn: function () {
-var self=this;
-smalltalk.send(self, "_remove_", [smalltalk.send(self, "_last", [])]);
-return self;},
-args: [],
-source: unescape('removeLast%0A%09self%20remove%3A%20self%20last'),
-messageSends: ["remove:", "last"],
-referencedClasses: []
-}),
-smalltalk.SequenceableCollection);
-
-smalltalk.addMethod(
-unescape('_addLast_'),
-smalltalk.method({
-selector: unescape('addLast%3A'),
-category: 'adding',
-fn: function (anObject) {
-var self=this;
-smalltalk.send(self, "_add_", [anObject]);
-return self;},
-args: ["anObject"],
-source: unescape('addLast%3A%20anObject%0A%09self%20add%3A%20anObject'),
-messageSends: ["add:"],
-referencedClasses: []
-}),
-smalltalk.SequenceableCollection);
-
-smalltalk.addMethod(
-unescape('_withIndexDo_'),
-smalltalk.method({
-selector: unescape('withIndexDo%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
-var self=this;
-for(var i=0;i<self.length;i++){aBlock(self[i], i+1);};
-return self;},
-args: ["aBlock"],
-source: unescape('withIndexDo%3A%20aBlock%0A%09%3Cfor%28var%20i%3D0%3Bi%3Cself.length%3Bi++%29%7BaBlock%28self%5Bi%5D%2C%20i+1%29%3B%7D%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.SequenceableCollection);
-
-smalltalk.addMethod(
-unescape('_allButFirst'),
-smalltalk.method({
-selector: unescape('allButFirst'),
-category: 'accessing',
-fn: function () {
-var self=this;
-return smalltalk.send(self, "_copyFrom_to_", [(2), smalltalk.send(self, "_size", [])]);
-return self;},
-args: [],
-source: unescape('allButFirst%0A%09%5Eself%20copyFrom%3A%202%20to%3A%20self%20size'),
-messageSends: ["copyFrom:to:", "size"],
-referencedClasses: []
-}),
-smalltalk.SequenceableCollection);
-
-smalltalk.addMethod(
-unescape('_allButLast'),
-smalltalk.method({
-selector: unescape('allButLast'),
-category: 'accessing',
-fn: function () {
-var self=this;
-return smalltalk.send(self, "_copyFrom_to_", [(1), ((($receiver = smalltalk.send(self, "_size", [])).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)]))]);
-return self;},
-args: [],
-source: unescape('allButLast%0A%09%5Eself%20copyFrom%3A%201%20to%3A%20self%20size%20-%201'),
-messageSends: ["copyFrom:to:", unescape("-"), "size"],
-referencedClasses: []
-}),
-smalltalk.SequenceableCollection);
-
 smalltalk.addMethod(
 unescape('_indexOf_'),
 smalltalk.method({
@@ -1477,27 +1737,6 @@ referencedClasses: []
 }),
 smalltalk.SequenceableCollection);
 
-smalltalk.addMethod(
-unescape('_indexOf_startingAt_ifAbsent_'),
-smalltalk.method({
-selector: unescape('indexOf%3AstartingAt%3AifAbsent%3A'),
-category: 'accessing',
-fn: function (anObject, start, aBlock) {
-var self=this;
-
-		for(var i=start-1;i<self.length;i++){
-			if(self[i].__eq(anObject)) {return i+1}
-		}
-		return aBlock();
-	;
-return self;},
-args: ["anObject", "start", "aBlock"],
-source: unescape('indexOf%3A%20anObject%20startingAt%3A%20start%20ifAbsent%3A%20aBlock%0A%09%3C%0A%09%09for%28var%20i%3Dstart-1%3Bi%3Cself.length%3Bi++%29%7B%0A%09%09%09if%28self%5Bi%5D.__eq%28anObject%29%29%20%7Breturn%20i+1%7D%0A%09%09%7D%0A%09%09return%20aBlock%28%29%3B%0A%09%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.SequenceableCollection);
-
 smalltalk.addMethod(
 unescape('_indexOf_startingAt_'),
 smalltalk.method({
@@ -1515,90 +1754,38 @@ referencedClasses: []
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_reversed'),
-smalltalk.method({
-selector: unescape('reversed'),
-category: 'converting',
-fn: function () {
-var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
-return self;},
-args: [],
-source: unescape('reversed%0A%09self%20subclassResponsibility'),
-messageSends: ["subclassResponsibility"],
-referencedClasses: []
-}),
-smalltalk.SequenceableCollection);
-
-smalltalk.addMethod(
-unescape('_atRandom'),
+unescape('_indexOf_startingAt_ifAbsent_'),
 smalltalk.method({
-selector: unescape('atRandom'),
+selector: unescape('indexOf%3AstartingAt%3AifAbsent%3A'),
 category: 'accessing',
-fn: function () {
-var self=this;
-return smalltalk.send(self, "_at_", [smalltalk.send(smalltalk.send(self, "_size", []), "_atRandom", [])]);
-return self;},
-args: [],
-source: unescape('atRandom%0A%09%5E%20self%20at%3A%20self%20size%20atRandom'),
-messageSends: ["at:", "atRandom", "size"],
-referencedClasses: []
-}),
-smalltalk.SequenceableCollection);
-
-smalltalk.addMethod(
-unescape('__eq'),
-smalltalk.method({
-selector: unescape('%3D'),
-category: 'comparing',
-fn: function (aCollection) {
+fn: function (anObject, start, aBlock) {
 var self=this;
-try{((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aCollection, "_class", [])]), "_and_", [(function(){return smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [smalltalk.send(aCollection, "_size", [])]);})])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
-smalltalk.send(self, "_withIndexDo_", [(function(each, i){return ((($receiver = smalltalk.send(smalltalk.send(aCollection, "_at_", [i]), "__eq", [each])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));})]);
-(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return true}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}},
-args: ["aCollection"],
-source: unescape('%3D%20aCollection%0A%09%28self%20class%20%3D%20aCollection%20class%20and%3A%20%5B%0A%09%09self%20size%20%3D%20aCollection%20size%5D%29%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09self%20withIndexDo%3A%20%5B%3Aeach%20%3Ai%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28aCollection%20at%3A%20i%29%20%3D%20each%20ifFalse%3A%20%5B%5Efalse%5D%5D.%0A%09%5Etrue'),
-messageSends: ["ifFalse:", "and:", unescape("%3D"), "class", "size", "withIndexDo:", "at:"],
-referencedClasses: []
-}),
-smalltalk.SequenceableCollection);
 
-smalltalk.addMethod(
-unescape('_shallowCopy'),
-smalltalk.method({
-selector: unescape('shallowCopy'),
-category: 'copying',
-fn: function () {
-var self=this;
-var newCollection=nil;
-(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new_", [smalltalk.send(self, "_size", [])]));
-smalltalk.send(self, "_withIndexDo_", [(function(each, index){return smalltalk.send(newCollection, "_at_put_", [index, each]);})]);
-return newCollection;
+		for(var i=start-1;i<self.length;i++){
+			if(self[i].__eq(anObject)) {return i+1}
+		}
+		return aBlock();
+	;
 return self;},
-args: [],
-source: unescape('shallowCopy%0A%09%7C%20newCollection%20%7C%0A%09newCollection%20%3A%3D%20self%20class%20new%3A%20self%20size.%0A%09self%20withIndexDo%3A%20%5B%20%3Aeach%20%3Aindex%20%7C%20%0A%09%09newCollection%20at%3A%20index%20put%3A%20each%5D.%0A%09%5EnewCollection'),
-messageSends: ["new:", "class", "size", "withIndexDo:", "at:put:"],
+args: ["anObject", "start", "aBlock"],
+source: unescape('indexOf%3A%20anObject%20startingAt%3A%20start%20ifAbsent%3A%20aBlock%0A%09%3C%0A%09%09for%28var%20i%3Dstart-1%3Bi%3Cself.length%3Bi++%29%7B%0A%09%09%09if%28self%5Bi%5D.__eq%28anObject%29%29%20%7Breturn%20i+1%7D%0A%09%09%7D%0A%09%09return%20aBlock%28%29%3B%0A%09%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_last'),
 smalltalk.method({
-selector: unescape('deepCopy'),
-category: 'copying',
+selector: unescape('last'),
+category: 'accessing',
 fn: function () {
 var self=this;
-var newCollection=nil;
-(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new_", [smalltalk.send(self, "_size", [])]));
-smalltalk.send(self, "_withIndexDo_", [(function(each, index){return smalltalk.send(newCollection, "_at_put_", [index, smalltalk.send(each, "_deepCopy", [])]);})]);
-return newCollection;
+return smalltalk.send(self, "_at_", [smalltalk.send(self, "_size", [])]);
 return self;},
 args: [],
-source: unescape('deepCopy%0A%09%7C%20newCollection%20%7C%0A%09newCollection%20%3A%3D%20self%20class%20new%3A%20self%20size.%0A%09self%20withIndexDo%3A%20%5B%3Aeach%20%3Aindex%20%7C%20%0A%09%09newCollection%20at%3A%20index%20put%3A%20each%20deepCopy%5D.%0A%09%5EnewCollection'),
-messageSends: ["new:", "class", "size", "withIndexDo:", "at:put:", "deepCopy"],
+source: unescape('last%0A%09%5Eself%20at%3A%20self%20size'),
+messageSends: ["at:", "size"],
 referencedClasses: []
 }),
 smalltalk.SequenceableCollection);
@@ -1625,962 +1812,907 @@ referencedClasses: []
 smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_first_'),
-smalltalk.method({
-selector: unescape('first%3A'),
-category: 'accessing',
-fn: function (n){
-var self=this;
-return smalltalk.send(self, "_copyFrom_to_", [(1), n]);
-return self;},
-args: ["n"],
-source: unescape('first%3A%20n%0A%09%22Answer%20the%20first%20n%20elements%20of%20the%20receiver.%0A%09Raise%20an%20error%20if%20there%20are%20not%20enough%20elements.%22%0A%0A%09%5E%20self%20copyFrom%3A%201%20to%3A%20n'),
-messageSends: ["copyFrom:to:"],
-referencedClasses: []
-}),
-smalltalk.SequenceableCollection);
-
-
-
-smalltalk.addClass('CharacterArray', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
-smalltalk.addMethod(
-unescape('_at_put_'),
-smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-category: 'accessing',
-fn: function (anIndex, anObject) {
-var self=this;
-smalltalk.send(self, "_errorReadOnly", []);
-return self;},
-args: ["anIndex", "anObject"],
-source: unescape('at%3A%20anIndex%20put%3A%20anObject%0A%09self%20errorReadOnly'),
-messageSends: ["errorReadOnly"],
-referencedClasses: []
-}),
-smalltalk.CharacterArray);
-
-smalltalk.addMethod(
-unescape('_add_'),
+unescape('_removeLast'),
 smalltalk.method({
-selector: unescape('add%3A'),
+selector: unescape('removeLast'),
 category: 'adding',
-fn: function (anObject) {
-var self=this;
-smalltalk.send(self, "_errorReadOnly", []);
-return self;},
-args: ["anObject"],
-source: unescape('add%3A%20anObject%0A%09self%20errorReadOnly'),
-messageSends: ["errorReadOnly"],
-referencedClasses: []
-}),
-smalltalk.CharacterArray);
-
-smalltalk.addMethod(
-unescape('__comma'),
-smalltalk.method({
-selector: unescape('%2C'),
-category: 'copying',
-fn: function (aString) {
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "__comma", [smalltalk.send(aString, "_asString", [])]);
+smalltalk.send(self, "_remove_", [smalltalk.send(self, "_last", [])]);
 return self;},
-args: ["aString"],
-source: unescape('%2C%20aString%0A%09%5Eself%20asString%2C%20aString%20asString'),
-messageSends: [unescape("%2C"), "asString"],
+args: [],
+source: unescape('removeLast%0A%09self%20remove%3A%20self%20last'),
+messageSends: ["remove:", "last"],
 referencedClasses: []
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_reversed'),
 smalltalk.method({
-selector: unescape('asString'),
+selector: unescape('reversed'),
 category: 'converting',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_subclassResponsibility", []);
+smalltalk.send(self, "_subclassResponsibility", []);
 return self;},
 args: [],
-source: unescape('asString%0A%09%5Eself%20subclassResponsibility'),
+source: unescape('reversed%0A%09self%20subclassResponsibility'),
 messageSends: ["subclassResponsibility"],
 referencedClasses: []
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_asNumber'),
+unescape('_second'),
 smalltalk.method({
-selector: unescape('asNumber'),
-category: 'converting',
+selector: unescape('second'),
+category: 'accessing',
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_asNumber", []);
+return smalltalk.send(self, "_at_", [(2)]);
 return self;},
 args: [],
-source: unescape('asNumber%0A%09%5Eself%20asString%20asNumber'),
-messageSends: ["asNumber", "asString"],
+source: unescape('second%0A%09%5Eself%20at%3A%202'),
+messageSends: ["at:"],
 referencedClasses: []
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_errorReadOnly'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('errorReadOnly'),
-category: 'error handling',
+selector: unescape('shallowCopy'),
+category: 'copying',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_error_", [unescape("Object%20is%20read-only")]);
+var newCollection=nil;
+(newCollection=smalltalk.send(smalltalk.send(self, "_class", []), "_new_", [smalltalk.send(self, "_size", [])]));
+smalltalk.send(self, "_withIndexDo_", [(function(each, index){return smalltalk.send(newCollection, "_at_put_", [index, each]);})]);
+return newCollection;
 return self;},
 args: [],
-source: unescape('errorReadOnly%0A%09self%20error%3A%20%27Object%20is%20read-only%27'),
-messageSends: ["error:"],
+source: unescape('shallowCopy%0A%09%7C%20newCollection%20%7C%0A%09newCollection%20%3A%3D%20self%20class%20new%3A%20self%20size.%0A%09self%20withIndexDo%3A%20%5B%20%3Aeach%20%3Aindex%20%7C%20%0A%09%09newCollection%20at%3A%20index%20put%3A%20each%5D.%0A%09%5EnewCollection'),
+messageSends: ["new:", "class", "size", "withIndexDo:", "at:put:"],
 referencedClasses: []
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_third'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
+selector: unescape('third'),
+category: 'accessing',
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_printString", []);
+return smalltalk.send(self, "_at_", [(3)]);
 return self;},
 args: [],
-source: unescape('printString%0A%09%5Eself%20asString%20printString'),
-messageSends: ["printString", "asString"],
+source: unescape('third%0A%09%5Eself%20at%3A%203'),
+messageSends: ["at:"],
 referencedClasses: []
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
 
 smalltalk.addMethod(
-unescape('_remove_'),
+unescape('_withIndexDo_'),
 smalltalk.method({
-selector: unescape('remove%3A'),
-category: 'adding',
-fn: function (anObject) {
+selector: unescape('withIndexDo%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
 var self=this;
-smalltalk.send(self, "_errorReadOnly", []);
+for(var i=0;i<self.length;i++){aBlock(self[i], i+1);};
 return self;},
-args: ["anObject"],
-source: unescape('remove%3A%20anObject%0A%09self%20errorReadOnly'),
-messageSends: ["errorReadOnly"],
+args: ["aBlock"],
+source: unescape('withIndexDo%3A%20aBlock%0A%09%3Cfor%28var%20i%3D0%3Bi%3Cself.length%3Bi++%29%7BaBlock%28self%5Bi%5D%2C%20i+1%29%3B%7D%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CharacterArray);
+smalltalk.SequenceableCollection);
+
 
+
+smalltalk.addClass('Array', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_asUppercase'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('asUppercase'),
-category: 'converting',
-fn: function () {
+selector: unescape('add%3A'),
+category: 'adding/removing',
+fn: function (anObject) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_asUppercase", [])]);
+self.push(anObject); return anObject;;
 return self;},
-args: [],
-source: unescape('asUppercase%0A%09%5Eself%20class%20fromString%3A%20self%20asString%20asUppercase'),
-messageSends: ["fromString:", "class", "asUppercase", "asString"],
+args: ["anObject"],
+source: unescape('add%3A%20anObject%0A%09%3Cself.push%28anObject%29%3B%20return%20anObject%3B%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CharacterArray);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_asSymbol'),
+unescape('_asJavascript'),
 smalltalk.method({
-selector: unescape('asSymbol'),
+selector: unescape('asJavascript'),
 category: 'converting',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_subclassResponsibility", []);
+return smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [smalltalk.send(smalltalk.send(self, "_collect_", [(function(each){return smalltalk.send(each, "_asJavascript", []);})]), "_join_", [unescape("%2C%20")])]), "__comma", [unescape("%5D")]);
 return self;},
 args: [],
-source: unescape('asSymbol%0A%09%5Eself%20subclassResponsibility'),
-messageSends: ["subclassResponsibility"],
+source: unescape('asJavascript%0A%09%5E%27%5B%27%2C%20%28%28self%20collect%3A%20%5B%3Aeach%20%7C%20each%20asJavascript%5D%29%20join%3A%20%27%2C%20%27%29%2C%20%20%27%5D%27'),
+messageSends: [unescape("%2C"), "join:", "collect:", "asJavascript"],
 referencedClasses: []
 }),
-smalltalk.CharacterArray);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_asLowercase'),
+unescape('_at_ifAbsent_'),
 smalltalk.method({
-selector: unescape('asLowercase'),
-category: 'converting',
-fn: function () {
+selector: unescape('at%3AifAbsent%3A'),
+category: 'accessing',
+fn: function (anIndex, aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_asLowercase", [])]);
+
+	    var value = self[anIndex - 1];
+	    if(value === undefined) {
+		return aBlock();
+	    } else {
+		return value;
+	    }
+	;
 return self;},
-args: [],
-source: unescape('asLowercase%0A%09%5Eself%20class%20fromString%3A%20self%20asString%20asLowercase'),
-messageSends: ["fromString:", "class", "asLowercase", "asString"],
+args: ["anIndex", "aBlock"],
+source: unescape('at%3A%20anIndex%20ifAbsent%3A%20aBlock%0A%09%3C%0A%09%20%20%20%20var%20value%20%3D%20self%5BanIndex%20-%201%5D%3B%0A%09%20%20%20%20if%28value%20%3D%3D%3D%20undefined%29%20%7B%0A%09%09return%20aBlock%28%29%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20value%3B%0A%09%20%20%20%20%7D%0A%09%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CharacterArray);
-
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_fromString_'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('fromString%3A'),
-category: 'instance creation',
-fn: function (aString) {
+selector: unescape('at%3Aput%3A'),
+category: 'accessing',
+fn: function (anIndex, anObject) {
 var self=this;
-smalltalk.send(self, "_subclassResponsibility", []);
+return self[anIndex - 1] = anObject;
 return self;},
-args: ["aString"],
-source: unescape('fromString%3A%20aString%0A%09self%20subclassResponsibility'),
-messageSends: ["subclassResponsibility"],
+args: ["anIndex", "anObject"],
+source: unescape('at%3A%20anIndex%20put%3A%20anObject%0A%09%3Creturn%20self%5BanIndex%20-%201%5D%20%3D%20anObject%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CharacterArray.klass);
-
+smalltalk.Array);
 
-smalltalk.addClass('String', smalltalk.CharacterArray, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_join_'),
 smalltalk.method({
-selector: unescape('%3D'),
-category: 'comparing',
+selector: unescape('join%3A'),
+category: 'enumerating',
 fn: function (aString) {
 var self=this;
-try{((($receiver = smalltalk.send(smalltalk.send(aString, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
-return String(self) === String(aString);
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}},
-args: ["aString"],
-source: unescape('%3D%20aString%0A%09aString%20class%20%3D%20self%20class%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09%3Creturn%20String%28self%29%20%3D%3D%3D%20String%28aString%29%3E'),
-messageSends: ["ifFalse:", unescape("%3D"), "class"],
-referencedClasses: []
-}),
-smalltalk.String);
-
-smalltalk.addMethod(
-unescape('_size'),
-smalltalk.method({
-selector: unescape('size'),
-category: 'accessing',
-fn: function () {
-var self=this;
-return self.length;
+return self.join(aString);
 return self;},
-args: [],
-source: unescape('size%0A%09%3Creturn%20self.length%3E'),
+args: ["aString"],
+source: unescape('join%3A%20aString%0A%09%3Creturn%20self.join%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
+unescape('_remove_'),
 smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
-category: 'accessing',
-fn: function (anIndex, aBlock) {
+selector: unescape('remove%3A'),
+category: 'adding/removing',
+fn: function (anObject) {
 var self=this;
-return self[anIndex - 1] || aBlock();
+
+		for(var i=0;i<self.length;i++) {
+			if(self[i] == anObject) {
+				self.splice(i,1);
+				break;
+			}
+		}
+	;
 return self;},
-args: ["anIndex", "aBlock"],
-source: unescape('at%3A%20anIndex%20ifAbsent%3A%20aBlock%0A%09%3Creturn%20self%5BanIndex%20-%201%5D%20%7C%7C%20aBlock%28%29%3E'),
+args: ["anObject"],
+source: unescape('remove%3A%20anObject%0A%09%3C%0A%09%09for%28var%20i%3D0%3Bi%3Cself.length%3Bi++%29%20%7B%0A%09%09%09if%28self%5Bi%5D%20%3D%3D%20anObject%29%20%7B%0A%09%09%09%09self.splice%28i%2C1%29%3B%0A%09%09%09%09break%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_escaped'),
+unescape('_removeFrom_to_'),
 smalltalk.method({
-selector: unescape('escaped'),
-category: 'accessing',
-fn: function () {
+selector: unescape('removeFrom%3Ato%3A'),
+category: 'adding/removing',
+fn: function (aNumber, anotherNumber) {
 var self=this;
-return escape(self);
+self.splice(aNumber - 1,anotherNumber - 1);
 return self;},
-args: [],
-source: unescape('escaped%0A%09%3Creturn%20escape%28self%29%3E'),
+args: ["aNumber", "anotherNumber"],
+source: unescape('removeFrom%3A%20aNumber%20to%3A%20anotherNumber%0A%09%3Cself.splice%28aNumber%20-%201%2CanotherNumber%20-%201%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_unescaped'),
+unescape('_reversed'),
 smalltalk.method({
-selector: unescape('unescaped'),
-category: 'accessing',
+selector: unescape('reversed'),
+category: 'converting',
 fn: function () {
 var self=this;
-return unescape(self);
+return self._copy().reverse();
 return self;},
 args: [],
-source: unescape('unescaped%0A%09%3Creturn%20unescape%28self%29%3E'),
+source: unescape('reversed%0A%09%3Creturn%20self._copy%28%29.reverse%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('__comma'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('%2C'),
-category: 'copying',
-fn: function (aString) {
+selector: unescape('size'),
+category: 'accessing',
+fn: function () {
 var self=this;
-return self + aString;
+return self.length;
 return self;},
-args: ["aString"],
-source: unescape('%2C%20aString%0A%09%3Creturn%20self%20+%20aString%3E'),
+args: [],
+source: unescape('size%0A%09%3Creturn%20self.length%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_copyFrom_to_'),
+unescape('_sort'),
 smalltalk.method({
-selector: unescape('copyFrom%3Ato%3A'),
-category: 'copying',
-fn: function (anIndex, anotherIndex) {
+selector: unescape('sort'),
+category: 'enumerating',
+fn: function () {
 var self=this;
-return self.substring(anIndex - 1, anotherIndex);
+return smalltalk.send(self, "_basicPerform_", ["sort"]);
 return self;},
-args: ["anIndex", "anotherIndex"],
-source: unescape('copyFrom%3A%20anIndex%20to%3A%20anotherIndex%0A%09%3Creturn%20self.substring%28anIndex%20-%201%2C%20anotherIndex%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('sort%0A%20%20%20%20%5Eself%20basicPerform%3A%20%27sort%27'),
+messageSends: ["basicPerform:"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_sort_'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
-category: 'copying',
-fn: function () {
+selector: unescape('sort%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [self]);
+
+		return self.sort(function(a, b) {
+			if(aBlock(a,b)) {return -1} else {return 1}
+		})
+	;
 return self;},
-args: [],
-source: unescape('shallowCopy%0A%09%5Eself%20class%20fromString%3A%20self'),
-messageSends: ["fromString:", "class"],
+args: ["aBlock"],
+source: unescape('sort%3A%20aBlock%0A%09%3C%0A%09%09return%20self.sort%28function%28a%2C%20b%29%20%7B%0A%09%09%09if%28aBlock%28a%2Cb%29%29%20%7Breturn%20-1%7D%20else%20%7Breturn%201%7D%0A%09%09%7D%29%0A%09%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_sorted'),
 smalltalk.method({
-selector: unescape('deepCopy'),
-category: 'copying',
+selector: unescape('sorted'),
+category: 'enumerating',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_shallowCopy", []);
+return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort", []);
 return self;},
 args: [],
-source: unescape('deepCopy%0A%09%5Eself%20shallowCopy'),
-messageSends: ["shallowCopy"],
+source: unescape('sorted%0A%09%5Eself%20copy%20sort'),
+messageSends: ["sort", "copy"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_asSelector'),
+unescape('_sorted_'),
 smalltalk.method({
-selector: unescape('asSelector'),
-category: 'converting',
-fn: function () {
+selector: unescape('sorted%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
 var self=this;
-var selector=nil;
-(selector=smalltalk.send("_", "__comma", [self]));
-(selector=smalltalk.send(selector, "_replace_with_", [":", "_"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B+%5D"), "_plus"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("-"), "_minus"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B*%5D"), "_star"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B/%5D"), "_slash"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3E"), "_gt"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3C"), "_lt"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3D"), "_eq"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%2C"), "_comma"]));
-(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B@%5D"), "_at"]));
-return selector;
+return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort_", [aBlock]);
 return self;},
-args: [],
-source: unescape('asSelector%0A%09%22If%20you%20change%20this%20method%2C%20change%20smalltalk.convertSelector%20too%20%28see%20js/boot.js%20file%29%22%0A%0A%09%7C%20selector%20%7C%0A%09selector%20%3A%3D%20%27_%27%2C%20self.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%3A%27%20with%3A%20%27_%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B+%5D%27%20with%3A%20%27_plus%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27-%27%20with%3A%20%27_minus%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B*%5D%27%20with%3A%20%27_star%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B/%5D%27%20with%3A%20%27_slash%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%3E%27%20with%3A%20%27_gt%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%3C%27%20with%3A%20%27_lt%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%3D%27%20with%3A%20%27_eq%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%2C%27%20with%3A%20%27_comma%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B@%5D%27%20with%3A%20%27_at%27.%0A%09%5Eselector'),
-messageSends: [unescape("%2C"), "replace:with:"],
+args: ["aBlock"],
+source: unescape('sorted%3A%20aBlock%0A%09%5Eself%20copy%20sort%3A%20aBlock'),
+messageSends: ["sort:", "copy"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
+
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_new_'),
 smalltalk.method({
-selector: unescape('asJavascript'),
-category: 'converting',
-fn: function () {
+selector: unescape('new%3A'),
+category: 'instance creation',
+fn: function (anInteger) {
 var self=this;
-
-		if(self.search(/^[a-zA-Z0-9_:.$ ]*$/) == -1)
-			return "unescape(\"" + escape(self) + "\")";
-		else
-			return "\"" + self + "\"";
-	;
+return new Array(anInteger);
 return self;},
-args: [],
-source: unescape('asJavascript%0A%09%3C%0A%09%09if%28self.search%28/%5E%5Ba-zA-Z0-9_%3A.%24%20%5D*%24/%29%20%3D%3D%20-1%29%0A%09%09%09return%20%22unescape%28%5C%22%22%20+%20escape%28self%29%20+%20%22%5C%22%29%22%3B%0A%09%09else%0A%09%09%09return%20%22%5C%22%22%20+%20self%20+%20%22%5C%22%22%3B%0A%09%3E'),
+args: ["anInteger"],
+source: unescape('new%3A%20anInteger%0A%09%3Creturn%20new%20Array%28anInteger%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_replace_with_'),
+unescape('_with_'),
 smalltalk.method({
-selector: unescape('replace%3Awith%3A'),
-category: 'regular expressions',
-fn: function (aString, anotherString) {
+selector: unescape('with%3A'),
+category: 'instance creation',
+fn: function (anObject) {
 var self=this;
-return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [aString, "g"]), anotherString]);
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(1)]));
 return self;},
-args: ["aString", "anotherString"],
-source: unescape('replace%3A%20aString%20with%3A%20anotherString%0A%09%5Eself%20replaceRegexp%3A%20%28RegularExpression%20fromString%3A%20aString%20flag%3A%20%27g%27%29%20with%3A%20anotherString'),
-messageSends: ["replaceRegexp:with:", "fromString:flag:"],
-referencedClasses: ["RegularExpression"]
+args: ["anObject"],
+source: unescape('with%3A%20anObject%0A%09%20%20%20%20%5E%28self%20new%3A%201%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09yourself'),
+messageSends: ["at:put:", "yourself", "new:"],
+referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_replaceRegexp_with_'),
+unescape('_with_with_'),
 smalltalk.method({
-selector: unescape('replaceRegexp%3Awith%3A'),
-category: 'regular expressions',
-fn: function (aRegexp, aString) {
+selector: unescape('with%3Awith%3A'),
+category: 'instance creation',
+fn: function (anObject, anObject2) {
 var self=this;
-return self.replace(aRegexp, aString);
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(2)]));
 return self;},
-args: ["aRegexp", "aString"],
-source: unescape('replaceRegexp%3A%20aRegexp%20with%3A%20aString%0A%09%3Creturn%20self.replace%28aRegexp%2C%20aString%29%3E'),
-messageSends: [],
+args: ["anObject", "anObject2"],
+source: unescape('with%3A%20anObject%20with%3A%20anObject2%0A%09%20%20%20%20%5E%28self%20new%3A%202%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09at%3A%202%20put%3A%20anObject2%3B%0A%09%09yourself'),
+messageSends: ["at:put:", "yourself", "new:"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_tokenize_'),
+unescape('_with_with_with_'),
 smalltalk.method({
-selector: unescape('tokenize%3A'),
-category: 'converting',
-fn: function (aString) {
+selector: unescape('with%3Awith%3Awith%3A'),
+category: 'instance creation',
+fn: function (anObject, anObject2, anObject3) {
 var self=this;
-return self.split(aString);
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);smalltalk.send($rec, "_at_put_", [(3), anObject3]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(3)]));
 return self;},
-args: ["aString"],
-source: unescape('tokenize%3A%20aString%0A%09%3Creturn%20self.split%28aString%29%3E'),
-messageSends: [],
+args: ["anObject", "anObject2", "anObject3"],
+source: unescape('with%3A%20anObject%20with%3A%20anObject2%20with%3A%20anObject3%0A%09%20%20%20%20%5E%28self%20new%3A%203%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09at%3A%202%20put%3A%20anObject2%3B%0A%09%09at%3A%203%20put%3A%20anObject3%3B%0A%09%09yourself'),
+messageSends: ["at:put:", "yourself", "new:"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_match_'),
+unescape('_withAll_'),
 smalltalk.method({
-selector: unescape('match%3A'),
-category: 'regular expressions',
-fn: function (aRegexp) {
+selector: unescape('withAll%3A'),
+category: 'instance creation',
+fn: function (aCollection) {
 var self=this;
-return self.search(aRegexp) != -1;
+var instance=nil;
+(instance=smalltalk.send(self, "_new_", [smalltalk.send(aCollection, "_size", [])]));
+smalltalk.send(aCollection, "_withIndexDo_", [(function(each, index){return smalltalk.send(instance, "_at_put_", [index, each]);})]);
+return instance;
 return self;},
-args: ["aRegexp"],
-source: unescape('match%3A%20aRegexp%0A%09%3Creturn%20self.search%28aRegexp%29%20%21%3D%20-1%3E'),
-messageSends: [],
+args: ["aCollection"],
+source: unescape('withAll%3A%20aCollection%0A%09%7C%20instance%20%7C%0A%09instance%20%3A%3D%20self%20new%3A%20aCollection%20size.%0A%09aCollection%20withIndexDo%3A%20%5B%3Aeach%20%3Aindex%20%20%7C%0A%09%09instance%20at%3A%20index%20put%3A%20each%5D.%0A%09%5Einstance'),
+messageSends: ["new:", "size", "withIndexDo:", "at:put:"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
+
+smalltalk.addClass('Array', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('asString'),
-category: 'converting',
-fn: function () {
+selector: unescape('add%3A'),
+category: 'adding/removing',
+fn: function (anObject) {
 var self=this;
-return self;
+self.push(anObject); return anObject;;
 return self;},
-args: [],
-source: unescape('asString%0A%09%5Eself'),
+args: ["anObject"],
+source: unescape('add%3A%20anObject%0A%09%3Cself.push%28anObject%29%3B%20return%20anObject%3B%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_asNumber'),
+unescape('_asJavascript'),
 smalltalk.method({
-selector: unescape('asNumber'),
+selector: unescape('asJavascript'),
 category: 'converting',
 fn: function () {
 var self=this;
-return Number(self);
+return smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [smalltalk.send(smalltalk.send(self, "_collect_", [(function(each){return smalltalk.send(each, "_asJavascript", []);})]), "_join_", [unescape("%2C%20")])]), "__comma", [unescape("%5D")]);
 return self;},
 args: [],
-source: unescape('asNumber%0A%09%3Creturn%20Number%28self%29%3E'),
-messageSends: [],
+source: unescape('asJavascript%0A%09%5E%27%5B%27%2C%20%28%28self%20collect%3A%20%5B%3Aeach%20%7C%20each%20asJavascript%5D%29%20join%3A%20%27%2C%20%27%29%2C%20%20%27%5D%27'),
+messageSends: [unescape("%2C"), "join:", "collect:", "asJavascript"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_at_ifAbsent_'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
-fn: function () {
+selector: unescape('at%3AifAbsent%3A'),
+category: 'accessing',
+fn: function (anIndex, aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [self]), "__comma", [unescape("%27")]);
+
+	    var value = self[anIndex - 1];
+	    if(value === undefined) {
+		return aBlock();
+	    } else {
+		return value;
+	    }
+	;
 return self;},
-args: [],
-source: unescape('printString%0A%09%5E%27%27%27%27%2C%20self%2C%20%27%27%27%27'),
-messageSends: [unescape("%2C")],
+args: ["anIndex", "aBlock"],
+source: unescape('at%3A%20anIndex%20ifAbsent%3A%20aBlock%0A%09%3C%0A%09%20%20%20%20var%20value%20%3D%20self%5BanIndex%20-%201%5D%3B%0A%09%20%20%20%20if%28value%20%3D%3D%3D%20undefined%29%20%7B%0A%09%09return%20aBlock%28%29%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20value%3B%0A%09%20%20%20%20%7D%0A%09%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_printNl'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('printNl'),
-category: 'printing',
-fn: function () {
+selector: unescape('at%3Aput%3A'),
+category: 'accessing',
+fn: function (anIndex, anObject) {
 var self=this;
-console.log(self);
+return self[anIndex - 1] = anObject;
 return self;},
-args: [],
-source: unescape('printNl%0A%09%3Cconsole.log%28self%29%3E'),
+args: ["anIndex", "anObject"],
+source: unescape('at%3A%20anIndex%20put%3A%20anObject%0A%09%3Creturn%20self%5BanIndex%20-%201%5D%20%3D%20anObject%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_isString'),
+unescape('_join_'),
 smalltalk.method({
-selector: unescape('isString'),
-category: 'testing',
-fn: function () {
+selector: unescape('join%3A'),
+category: 'enumerating',
+fn: function (aString) {
 var self=this;
-return true;
+return self.join(aString);
 return self;},
-args: [],
-source: unescape('isString%0A%09%5Etrue'),
+args: ["aString"],
+source: unescape('join%3A%20aString%0A%09%3Creturn%20self.join%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('__gt'),
+unescape('_remove_'),
 smalltalk.method({
-selector: unescape('%3E'),
-category: 'comparing',
-fn: function (aString) {
+selector: unescape('remove%3A'),
+category: 'adding/removing',
+fn: function (anObject) {
 var self=this;
-return String(self) > aString._asString();
+
+		for(var i=0;i<self.length;i++) {
+			if(self[i] == anObject) {
+				self.splice(i,1);
+				break;
+			}
+		}
+	;
 return self;},
-args: ["aString"],
-source: unescape('%3E%20aString%0A%09%3Creturn%20String%28self%29%20%3E%3E%20aString._asString%28%29%3E'),
+args: ["anObject"],
+source: unescape('remove%3A%20anObject%0A%09%3C%0A%09%09for%28var%20i%3D0%3Bi%3Cself.length%3Bi++%29%20%7B%0A%09%09%09if%28self%5Bi%5D%20%3D%3D%20anObject%29%20%7B%0A%09%09%09%09self.splice%28i%2C1%29%3B%0A%09%09%09%09break%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('__lt'),
+unescape('_removeFrom_to_'),
 smalltalk.method({
-selector: unescape('%3C'),
-category: 'comparing',
-fn: function (aString) {
+selector: unescape('removeFrom%3Ato%3A'),
+category: 'adding/removing',
+fn: function (aNumber, anotherNumber) {
 var self=this;
-return String(self) < aString._asString();
+self.splice(aNumber - 1,anotherNumber - 1);
 return self;},
-args: ["aString"],
-source: unescape('%3C%20aString%0A%09%3Creturn%20String%28self%29%20%3C%20aString._asString%28%29%3E'),
+args: ["aNumber", "anotherNumber"],
+source: unescape('removeFrom%3A%20aNumber%20to%3A%20anotherNumber%0A%09%3Cself.splice%28aNumber%20-%201%2CanotherNumber%20-%201%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('__gt_eq'),
+unescape('_reversed'),
 smalltalk.method({
-selector: unescape('%3E%3D'),
-category: 'comparing',
-fn: function (aString) {
+selector: unescape('reversed'),
+category: 'converting',
+fn: function () {
 var self=this;
-return String(self) >= aString._asString();
+return self._copy().reverse();
 return self;},
-args: ["aString"],
-source: unescape('%3E%3D%20aString%0A%09%3Creturn%20String%28self%29%20%3E%3E%3D%20aString._asString%28%29%3E'),
+args: [],
+source: unescape('reversed%0A%09%3Creturn%20self._copy%28%29.reverse%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('__lt_eq'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('%3C%3D'),
-category: 'comparing',
-fn: function (aString) {
+selector: unescape('size'),
+category: 'accessing',
+fn: function () {
 var self=this;
-return String(self) <= aString._asString();
+return self.length;
 return self;},
-args: ["aString"],
-source: unescape('%3C%3D%20aString%0A%09%3Creturn%20String%28self%29%20%3C%3D%20aString._asString%28%29%3E'),
+args: [],
+source: unescape('size%0A%09%3Creturn%20self.length%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_trimLeft_'),
+unescape('_sort'),
 smalltalk.method({
-selector: unescape('trimLeft%3A'),
-category: 'regular expressions',
-fn: function (separators) {
+selector: unescape('sort'),
+category: 'enumerating',
+fn: function () {
 var self=this;
-return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [smalltalk.send(smalltalk.send(unescape("%5E%5B"), "__comma", [separators]), "__comma", [unescape("%5D+")]), "g"]), ""]);
+return smalltalk.send(self, "_basicPerform_", ["sort"]);
 return self;},
-args: ["separators"],
-source: unescape('trimLeft%3A%20separators%0A%0A%09%5Eself%20replaceRegexp%3A%20%28RegularExpression%20fromString%3A%20%27%5E%5B%27%2C%20separators%2C%20%27%5D+%27%20flag%3A%20%27g%27%29%20with%3A%20%27%27'),
-messageSends: ["replaceRegexp:with:", "fromString:flag:", unescape("%2C")],
-referencedClasses: ["RegularExpression"]
+args: [],
+source: unescape('sort%0A%20%20%20%20%5Eself%20basicPerform%3A%20%27sort%27'),
+messageSends: ["basicPerform:"],
+referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_trimRight_'),
+unescape('_sort_'),
 smalltalk.method({
-selector: unescape('trimRight%3A'),
-category: 'regular expressions',
-fn: function (separators) {
+selector: unescape('sort%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [separators]), "__comma", [unescape("%5D+%24")]), "g"]), ""]);
+
+		return self.sort(function(a, b) {
+			if(aBlock(a,b)) {return -1} else {return 1}
+		})
+	;
 return self;},
-args: ["separators"],
-source: unescape('trimRight%3A%20separators%0A%0A%09%5Eself%20replaceRegexp%3A%20%28RegularExpression%20fromString%3A%20%27%5B%27%2C%20separators%2C%20%27%5D+%24%27%20flag%3A%20%27g%27%29%20with%3A%20%27%27'),
-messageSends: ["replaceRegexp:with:", "fromString:flag:", unescape("%2C")],
-referencedClasses: ["RegularExpression"]
+args: ["aBlock"],
+source: unescape('sort%3A%20aBlock%0A%09%3C%0A%09%09return%20self.sort%28function%28a%2C%20b%29%20%7B%0A%09%09%09if%28aBlock%28a%2Cb%29%29%20%7Breturn%20-1%7D%20else%20%7Breturn%201%7D%0A%09%09%7D%29%0A%09%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_trimLeft'),
+unescape('_sorted'),
 smalltalk.method({
-selector: unescape('trimLeft'),
-category: 'regular expressions',
+selector: unescape('sorted'),
+category: 'enumerating',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_trimLeft_", [unescape("%5Cs")]);
+return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort", []);
 return self;},
 args: [],
-source: unescape('trimLeft%0A%09%5Eself%20trimLeft%3A%20%27%5Cs%27'),
-messageSends: ["trimLeft:"],
+source: unescape('sorted%0A%09%5Eself%20copy%20sort'),
+messageSends: ["sort", "copy"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
-unescape('_trimRight'),
+unescape('_sorted_'),
 smalltalk.method({
-selector: unescape('trimRight'),
-category: 'regular expressions',
-fn: function () {
+selector: unescape('sorted%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(self, "_trimRight_", [unescape("%5Cs")]);
+return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort_", [aBlock]);
 return self;},
-args: [],
-source: unescape('trimRight%0A%09%5Eself%20trimRight%3A%20%27%5Cs%27'),
-messageSends: ["trimRight:"],
+args: ["aBlock"],
+source: unescape('sorted%3A%20aBlock%0A%09%5Eself%20copy%20sort%3A%20aBlock'),
+messageSends: ["sort:", "copy"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
+
 
 smalltalk.addMethod(
-unescape('_trimBoth'),
+unescape('_new_'),
 smalltalk.method({
-selector: unescape('trimBoth'),
-category: 'regular expressions',
-fn: function () {
+selector: unescape('new%3A'),
+category: 'instance creation',
+fn: function (anInteger) {
 var self=this;
-return smalltalk.send(self, "_trimBoth_", [unescape("%5Cs")]);
+return new Array(anInteger);
 return self;},
-args: [],
-source: unescape('trimBoth%0A%09%5Eself%20trimBoth%3A%20%27%5Cs%27'),
-messageSends: ["trimBoth:"],
+args: ["anInteger"],
+source: unescape('new%3A%20anInteger%0A%09%3Creturn%20new%20Array%28anInteger%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_trimBoth_'),
-smalltalk.method({
-selector: unescape('trimBoth%3A'),
-category: 'regular expressions',
-fn: function (separators) {
+unescape('_with_'),
+smalltalk.method({
+selector: unescape('with%3A'),
+category: 'instance creation',
+fn: function (anObject) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_trimLeft_", [separators]), "_trimRight_", [separators]);
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(1)]));
 return self;},
-args: ["separators"],
-source: unescape('trimBoth%3A%20separators%0A%0A%09%5E%28self%20trimLeft%3A%20separators%29%20trimRight%3A%20separators'),
-messageSends: ["trimRight:", "trimLeft:"],
+args: ["anObject"],
+source: unescape('with%3A%20anObject%0A%09%20%20%20%20%5E%28self%20new%3A%201%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09yourself'),
+messageSends: ["at:put:", "yourself", "new:"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_asLowercase'),
+unescape('_with_with_'),
 smalltalk.method({
-selector: unescape('asLowercase'),
-category: 'converting',
-fn: function () {
+selector: unescape('with%3Awith%3A'),
+category: 'instance creation',
+fn: function (anObject, anObject2) {
 var self=this;
-return self.toLowerCase();
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(2)]));
 return self;},
-args: [],
-source: unescape('asLowercase%0A%09%3Creturn%20self.toLowerCase%28%29%3E'),
-messageSends: [],
+args: ["anObject", "anObject2"],
+source: unescape('with%3A%20anObject%20with%3A%20anObject2%0A%09%20%20%20%20%5E%28self%20new%3A%202%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09at%3A%202%20put%3A%20anObject2%3B%0A%09%09yourself'),
+messageSends: ["at:put:", "yourself", "new:"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_asUppercase'),
+unescape('_with_with_with_'),
 smalltalk.method({
-selector: unescape('asUppercase'),
-category: 'converting',
-fn: function () {
+selector: unescape('with%3Awith%3Awith%3A'),
+category: 'instance creation',
+fn: function (anObject, anObject2, anObject3) {
 var self=this;
-return self.toUpperCase();
+return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);smalltalk.send($rec, "_at_put_", [(3), anObject3]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(3)]));
 return self;},
-args: [],
-source: unescape('asUppercase%0A%09%3Creturn%20self.toUpperCase%28%29%3E'),
-messageSends: [],
+args: ["anObject", "anObject2", "anObject3"],
+source: unescape('with%3A%20anObject%20with%3A%20anObject2%20with%3A%20anObject3%0A%09%20%20%20%20%5E%28self%20new%3A%203%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09at%3A%202%20put%3A%20anObject2%3B%0A%09%09at%3A%203%20put%3A%20anObject3%3B%0A%09%09yourself'),
+messageSends: ["at:put:", "yourself", "new:"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
 smalltalk.addMethod(
-unescape('_join_'),
+unescape('_withAll_'),
 smalltalk.method({
-selector: unescape('join%3A'),
-category: 'split join',
+selector: unescape('withAll%3A'),
+category: 'instance creation',
 fn: function (aCollection) {
 var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){return smalltalk.send(aCollection, "_do_separatedBy_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(each, "_asString", [])]);}), (function(){return smalltalk.send(stream, "_nextPutAll_", [self]);})]);})]);
+var instance=nil;
+(instance=smalltalk.send(self, "_new_", [smalltalk.send(aCollection, "_size", [])]));
+smalltalk.send(aCollection, "_withIndexDo_", [(function(each, index){return smalltalk.send(instance, "_at_put_", [index, each]);})]);
+return instance;
 return self;},
 args: ["aCollection"],
-source: unescape('join%3A%20aCollection%20%0A%09%5E%20String%0A%09%09streamContents%3A%20%5B%3Astream%20%7C%20aCollection%0A%09%09%09%09do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%20asString%5D%20%0A%09%09%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20self%5D%5D'),
-messageSends: ["streamContents:", "do:separatedBy:", "nextPutAll:", "asString"],
-referencedClasses: ["String"]
+source: unescape('withAll%3A%20aCollection%0A%09%7C%20instance%20%7C%0A%09instance%20%3A%3D%20self%20new%3A%20aCollection%20size.%0A%09aCollection%20withIndexDo%3A%20%5B%3Aeach%20%3Aindex%20%20%7C%0A%09%09instance%20at%3A%20index%20put%3A%20each%5D.%0A%09%5Einstance'),
+messageSends: ["new:", "size", "withIndexDo:", "at:put:"],
+referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array.klass);
 
+
+smalltalk.addClass('CharacterArray', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_includesSubString_'),
+unescape('__comma'),
 smalltalk.method({
-selector: unescape('includesSubString%3A'),
-category: 'testing',
-fn: function (subString) {
+selector: unescape('%2C'),
+category: 'copying',
+fn: function (aString) {
 var self=this;
- return self.indexOf(subString) != -1 ;
+return smalltalk.send(smalltalk.send(self, "_asString", []), "__comma", [smalltalk.send(aString, "_asString", [])]);
 return self;},
-args: ["subString"],
-source: unescape('includesSubString%3A%20subString%0A%09%3C%20return%20self.indexOf%28subString%29%20%21%3D%20-1%20%3E'),
-messageSends: [],
+args: ["aString"],
+source: unescape('%2C%20aString%0A%09%5Eself%20asString%2C%20aString%20asString'),
+messageSends: [unescape("%2C"), "asString"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_asciiValue'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('asciiValue'),
-category: 'accessing',
-fn: function () {
+selector: unescape('add%3A'),
+category: 'adding',
+fn: function (anObject) {
 var self=this;
-return self.charCodeAt(0);;
+smalltalk.send(self, "_errorReadOnly", []);
 return self;},
-args: [],
-source: unescape('asciiValue%0A%09%3Creturn%20self.charCodeAt%280%29%3B%3E'),
-messageSends: [],
+args: ["anObject"],
+source: unescape('add%3A%20anObject%0A%09self%20errorReadOnly'),
+messageSends: ["errorReadOnly"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_lineIndicesDo_'),
+unescape('_asLowercase'),
 smalltalk.method({
-selector: unescape('lineIndicesDo%3A'),
-category: 'split join',
-fn: function (aBlock) {
+selector: unescape('asLowercase'),
+category: 'converting',
+fn: function () {
 var self=this;
-try{var cr=nil;
-var lf=nil;
-var start=nil;
-var sz=nil;
-var nextLF=nil;
-var nextCR=nil;
-(start=(1));
-(sz=smalltalk.send(self, "_size", []));
-(cr=smalltalk.send((smalltalk.String || String), "_cr", []));
-(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, (1)]));
-(lf=smalltalk.send((smalltalk.String || String), "_lf", []));
-(nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, (1)]));
-(function(){while((function(){return ((($receiver = start).klass === smalltalk.Number) ? $receiver <=sz : smalltalk.send($receiver, "__lt_eq", [sz]));})()) {(function(){((($receiver = smalltalk.send(smalltalk.send(nextLF, "__eq", [(0)]), "_and_", [(function(){return smalltalk.send(nextCR, "__eq", [(0)]);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, sz, sz]);return (function(){throw({name: 'stReturn', selector: '_lineIndicesDo_', fn: function(){return self}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, sz, sz]);return (function(){throw({name: 'stReturn', selector: '_lineIndicesDo_', fn: function(){return self}})})();})]));return ((($receiver = smalltalk.send(smalltalk.send(nextCR, "__eq", [(0)]), "_or_", [(function(){return smalltalk.send((0) < nextLF, "_and_", [(function(){return ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver <nextCR : smalltalk.send($receiver, "__lt", [nextCR]));})]);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){return ((($receiver = smalltalk.send((1) + nextCR, "__eq", [nextLF])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){return ((($receiver = smalltalk.send((1) + nextCR, "__eq", [nextLF])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})]));})]));})()}})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_lineIndicesDo_'){return e.fn()} throw(e)}},
-args: ["aBlock"],
-source: unescape('lineIndicesDo%3A%20aBlock%0A%09%22execute%20aBlock%20with%203%20arguments%20for%20each%20line%3A%0A%09-%20start%20index%20of%20line%0A%09-%20end%20index%20of%20line%20without%20line%20delimiter%0A%09-%20end%20index%20of%20line%20including%20line%20delimiter%28s%29%20CR%2C%20LF%20or%20CRLF%22%0A%09%0A%09%7C%20cr%20lf%20start%20sz%20nextLF%20nextCR%20%7C%0A%09start%20%3A%3D%201.%0A%09sz%20%3A%3D%20self%20size.%0A%09cr%20%3A%3D%20String%20cr.%0A%09nextCR%20%3A%3D%20self%20indexOf%3A%20cr%20startingAt%3A%201.%0A%09lf%20%3A%3D%20String%20lf.%0A%09nextLF%20%3A%3D%20self%20indexOf%3A%20lf%20startingAt%3A%201.%0A%09%5B%20start%20%3C%3D%20sz%20%5D%20whileTrue%3A%20%5B%0A%09%09%28nextLF%20%3D%200%20and%3A%20%5B%20nextCR%20%3D%200%20%5D%29%0A%09%09%09ifTrue%3A%20%5B%20%22No%20more%20CR%2C%20nor%20LF%2C%20the%20string%20is%20over%22%0A%09%09%09%09%09aBlock%20value%3A%20start%20value%3A%20sz%20value%3A%20sz.%0A%09%09%09%09%09%5Eself%20%5D.%0A%09%09%28nextCR%20%3D%200%20or%3A%20%5B%200%20%3C%20nextLF%20and%3A%20%5B%20nextLF%20%3C%20nextCR%20%5D%20%5D%29%0A%09%09%09ifTrue%3A%20%5B%20%22Found%20a%20LF%22%0A%09%09%09%09%09aBlock%20value%3A%20start%20value%3A%20nextLF%20-%201%20value%3A%20nextLF.%0A%09%09%09%09%09start%20%3A%3D%201%20+%20nextLF.%0A%09%09%09%09%09nextLF%20%3A%3D%20self%20indexOf%3A%20lf%20startingAt%3A%20start%20%5D%0A%09%09%09ifFalse%3A%20%5B%201%20+%20nextCR%20%3D%20nextLF%0A%09%09%09%09ifTrue%3A%20%5B%20%22Found%20a%20CR-LF%20pair%22%0A%09%09%09%09%09aBlock%20value%3A%20start%20value%3A%20nextCR%20-%201%20value%3A%20nextLF.%0A%09%09%09%09%09start%20%3A%3D%201%20+%20nextLF.%0A%09%09%09%09%09nextCR%20%3A%3D%20self%20indexOf%3A%20cr%20startingAt%3A%20start.%0A%09%09%09%09%09nextLF%20%3A%3D%20self%20indexOf%3A%20lf%20startingAt%3A%20start%20%5D%0A%09%09%09%09ifFalse%3A%20%5B%20%22Found%20a%20CR%22%0A%09%09%09%09%09aBlock%20value%3A%20start%20value%3A%20nextCR%20-%201%20value%3A%20nextCR.%0A%09%09%09%09%09start%20%3A%3D%201%20+%20nextCR.%0A%09%09%09%09%09nextCR%20%3A%3D%20self%20indexOf%3A%20cr%20startingAt%3A%20start%20%5D%5D%5D'),
-messageSends: ["size", "cr", "indexOf:startingAt:", "lf", "whileTrue:", unescape("%3C%3D"), "ifTrue:", "and:", unescape("%3D"), "value:value:value:", "ifTrue:ifFalse:", "or:", unescape("%3C"), unescape("-"), unescape("+")],
-referencedClasses: ["String"]
+return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_asLowercase", [])]);
+return self;},
+args: [],
+source: unescape('asLowercase%0A%09%5Eself%20class%20fromString%3A%20self%20asString%20asLowercase'),
+messageSends: ["fromString:", "class", "asLowercase", "asString"],
+referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_linesDo_'),
+unescape('_asNumber'),
 smalltalk.method({
-selector: unescape('linesDo%3A'),
-category: 'split join',
-fn: function (aBlock) {
+selector: unescape('asNumber'),
+category: 'converting',
+fn: function () {
 var self=this;
-smalltalk.send(self, "_lineIndicesDo_", [(function(start, endWithoutDelimiters, end){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])]);})]);
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_asNumber", []);
 return self;},
-args: ["aBlock"],
-source: unescape('linesDo%3A%20aBlock%0A%09%22Execute%20aBlock%20with%20each%20line%20in%20this%20string.%20The%20terminating%20line%0A%09delimiters%20CR%2C%20LF%20or%20CRLF%20pairs%20are%20not%20included%20in%20what%20is%20passed%20to%20aBlock%22%0A%0A%09self%20lineIndicesDo%3A%20%5B%3Astart%20%3AendWithoutDelimiters%20%3Aend%20%7C%0A%09%09aBlock%20value%3A%20%28self%20copyFrom%3A%20start%20to%3A%20endWithoutDelimiters%29%5D'),
-messageSends: ["lineIndicesDo:", "value:", "copyFrom:to:"],
+args: [],
+source: unescape('asNumber%0A%09%5Eself%20asString%20asNumber'),
+messageSends: ["asNumber", "asString"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_lines'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('lines'),
-category: 'split join',
+selector: unescape('asString'),
+category: 'converting',
 fn: function () {
 var self=this;
-var lines=nil;
-(lines=smalltalk.send((smalltalk.Array || Array), "_new", []));
-smalltalk.send(self, "_linesDo_", [(function(aLine){return smalltalk.send(lines, "_add_", [aLine]);})]);
-return lines;
+return smalltalk.send(self, "_subclassResponsibility", []);
 return self;},
 args: [],
-source: unescape('lines%0A%09%22Answer%20an%20array%20of%20lines%20composing%20this%20receiver%20without%20the%20line%20ending%20delimiters.%22%0A%0A%09%7C%20lines%20%7C%0A%09lines%20%3A%3D%20Array%20new.%0A%09self%20linesDo%3A%20%5B%3AaLine%20%7C%20lines%20add%3A%20aLine%5D.%0A%09%5Elines'),
-messageSends: ["new", "linesDo:", "add:"],
-referencedClasses: ["Array"]
+source: unescape('asString%0A%09%5Eself%20subclassResponsibility'),
+messageSends: ["subclassResponsibility"],
+referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_lineNumber_'),
+unescape('_asSymbol'),
 smalltalk.method({
-selector: unescape('lineNumber%3A'),
-category: 'split join',
-fn: function (anIndex) {
+selector: unescape('asSymbol'),
+category: 'converting',
+fn: function () {
 var self=this;
-try{var lineCount=nil;
-(lineCount=(0));
-smalltalk.send(self, "_lineIndicesDo_", [(function(start, endWithoutDelimiters, end){return ((($receiver = smalltalk.send((lineCount=((($receiver = lineCount).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))), "__eq", [anIndex])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])}})})();})]));})]);
-(function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return nil}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '_lineNumber_'){return e.fn()} throw(e)}},
-args: ["anIndex"],
-source: unescape('lineNumber%3A%20anIndex%0A%09%22Answer%20a%20string%20containing%20the%20characters%20in%20the%20given%20line%20number.%22%0A%0A%09%7C%20lineCount%20%7C%0A%09lineCount%20%3A%3D%200.%0A%09self%20lineIndicesDo%3A%20%5B%3Astart%20%3AendWithoutDelimiters%20%3Aend%20%7C%0A%09%09%28lineCount%20%3A%3D%20lineCount%20+%201%29%20%3D%20anIndex%20ifTrue%3A%20%5B%5Eself%20copyFrom%3A%20start%20to%3A%20endWithoutDelimiters%5D%5D.%0A%09%5Enil'),
-messageSends: ["lineIndicesDo:", "ifTrue:", unescape("%3D"), unescape("+"), "copyFrom:to:"],
+return smalltalk.send(self, "_subclassResponsibility", []);
+return self;},
+args: [],
+source: unescape('asSymbol%0A%09%5Eself%20subclassResponsibility'),
+messageSends: ["subclassResponsibility"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_reversed'),
+unescape('_asUppercase'),
 smalltalk.method({
-selector: unescape('reversed'),
+selector: unescape('asUppercase'),
 category: 'converting',
 fn: function () {
 var self=this;
-return self.split("").reverse().join("");
+return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_asUppercase", [])]);
 return self;},
 args: [],
-source: unescape('reversed%0A%09%3Creturn%20self.split%28%22%22%29.reverse%28%29.join%28%22%22%29%3E'),
-messageSends: [],
+source: unescape('asUppercase%0A%09%5Eself%20class%20fromString%3A%20self%20asString%20asUppercase'),
+messageSends: ["fromString:", "class", "asUppercase", "asString"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_asJavaScriptSelector'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('asJavaScriptSelector'),
-category: 'converting',
-fn: function () {
+selector: unescape('at%3Aput%3A'),
+category: 'accessing',
+fn: function (anIndex, anObject) {
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(self, "_asSelector", []), "_replace_with_", [unescape("%5E_"), ""]), "_replace_with_", [unescape("_.*"), ""]);
+smalltalk.send(self, "_errorReadOnly", []);
 return self;},
-args: [],
-source: unescape('asJavaScriptSelector%0A%09%5E%28self%20asSelector%20replace%3A%20%27%5E_%27%20with%3A%20%27%27%29%20replace%3A%20%27_.*%27%20with%3A%20%27%27.'),
-messageSends: ["replace:with:", "asSelector"],
+args: ["anIndex", "anObject"],
+source: unescape('at%3A%20anIndex%20put%3A%20anObject%0A%09self%20errorReadOnly'),
+messageSends: ["errorReadOnly"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_asSymbol'),
+unescape('_errorReadOnly'),
 smalltalk.method({
-selector: unescape('asSymbol'),
-category: 'converting',
+selector: unescape('errorReadOnly'),
+category: 'error handling',
 fn: function () {
 var self=this;
-return smalltalk.send((smalltalk.Symbol || Symbol), "_lookup_", [self]);
+smalltalk.send(self, "_error_", [unescape("Object%20is%20read-only")]);
 return self;},
 args: [],
-source: unescape('asSymbol%0A%09%5ESymbol%20lookup%3A%20self'),
-messageSends: ["lookup:"],
-referencedClasses: ["Symbol"]
+source: unescape('errorReadOnly%0A%09self%20error%3A%20%27Object%20is%20read-only%27'),
+messageSends: ["error:"],
+referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('asJSON'),
-category: 'converting',
-fn: function (){
+selector: unescape('printString'),
+category: 'printing',
+fn: function () {
 var self=this;
-return self;
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_printString", []);
 return self;},
 args: [],
-source: unescape('asJSON%0A%09%5Eself'),
-messageSends: [],
+source: unescape('printString%0A%09%5Eself%20asString%20printString'),
+messageSends: ["printString", "asString"],
 referencedClasses: []
 }),
-smalltalk.String);
-
+smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-unescape('_streamClass'),
+unescape('_remove_'),
 smalltalk.method({
-selector: unescape('streamClass'),
-category: 'accessing',
-fn: function () {
+selector: unescape('remove%3A'),
+category: 'adding',
+fn: function (anObject) {
 var self=this;
-return (smalltalk.StringStream || StringStream);
+smalltalk.send(self, "_errorReadOnly", []);
 return self;},
-args: [],
-source: unescape('streamClass%0A%09%20%20%20%20%5EStringStream'),
-messageSends: [],
-referencedClasses: ["StringStream"]
+args: ["anObject"],
+source: unescape('remove%3A%20anObject%0A%09self%20errorReadOnly'),
+messageSends: ["errorReadOnly"],
+referencedClasses: []
 }),
-smalltalk.String.klass);
+smalltalk.CharacterArray);
+
 
 smalltalk.addMethod(
 unescape('_fromString_'),
@@ -2589,1271 +2721,1256 @@ selector: unescape('fromString%3A'),
 category: 'instance creation',
 fn: function (aString) {
 var self=this;
-return new self.fn(aString);
+smalltalk.send(self, "_subclassResponsibility", []);
 return self;},
 args: ["aString"],
-source: unescape('fromString%3A%20aString%0A%09%20%20%20%20%3Creturn%20new%20self.fn%28aString%29%3E'),
-messageSends: [],
+source: unescape('fromString%3A%20aString%0A%09self%20subclassResponsibility'),
+messageSends: ["subclassResponsibility"],
 referencedClasses: []
 }),
-smalltalk.String.klass);
+smalltalk.CharacterArray.klass);
 
+
+smalltalk.addClass('String', smalltalk.CharacterArray, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_cr'),
+unescape('__comma'),
 smalltalk.method({
-selector: unescape('cr'),
-category: 'accessing',
-fn: function () {
+selector: unescape('%2C'),
+category: 'copying',
+fn: function (aString) {
 var self=this;
-return '\r';
+return self + aString;
 return self;},
-args: [],
-source: unescape('cr%0A%09%3Creturn%20%27%5Cr%27%3E'),
+args: ["aString"],
+source: unescape('%2C%20aString%0A%09%3Creturn%20self%20+%20aString%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_lf'),
+unescape('__lt'),
 smalltalk.method({
-selector: unescape('lf'),
-category: 'accessing',
-fn: function () {
+selector: unescape('%3C'),
+category: 'comparing',
+fn: function (aString) {
 var self=this;
-return '\n';
+return String(self) < aString._asString();
 return self;},
-args: [],
-source: unescape('lf%0A%09%3Creturn%20%27%5Cn%27%3E'),
+args: ["aString"],
+source: unescape('%3C%20aString%0A%09%3Creturn%20String%28self%29%20%3C%20aString._asString%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_space'),
+unescape('__lt_eq'),
 smalltalk.method({
-selector: unescape('space'),
-category: 'accessing',
-fn: function () {
+selector: unescape('%3C%3D'),
+category: 'comparing',
+fn: function (aString) {
 var self=this;
-return ' ';
+return String(self) <= aString._asString();
 return self;},
-args: [],
-source: unescape('space%0A%09%3Creturn%20%27%20%27%3E'),
+args: ["aString"],
+source: unescape('%3C%3D%20aString%0A%09%3Creturn%20String%28self%29%20%3C%3D%20aString._asString%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_tab'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('tab'),
-category: 'accessing',
-fn: function () {
+selector: unescape('%3D'),
+category: 'comparing',
+fn: function (aString) {
 var self=this;
-return '\t';
-return self;},
-args: [],
-source: unescape('tab%0A%09%3Creturn%20%27%5Ct%27%3E'),
-messageSends: [],
+try{((($receiver = smalltalk.send(smalltalk.send(aString, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
+return String(self) === String(aString);
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}},
+args: ["aString"],
+source: unescape('%3D%20aString%0A%09aString%20class%20%3D%20self%20class%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09%3Creturn%20String%28self%29%20%3D%3D%3D%20String%28aString%29%3E'),
+messageSends: ["ifFalse:", unescape("%3D"), "class"],
 referencedClasses: []
 }),
-smalltalk.String.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_crlf'),
+unescape('__gt'),
 smalltalk.method({
-selector: unescape('crlf'),
-category: 'accessing',
-fn: function () {
+selector: unescape('%3E'),
+category: 'comparing',
+fn: function (aString) {
 var self=this;
-return '\r\n';
+return String(self) > aString._asString();
 return self;},
-args: [],
-source: unescape('crlf%0A%09%3Creturn%20%27%5Cr%5Cn%27%3E'),
+args: ["aString"],
+source: unescape('%3E%20aString%0A%09%3Creturn%20String%28self%29%20%3E%3E%20aString._asString%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_streamContents_'),
+unescape('__gt_eq'),
 smalltalk.method({
-selector: unescape('streamContents%3A'),
-category: 'instance creation',
-fn: function (blockWithArg) {
+selector: unescape('%3E%3D'),
+category: 'comparing',
+fn: function (aString) {
 var self=this;
-var stream=nil;
-(stream=smalltalk.send(smalltalk.send(self, "_streamClass", []), "_on_", [smalltalk.send((smalltalk.String || String), "_new", [])]));
-smalltalk.send(blockWithArg, "_value_", [stream]);
-return smalltalk.send(stream, "_contents", []);
+return String(self) >= aString._asString();
 return self;},
-args: ["blockWithArg"],
-source: unescape('streamContents%3A%20blockWithArg%0A%09%7Cstream%7C%0A%09stream%20%3A%3D%20%28self%20streamClass%20on%3A%20String%20new%29.%0A%09blockWithArg%20value%3A%20stream.%0A%09%5E%20stream%20contents'),
-messageSends: ["on:", "streamClass", "new", "value:", "contents"],
-referencedClasses: ["String"]
+args: ["aString"],
+source: unescape('%3E%3D%20aString%0A%09%3Creturn%20String%28self%29%20%3E%3E%3D%20aString._asString%28%29%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.String.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_value_'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('value%3A'),
-category: 'instance creation',
-fn: function (aUTFCharCode) {
+selector: unescape('asJSON'),
+category: 'converting',
+fn: function (){
 var self=this;
-return String.fromCharCode(aUTFCharCode);;
+return self;
 return self;},
-args: ["aUTFCharCode"],
-source: unescape('value%3A%20aUTFCharCode%0A%0A%09%3Creturn%20String.fromCharCode%28aUTFCharCode%29%3B%3E'),
+args: [],
+source: unescape('asJSON%0A%09%5Eself'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.String.klass);
+smalltalk.String);
 
+smalltalk.addMethod(
+unescape('_asJavaScriptSelector'),
+smalltalk.method({
+selector: unescape('asJavaScriptSelector'),
+category: 'converting',
+fn: function () {
+var self=this;
+return smalltalk.send(smalltalk.send(smalltalk.send(self, "_asSelector", []), "_replace_with_", [unescape("%5E_"), ""]), "_replace_with_", [unescape("_.*"), ""]);
+return self;},
+args: [],
+source: unescape('asJavaScriptSelector%0A%09%5E%28self%20asSelector%20replace%3A%20%27%5E_%27%20with%3A%20%27%27%29%20replace%3A%20%27_.*%27%20with%3A%20%27%27.'),
+messageSends: ["replace:with:", "asSelector"],
+referencedClasses: []
+}),
+smalltalk.String);
 
-smalltalk.addClass('Symbol', smalltalk.CharacterArray, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
+unescape('_asJavascript'),
 smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
-category: 'accessing',
-fn: function (anIndex, aBlock) {
+selector: unescape('asJavascript'),
+category: 'converting',
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_at_ifAbsent_", [anIndex, aBlock]);
+
+		if(self.search(/^[a-zA-Z0-9_:.$ ]*$/) == -1)
+			return "unescape(\"" + escape(self) + "\")";
+		else
+			return "\"" + self + "\"";
+	;
 return self;},
-args: ["anIndex", "aBlock"],
-source: unescape('at%3A%20anIndex%20ifAbsent%3A%20aBlock%0A%09%5Eself%20asString%20at%3A%20anIndex%20ifAbsent%3A%20aBlock'),
-messageSends: ["at:ifAbsent:", "asString"],
+args: [],
+source: unescape('asJavascript%0A%09%3C%0A%09%09if%28self.search%28/%5E%5Ba-zA-Z0-9_%3A.%24%20%5D*%24/%29%20%3D%3D%20-1%29%0A%09%09%09return%20%22unescape%28%5C%22%22%20+%20escape%28self%29%20+%20%22%5C%22%29%22%3B%0A%09%09else%0A%09%09%09return%20%22%5C%22%22%20+%20self%20+%20%22%5C%22%22%3B%0A%09%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_asLowercase'),
 smalltalk.method({
-selector: unescape('asString'),
+selector: unescape('asLowercase'),
 category: 'converting',
 fn: function () {
 var self=this;
-return self.value;
+return self.toLowerCase();
 return self;},
 args: [],
-source: unescape('asString%0A%09%3Creturn%20self.value%3E'),
+source: unescape('asLowercase%0A%09%3Creturn%20self.toLowerCase%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_asNumber'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
+selector: unescape('asNumber'),
+category: 'converting',
 fn: function () {
 var self=this;
-return smalltalk.send(unescape("%23"), "__comma", [smalltalk.send(self, "_asString", [])]);
+return Number(self);
 return self;},
 args: [],
-source: unescape('printString%0A%09%5E%27%23%27%2C%20self%20asString'),
-messageSends: [unescape("%2C"), "asString"],
+source: unescape('asNumber%0A%09%3Creturn%20Number%28self%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_asSelector'),
 smalltalk.method({
-selector: unescape('size'),
-category: 'accessing',
+selector: unescape('asSelector'),
+category: 'converting',
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_size", []);
+var selector=nil;
+(selector=smalltalk.send("_", "__comma", [self]));
+(selector=smalltalk.send(selector, "_replace_with_", [":", "_"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B+%5D"), "_plus"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("-"), "_minus"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B*%5D"), "_star"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B/%5D"), "_slash"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3E"), "_gt"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3C"), "_lt"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%3D"), "_eq"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%2C"), "_comma"]));
+(selector=smalltalk.send(selector, "_replace_with_", [unescape("%5B@%5D"), "_at"]));
+return selector;
 return self;},
 args: [],
-source: unescape('size%0A%09%5Eself%20asString%20size'),
-messageSends: ["size", "asString"],
+source: unescape('asSelector%0A%09%22If%20you%20change%20this%20method%2C%20change%20smalltalk.convertSelector%20too%20%28see%20js/boot.js%20file%29%22%0A%0A%09%7C%20selector%20%7C%0A%09selector%20%3A%3D%20%27_%27%2C%20self.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%3A%27%20with%3A%20%27_%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B+%5D%27%20with%3A%20%27_plus%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27-%27%20with%3A%20%27_minus%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B*%5D%27%20with%3A%20%27_star%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B/%5D%27%20with%3A%20%27_slash%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%3E%27%20with%3A%20%27_gt%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%3C%27%20with%3A%20%27_lt%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%3D%27%20with%3A%20%27_eq%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%2C%27%20with%3A%20%27_comma%27.%0A%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B@%5D%27%20with%3A%20%27_at%27.%0A%09%5Eselector'),
+messageSends: [unescape("%2C"), "replace:with:"],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asSymbol'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('asSymbol'),
+selector: unescape('asString'),
 category: 'converting',
 fn: function () {
 var self=this;
 return self;
 return self;},
 args: [],
-source: unescape('asSymbol%0A%09%5Eself'),
+source: unescape('asString%0A%09%5Eself'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_copyFrom_to_'),
+unescape('_asSymbol'),
 smalltalk.method({
-selector: unescape('copyFrom%3Ato%3A'),
-category: 'copying',
-fn: function (anIndex, anotherIndex) {
+selector: unescape('asSymbol'),
+category: 'converting',
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_copyFrom_to_", [anIndex, anotherIndex])]);
+return smalltalk.send((smalltalk.Symbol || Symbol), "_lookup_", [self]);
 return self;},
-args: ["anIndex", "anotherIndex"],
-source: unescape('copyFrom%3A%20anIndex%20to%3A%20anotherIndex%0A%09%5Eself%20class%20fromString%3A%20%28self%20asString%20copyFrom%3A%20anIndex%20to%3A%20anotherIndex%29'),
-messageSends: ["fromString:", "class", "copyFrom:to:", "asString"],
-referencedClasses: []
+args: [],
+source: unescape('asSymbol%0A%09%5ESymbol%20lookup%3A%20self'),
+messageSends: ["lookup:"],
+referencedClasses: ["Symbol"]
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_asUppercase'),
 smalltalk.method({
-selector: unescape('deepCopy'),
-category: 'copying',
+selector: unescape('asUppercase'),
+category: 'converting',
 fn: function () {
 var self=this;
-return self;
+return self.toUpperCase();
 return self;},
 args: [],
-source: unescape('deepCopy%0A%09%5Eself'),
+source: unescape('asUppercase%0A%09%3Creturn%20self.toUpperCase%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('__lt'),
+unescape('_asciiValue'),
 smalltalk.method({
-selector: unescape('%3C'),
-category: 'comparing',
-fn: function (aSymbol) {
+selector: unescape('asciiValue'),
+category: 'accessing',
+fn: function () {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(aSymbol, "_asString", [])]));
+return self.charCodeAt(0);;
 return self;},
-args: ["aSymbol"],
-source: unescape('%3C%20aSymbol%0A%09%5Eself%20asString%20%3C%20aSymbol%20asString'),
-messageSends: [unescape("%3C"), "asString"],
+args: [],
+source: unescape('asciiValue%0A%09%3Creturn%20self.charCodeAt%280%29%3B%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('__lt_eq'),
+unescape('_at_ifAbsent_'),
 smalltalk.method({
-selector: unescape('%3C%3D'),
-category: 'comparing',
-fn: function (aSymbol) {
+selector: unescape('at%3AifAbsent%3A'),
+category: 'accessing',
+fn: function (anIndex, aBlock) {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(aSymbol, "_asString", [])]));
+return self[anIndex - 1] || aBlock();
 return self;},
-args: ["aSymbol"],
-source: unescape('%3C%3D%20aSymbol%0A%09%5Eself%20asString%20%3C%3D%20aSymbol%20asString'),
-messageSends: [unescape("%3C%3D"), "asString"],
+args: ["anIndex", "aBlock"],
+source: unescape('at%3A%20anIndex%20ifAbsent%3A%20aBlock%0A%09%3Creturn%20self%5BanIndex%20-%201%5D%20%7C%7C%20aBlock%28%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('__gt_eq'),
+unescape('_copyFrom_to_'),
 smalltalk.method({
-selector: unescape('%3E%3D'),
-category: 'comparing',
-fn: function (aSymbol) {
+selector: unescape('copyFrom%3Ato%3A'),
+category: 'copying',
+fn: function (anIndex, anotherIndex) {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver >=smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__gt_eq", [smalltalk.send(aSymbol, "_asString", [])]));
+return self.substring(anIndex - 1, anotherIndex);
 return self;},
-args: ["aSymbol"],
-source: unescape('%3E%3D%20aSymbol%0A%09%5Eself%20asString%20%3E%3D%20aSymbol%20asString'),
-messageSends: [unescape("%3E%3D"), "asString"],
-referencedClasses: []
-}),
-smalltalk.Symbol);
-
-smalltalk.addMethod(
-unescape('__eq'),
-smalltalk.method({
-selector: unescape('%3D'),
-category: 'comparing',
-fn: function (aSymbol) {
-var self=this;
-try{((($receiver = smalltalk.send(smalltalk.send(aSymbol, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
-(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return smalltalk.send(smalltalk.send(self, "_asString", []), "__eq", [smalltalk.send(aSymbol, "_asString", [])])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}},
-args: ["aSymbol"],
-source: unescape('%3D%20aSymbol%0A%09aSymbol%20class%20%3D%20self%20class%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09%5Eself%20asString%20%3D%20aSymbol%20asString'),
-messageSends: ["ifFalse:", unescape("%3D"), "class", "asString"],
+args: ["anIndex", "anotherIndex"],
+source: unescape('copyFrom%3A%20anIndex%20to%3A%20anotherIndex%0A%09%3Creturn%20self.substring%28anIndex%20-%201%2C%20anotherIndex%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_isSymbol'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('isSymbol'),
-category: 'printing',
+selector: unescape('deepCopy'),
+category: 'copying',
 fn: function () {
 var self=this;
-return true;
+return smalltalk.send(self, "_shallowCopy", []);
 return self;},
 args: [],
-source: unescape('isSymbol%0A%09%5Etrue'),
-messageSends: [],
+source: unescape('deepCopy%0A%09%5Eself%20shallowCopy'),
+messageSends: ["shallowCopy"],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_escaped'),
 smalltalk.method({
-selector: unescape('asJavascript'),
-category: 'converting',
+selector: unescape('escaped'),
+category: 'accessing',
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(unescape("smalltalk.symbolFor%28%22"), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%22%29")]);
+return escape(self);
 return self;},
 args: [],
-source: unescape('asJavascript%0A%09%5E%27smalltalk.symbolFor%28%22%27%2C%20self%20asString%2C%20%27%22%29%27'),
-messageSends: [unescape("%2C"), "asString"],
+source: unescape('escaped%0A%09%3Creturn%20escape%28self%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('__gt'),
+unescape('_includesSubString_'),
 smalltalk.method({
-selector: unescape('%3E'),
-category: 'comparing',
-fn: function (aSymbol) {
+selector: unescape('includesSubString%3A'),
+category: 'testing',
+fn: function (subString) {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver >smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__gt", [smalltalk.send(aSymbol, "_asString", [])]));
+ return self.indexOf(subString) != -1 ;
 return self;},
-args: ["aSymbol"],
-source: unescape('%3E%20aSymbol%0A%09%5Eself%20asString%20%3E%20aSymbol%20asString'),
-messageSends: [unescape("%3E"), "asString"],
+args: ["subString"],
+source: unescape('includesSubString%3A%20subString%0A%09%3C%20return%20self.indexOf%28subString%29%20%21%3D%20-1%20%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_isString'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
-category: 'copying',
+selector: unescape('isString'),
+category: 'testing',
 fn: function () {
 var self=this;
-return self;
+return true;
 return self;},
 args: [],
-source: unescape('shallowCopy%0A%09%5Eself'),
+source: unescape('isString%0A%09%5Etrue'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asSelector'),
+unescape('_join_'),
 smalltalk.method({
-selector: unescape('asSelector'),
-category: 'converting',
-fn: function () {
+selector: unescape('join%3A'),
+category: 'split join',
+fn: function (aCollection) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_asSelector", []);
+return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(stream){return smalltalk.send(aCollection, "_do_separatedBy_", [(function(each){return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(each, "_asString", [])]);}), (function(){return smalltalk.send(stream, "_nextPutAll_", [self]);})]);})]);
 return self;},
-args: [],
-source: unescape('asSelector%0A%09%5Eself%20asString%20asSelector'),
-messageSends: ["asSelector", "asString"],
-referencedClasses: []
+args: ["aCollection"],
+source: unescape('join%3A%20aCollection%20%0A%09%5E%20String%0A%09%09streamContents%3A%20%5B%3Astream%20%7C%20aCollection%0A%09%09%09%09do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%20asString%5D%20%0A%09%09%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20self%5D%5D'),
+messageSends: ["streamContents:", "do:separatedBy:", "nextPutAll:", "asString"],
+referencedClasses: ["String"]
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_lineIndicesDo_'),
 smalltalk.method({
-selector: unescape('asJSON'),
-category: 'converting',
-fn: function (){
+selector: unescape('lineIndicesDo%3A'),
+category: 'split join',
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asString", []), "_asJSON", []);
-return self;},
-args: [],
-source: unescape('asJSON%0A%09%5Eself%20asString%20asJSON'),
-messageSends: ["asJSON", "asString"],
-referencedClasses: []
+try{var cr=nil;
+var lf=nil;
+var start=nil;
+var sz=nil;
+var nextLF=nil;
+var nextCR=nil;
+(start=(1));
+(sz=smalltalk.send(self, "_size", []));
+(cr=smalltalk.send((smalltalk.String || String), "_cr", []));
+(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, (1)]));
+(lf=smalltalk.send((smalltalk.String || String), "_lf", []));
+(nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, (1)]));
+(function(){while((function(){return ((($receiver = start).klass === smalltalk.Number) ? $receiver <=sz : smalltalk.send($receiver, "__lt_eq", [sz]));})()) {(function(){((($receiver = smalltalk.send(smalltalk.send(nextLF, "__eq", [(0)]), "_and_", [(function(){return smalltalk.send(nextCR, "__eq", [(0)]);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, sz, sz]);return (function(){throw({name: 'stReturn', selector: '_lineIndicesDo_', fn: function(){return self}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, sz, sz]);return (function(){throw({name: 'stReturn', selector: '_lineIndicesDo_', fn: function(){return self}})})();})]));return ((($receiver = smalltalk.send(smalltalk.send(nextCR, "__eq", [(0)]), "_or_", [(function(){return smalltalk.send((0) < nextLF, "_and_", [(function(){return ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver <nextCR : smalltalk.send($receiver, "__lt", [nextCR]));})]);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){return ((($receiver = smalltalk.send((1) + nextCR, "__eq", [nextLF])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextLF).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){return ((($receiver = smalltalk.send((1) + nextCR, "__eq", [nextLF])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));})() : (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextLF]);(start=(1) + nextLF);(nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));return (nextLF=smalltalk.send(self, "_indexOf_startingAt_", [lf, start]));}), (function(){smalltalk.send(aBlock, "_value_value_value_", [start, ((($receiver = nextCR).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)])), nextCR]);(start=(1) + nextCR);return (nextCR=smalltalk.send(self, "_indexOf_startingAt_", [cr, start]));})]));})]));})()}})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_lineIndicesDo_'){return e.fn()} throw(e)}},
+args: ["aBlock"],
+source: unescape('lineIndicesDo%3A%20aBlock%0A%09%22execute%20aBlock%20with%203%20arguments%20for%20each%20line%3A%0A%09-%20start%20index%20of%20line%0A%09-%20end%20index%20of%20line%20without%20line%20delimiter%0A%09-%20end%20index%20of%20line%20including%20line%20delimiter%28s%29%20CR%2C%20LF%20or%20CRLF%22%0A%09%0A%09%7C%20cr%20lf%20start%20sz%20nextLF%20nextCR%20%7C%0A%09start%20%3A%3D%201.%0A%09sz%20%3A%3D%20self%20size.%0A%09cr%20%3A%3D%20String%20cr.%0A%09nextCR%20%3A%3D%20self%20indexOf%3A%20cr%20startingAt%3A%201.%0A%09lf%20%3A%3D%20String%20lf.%0A%09nextLF%20%3A%3D%20self%20indexOf%3A%20lf%20startingAt%3A%201.%0A%09%5B%20start%20%3C%3D%20sz%20%5D%20whileTrue%3A%20%5B%0A%09%09%28nextLF%20%3D%200%20and%3A%20%5B%20nextCR%20%3D%200%20%5D%29%0A%09%09%09ifTrue%3A%20%5B%20%22No%20more%20CR%2C%20nor%20LF%2C%20the%20string%20is%20over%22%0A%09%09%09%09%09aBlock%20value%3A%20start%20value%3A%20sz%20value%3A%20sz.%0A%09%09%09%09%09%5Eself%20%5D.%0A%09%09%28nextCR%20%3D%200%20or%3A%20%5B%200%20%3C%20nextLF%20and%3A%20%5B%20nextLF%20%3C%20nextCR%20%5D%20%5D%29%0A%09%09%09ifTrue%3A%20%5B%20%22Found%20a%20LF%22%0A%09%09%09%09%09aBlock%20value%3A%20start%20value%3A%20nextLF%20-%201%20value%3A%20nextLF.%0A%09%09%09%09%09start%20%3A%3D%201%20+%20nextLF.%0A%09%09%09%09%09nextLF%20%3A%3D%20self%20indexOf%3A%20lf%20startingAt%3A%20start%20%5D%0A%09%09%09ifFalse%3A%20%5B%201%20+%20nextCR%20%3D%20nextLF%0A%09%09%09%09ifTrue%3A%20%5B%20%22Found%20a%20CR-LF%20pair%22%0A%09%09%09%09%09aBlock%20value%3A%20start%20value%3A%20nextCR%20-%201%20value%3A%20nextLF.%0A%09%09%09%09%09start%20%3A%3D%201%20+%20nextLF.%0A%09%09%09%09%09nextCR%20%3A%3D%20self%20indexOf%3A%20cr%20startingAt%3A%20start.%0A%09%09%09%09%09nextLF%20%3A%3D%20self%20indexOf%3A%20lf%20startingAt%3A%20start%20%5D%0A%09%09%09%09ifFalse%3A%20%5B%20%22Found%20a%20CR%22%0A%09%09%09%09%09aBlock%20value%3A%20start%20value%3A%20nextCR%20-%201%20value%3A%20nextCR.%0A%09%09%09%09%09start%20%3A%3D%201%20+%20nextCR.%0A%09%09%09%09%09nextCR%20%3A%3D%20self%20indexOf%3A%20cr%20startingAt%3A%20start%20%5D%5D%5D'),
+messageSends: ["size", "cr", "indexOf:startingAt:", "lf", "whileTrue:", unescape("%3C%3D"), "ifTrue:", "and:", unescape("%3D"), "value:value:value:", "ifTrue:ifFalse:", "or:", unescape("%3C"), unescape("-"), unescape("+")],
+referencedClasses: ["String"]
 }),
-smalltalk.Symbol);
-
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_lookup_'),
+unescape('_lineNumber_'),
 smalltalk.method({
-selector: unescape('lookup%3A'),
-category: 'instance creation',
-fn: function (aString) {
+selector: unescape('lineNumber%3A'),
+category: 'split join',
+fn: function (anIndex) {
 var self=this;
-return smalltalk.symbolFor(aString);;
-return self;},
-args: ["aString"],
-source: unescape('lookup%3A%20aString%0A%09%3Creturn%20smalltalk.symbolFor%28aString%29%3B%3E'),
-messageSends: [],
+try{var lineCount=nil;
+(lineCount=(0));
+smalltalk.send(self, "_lineIndicesDo_", [(function(start, endWithoutDelimiters, end){return ((($receiver = smalltalk.send((lineCount=((($receiver = lineCount).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))), "__eq", [anIndex])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])}})})();})]));})]);
+(function(){throw({name: 'stReturn', selector: '_lineNumber_', fn: function(){return nil}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_lineNumber_'){return e.fn()} throw(e)}},
+args: ["anIndex"],
+source: unescape('lineNumber%3A%20anIndex%0A%09%22Answer%20a%20string%20containing%20the%20characters%20in%20the%20given%20line%20number.%22%0A%0A%09%7C%20lineCount%20%7C%0A%09lineCount%20%3A%3D%200.%0A%09self%20lineIndicesDo%3A%20%5B%3Astart%20%3AendWithoutDelimiters%20%3Aend%20%7C%0A%09%09%28lineCount%20%3A%3D%20lineCount%20+%201%29%20%3D%20anIndex%20ifTrue%3A%20%5B%5Eself%20copyFrom%3A%20start%20to%3A%20endWithoutDelimiters%5D%5D.%0A%09%5Enil'),
+messageSends: ["lineIndicesDo:", "ifTrue:", unescape("%3D"), unescape("+"), "copyFrom:to:"],
 referencedClasses: []
 }),
-smalltalk.Symbol.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_basicNew'),
+unescape('_lines'),
 smalltalk.method({
-selector: unescape('basicNew'),
-category: 'instance creation',
+selector: unescape('lines'),
+category: 'split join',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+var lines=nil;
+(lines=smalltalk.send((smalltalk.Array || Array), "_new", []));
+smalltalk.send(self, "_linesDo_", [(function(aLine){return smalltalk.send(lines, "_add_", [aLine]);})]);
+return lines;
 return self;},
 args: [],
-source: unescape('basicNew%0A%09self%20shouldNotImplement'),
-messageSends: ["shouldNotImplement"],
-referencedClasses: []
+source: unescape('lines%0A%09%22Answer%20an%20array%20of%20lines%20composing%20this%20receiver%20without%20the%20line%20ending%20delimiters.%22%0A%0A%09%7C%20lines%20%7C%0A%09lines%20%3A%3D%20Array%20new.%0A%09self%20linesDo%3A%20%5B%3AaLine%20%7C%20lines%20add%3A%20aLine%5D.%0A%09%5Elines'),
+messageSends: ["new", "linesDo:", "add:"],
+referencedClasses: ["Array"]
 }),
-smalltalk.Symbol.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_fromString_'),
+unescape('_linesDo_'),
 smalltalk.method({
-selector: unescape('fromString%3A'),
-category: 'instance creation',
-fn: function (aString) {
+selector: unescape('linesDo%3A'),
+category: 'split join',
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(self, "_lookup_", [aString]);
+smalltalk.send(self, "_lineIndicesDo_", [(function(start, endWithoutDelimiters, end){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_copyFrom_to_", [start, endWithoutDelimiters])]);})]);
 return self;},
-args: ["aString"],
-source: unescape('fromString%3A%20aString%0A%09%5Eself%20lookup%3A%20aString'),
-messageSends: ["lookup:"],
+args: ["aBlock"],
+source: unescape('linesDo%3A%20aBlock%0A%09%22Execute%20aBlock%20with%20each%20line%20in%20this%20string.%20The%20terminating%20line%0A%09delimiters%20CR%2C%20LF%20or%20CRLF%20pairs%20are%20not%20included%20in%20what%20is%20passed%20to%20aBlock%22%0A%0A%09self%20lineIndicesDo%3A%20%5B%3Astart%20%3AendWithoutDelimiters%20%3Aend%20%7C%0A%09%09aBlock%20value%3A%20%28self%20copyFrom%3A%20start%20to%3A%20endWithoutDelimiters%29%5D'),
+messageSends: ["lineIndicesDo:", "value:", "copyFrom:to:"],
 referencedClasses: []
 }),
-smalltalk.Symbol.klass);
-
+smalltalk.String);
 
-smalltalk.addClass('Array', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_match_'),
 smalltalk.method({
-selector: unescape('size'),
-category: 'accessing',
-fn: function () {
+selector: unescape('match%3A'),
+category: 'regular expressions',
+fn: function (aRegexp) {
 var self=this;
-return self.length;
+return self.search(aRegexp) != -1;
 return self;},
-args: [],
-source: unescape('size%0A%09%3Creturn%20self.length%3E'),
+args: ["aRegexp"],
+source: unescape('match%3A%20aRegexp%0A%09%3Creturn%20self.search%28aRegexp%29%20%21%3D%20-1%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_printNl'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-category: 'accessing',
-fn: function (anIndex, anObject) {
+selector: unescape('printNl'),
+category: 'printing',
+fn: function () {
 var self=this;
-return self[anIndex - 1] = anObject;
+console.log(self);
 return self;},
-args: ["anIndex", "anObject"],
-source: unescape('at%3A%20anIndex%20put%3A%20anObject%0A%09%3Creturn%20self%5BanIndex%20-%201%5D%20%3D%20anObject%3E'),
+args: [],
+source: unescape('printNl%0A%09%3Cconsole.log%28self%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
-category: 'accessing',
-fn: function (anIndex, aBlock) {
+selector: unescape('printString'),
+category: 'printing',
+fn: function () {
 var self=this;
-
-	    var value = self[anIndex - 1];
-	    if(value === undefined) {
-		return aBlock();
-	    } else {
-		return value;
-	    }
-	;
+return smalltalk.send(smalltalk.send(unescape("%27"), "__comma", [self]), "__comma", [unescape("%27")]);
 return self;},
-args: ["anIndex", "aBlock"],
-source: unescape('at%3A%20anIndex%20ifAbsent%3A%20aBlock%0A%09%3C%0A%09%20%20%20%20var%20value%20%3D%20self%5BanIndex%20-%201%5D%3B%0A%09%20%20%20%20if%28value%20%3D%3D%3D%20undefined%29%20%7B%0A%09%09return%20aBlock%28%29%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20value%3B%0A%09%20%20%20%20%7D%0A%09%3E'),
-messageSends: [],
+args: [],
+source: unescape('printString%0A%09%5E%27%27%27%27%2C%20self%2C%20%27%27%27%27'),
+messageSends: [unescape("%2C")],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_add_'),
+unescape('_replace_with_'),
 smalltalk.method({
-selector: unescape('add%3A'),
-category: 'adding/removing',
-fn: function (anObject) {
+selector: unescape('replace%3Awith%3A'),
+category: 'regular expressions',
+fn: function (aString, anotherString) {
 var self=this;
-self.push(anObject); return anObject;;
+return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [aString, "g"]), anotherString]);
 return self;},
-args: ["anObject"],
-source: unescape('add%3A%20anObject%0A%09%3Cself.push%28anObject%29%3B%20return%20anObject%3B%3E'),
-messageSends: [],
-referencedClasses: []
+args: ["aString", "anotherString"],
+source: unescape('replace%3A%20aString%20with%3A%20anotherString%0A%09%5Eself%20replaceRegexp%3A%20%28RegularExpression%20fromString%3A%20aString%20flag%3A%20%27g%27%29%20with%3A%20anotherString'),
+messageSends: ["replaceRegexp:with:", "fromString:flag:"],
+referencedClasses: ["RegularExpression"]
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_join_'),
+unescape('_replaceRegexp_with_'),
 smalltalk.method({
-selector: unescape('join%3A'),
-category: 'enumerating',
-fn: function (aString) {
+selector: unescape('replaceRegexp%3Awith%3A'),
+category: 'regular expressions',
+fn: function (aRegexp, aString) {
 var self=this;
-return self.join(aString);
+return self.replace(aRegexp, aString);
 return self;},
-args: ["aString"],
-source: unescape('join%3A%20aString%0A%09%3Creturn%20self.join%28aString%29%3E'),
+args: ["aRegexp", "aString"],
+source: unescape('replaceRegexp%3A%20aRegexp%20with%3A%20aString%0A%09%3Creturn%20self.replace%28aRegexp%2C%20aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_reversed'),
 smalltalk.method({
-selector: unescape('asJavascript'),
+selector: unescape('reversed'),
 category: 'converting',
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [smalltalk.send(smalltalk.send(self, "_collect_", [(function(each){return smalltalk.send(each, "_asJavascript", []);})]), "_join_", [unescape("%2C%20")])]), "__comma", [unescape("%5D")]);
+return self.split("").reverse().join("");
 return self;},
 args: [],
-source: unescape('asJavascript%0A%09%5E%27%5B%27%2C%20%28%28self%20collect%3A%20%5B%3Aeach%20%7C%20each%20asJavascript%5D%29%20join%3A%20%27%2C%20%27%29%2C%20%20%27%5D%27'),
-messageSends: [unescape("%2C"), "join:", "collect:", "asJavascript"],
+source: unescape('reversed%0A%09%3Creturn%20self.split%28%22%22%29.reverse%28%29.join%28%22%22%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_sort'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('sort'),
-category: 'enumerating',
+selector: unescape('shallowCopy'),
+category: 'copying',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_basicPerform_", ["sort"]);
+return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [self]);
 return self;},
 args: [],
-source: unescape('sort%0A%20%20%20%20%5Eself%20basicPerform%3A%20%27sort%27'),
-messageSends: ["basicPerform:"],
+source: unescape('shallowCopy%0A%09%5Eself%20class%20fromString%3A%20self'),
+messageSends: ["fromString:", "class"],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_sort_'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('sort%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
+selector: unescape('size'),
+category: 'accessing',
+fn: function () {
 var self=this;
-
-		return self.sort(function(a, b) {
-			if(aBlock(a,b)) {return -1} else {return 1}
-		})
-	;
+return self.length;
 return self;},
-args: ["aBlock"],
-source: unescape('sort%3A%20aBlock%0A%09%3C%0A%09%09return%20self.sort%28function%28a%2C%20b%29%20%7B%0A%09%09%09if%28aBlock%28a%2Cb%29%29%20%7Breturn%20-1%7D%20else%20%7Breturn%201%7D%0A%09%09%7D%29%0A%09%3E'),
+args: [],
+source: unescape('size%0A%09%3Creturn%20self.length%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_remove_'),
+unescape('_tokenize_'),
 smalltalk.method({
-selector: unescape('remove%3A'),
-category: 'adding/removing',
-fn: function (anObject) {
+selector: unescape('tokenize%3A'),
+category: 'converting',
+fn: function (aString) {
 var self=this;
-
-		for(var i=0;i<self.length;i++) {
-			if(self[i] == anObject) {
-				self.splice(i,1);
-				break;
-			}
-		}
-	;
+return self.split(aString);
 return self;},
-args: ["anObject"],
-source: unescape('remove%3A%20anObject%0A%09%3C%0A%09%09for%28var%20i%3D0%3Bi%3Cself.length%3Bi++%29%20%7B%0A%09%09%09if%28self%5Bi%5D%20%3D%3D%20anObject%29%20%7B%0A%09%09%09%09self.splice%28i%2C1%29%3B%0A%09%09%09%09break%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%3E'),
+args: ["aString"],
+source: unescape('tokenize%3A%20aString%0A%09%3Creturn%20self.split%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_sorted'),
+unescape('_trimBoth'),
 smalltalk.method({
-selector: unescape('sorted'),
-category: 'enumerating',
+selector: unescape('trimBoth'),
+category: 'regular expressions',
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort", []);
+return smalltalk.send(self, "_trimBoth_", [unescape("%5Cs")]);
 return self;},
 args: [],
-source: unescape('sorted%0A%09%5Eself%20copy%20sort'),
-messageSends: ["sort", "copy"],
-referencedClasses: []
-}),
-smalltalk.Array);
-
-smalltalk.addMethod(
-unescape('_sorted_'),
-smalltalk.method({
-selector: unescape('sorted%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
-var self=this;
-return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort_", [aBlock]);
-return self;},
-args: ["aBlock"],
-source: unescape('sorted%3A%20aBlock%0A%09%5Eself%20copy%20sort%3A%20aBlock'),
-messageSends: ["sort:", "copy"],
-referencedClasses: []
-}),
-smalltalk.Array);
-
-smalltalk.addMethod(
-unescape('_removeFrom_to_'),
-smalltalk.method({
-selector: unescape('removeFrom%3Ato%3A'),
-category: 'adding/removing',
-fn: function (aNumber, anotherNumber) {
-var self=this;
-self.splice(aNumber - 1,anotherNumber - 1);
-return self;},
-args: ["aNumber", "anotherNumber"],
-source: unescape('removeFrom%3A%20aNumber%20to%3A%20anotherNumber%0A%09%3Cself.splice%28aNumber%20-%201%2CanotherNumber%20-%201%29%3E'),
-messageSends: [],
+source: unescape('trimBoth%0A%09%5Eself%20trimBoth%3A%20%27%5Cs%27'),
+messageSends: ["trimBoth:"],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_reversed'),
+unescape('_trimBoth_'),
 smalltalk.method({
-selector: unescape('reversed'),
-category: 'converting',
-fn: function () {
+selector: unescape('trimBoth%3A'),
+category: 'regular expressions',
+fn: function (separators) {
 var self=this;
-return self._copy().reverse();
+return smalltalk.send(smalltalk.send(self, "_trimLeft_", [separators]), "_trimRight_", [separators]);
 return self;},
-args: [],
-source: unescape('reversed%0A%09%3Creturn%20self._copy%28%29.reverse%28%29%3E'),
-messageSends: [],
+args: ["separators"],
+source: unescape('trimBoth%3A%20separators%0A%0A%09%5E%28self%20trimLeft%3A%20separators%29%20trimRight%3A%20separators'),
+messageSends: ["trimRight:", "trimLeft:"],
 referencedClasses: []
 }),
-smalltalk.Array);
-
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_new_'),
+unescape('_trimLeft'),
 smalltalk.method({
-selector: unescape('new%3A'),
-category: 'instance creation',
-fn: function (anInteger) {
+selector: unescape('trimLeft'),
+category: 'regular expressions',
+fn: function () {
 var self=this;
-return new Array(anInteger);
+return smalltalk.send(self, "_trimLeft_", [unescape("%5Cs")]);
 return self;},
-args: ["anInteger"],
-source: unescape('new%3A%20anInteger%0A%09%3Creturn%20new%20Array%28anInteger%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('trimLeft%0A%09%5Eself%20trimLeft%3A%20%27%5Cs%27'),
+messageSends: ["trimLeft:"],
 referencedClasses: []
 }),
-smalltalk.Array.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_with_'),
+unescape('_trimLeft_'),
 smalltalk.method({
-selector: unescape('with%3A'),
-category: 'instance creation',
-fn: function (anObject) {
+selector: unescape('trimLeft%3A'),
+category: 'regular expressions',
+fn: function (separators) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(1)]));
+return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [smalltalk.send(smalltalk.send(unescape("%5E%5B"), "__comma", [separators]), "__comma", [unescape("%5D+")]), "g"]), ""]);
 return self;},
-args: ["anObject"],
-source: unescape('with%3A%20anObject%0A%09%20%20%20%20%5E%28self%20new%3A%201%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09yourself'),
-messageSends: ["at:put:", "yourself", "new:"],
-referencedClasses: []
+args: ["separators"],
+source: unescape('trimLeft%3A%20separators%0A%0A%09%5Eself%20replaceRegexp%3A%20%28RegularExpression%20fromString%3A%20%27%5E%5B%27%2C%20separators%2C%20%27%5D+%27%20flag%3A%20%27g%27%29%20with%3A%20%27%27'),
+messageSends: ["replaceRegexp:with:", "fromString:flag:", unescape("%2C")],
+referencedClasses: ["RegularExpression"]
 }),
-smalltalk.Array.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_with_with_'),
+unescape('_trimRight'),
 smalltalk.method({
-selector: unescape('with%3Awith%3A'),
-category: 'instance creation',
-fn: function (anObject, anObject2) {
+selector: unescape('trimRight'),
+category: 'regular expressions',
+fn: function () {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(2)]));
+return smalltalk.send(self, "_trimRight_", [unescape("%5Cs")]);
 return self;},
-args: ["anObject", "anObject2"],
-source: unescape('with%3A%20anObject%20with%3A%20anObject2%0A%09%20%20%20%20%5E%28self%20new%3A%202%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09at%3A%202%20put%3A%20anObject2%3B%0A%09%09yourself'),
-messageSends: ["at:put:", "yourself", "new:"],
+args: [],
+source: unescape('trimRight%0A%09%5Eself%20trimRight%3A%20%27%5Cs%27'),
+messageSends: ["trimRight:"],
 referencedClasses: []
 }),
-smalltalk.Array.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_with_with_with_'),
+unescape('_trimRight_'),
 smalltalk.method({
-selector: unescape('with%3Awith%3Awith%3A'),
-category: 'instance creation',
-fn: function (anObject, anObject2, anObject3) {
+selector: unescape('trimRight%3A'),
+category: 'regular expressions',
+fn: function (separators) {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);smalltalk.send($rec, "_at_put_", [(3), anObject3]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(3)]));
+return smalltalk.send(self, "_replaceRegexp_with_", [smalltalk.send((smalltalk.RegularExpression || RegularExpression), "_fromString_flag_", [smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [separators]), "__comma", [unescape("%5D+%24")]), "g"]), ""]);
 return self;},
-args: ["anObject", "anObject2", "anObject3"],
-source: unescape('with%3A%20anObject%20with%3A%20anObject2%20with%3A%20anObject3%0A%09%20%20%20%20%5E%28self%20new%3A%203%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09at%3A%202%20put%3A%20anObject2%3B%0A%09%09at%3A%203%20put%3A%20anObject3%3B%0A%09%09yourself'),
-messageSends: ["at:put:", "yourself", "new:"],
-referencedClasses: []
+args: ["separators"],
+source: unescape('trimRight%3A%20separators%0A%0A%09%5Eself%20replaceRegexp%3A%20%28RegularExpression%20fromString%3A%20%27%5B%27%2C%20separators%2C%20%27%5D+%24%27%20flag%3A%20%27g%27%29%20with%3A%20%27%27'),
+messageSends: ["replaceRegexp:with:", "fromString:flag:", unescape("%2C")],
+referencedClasses: ["RegularExpression"]
 }),
-smalltalk.Array.klass);
+smalltalk.String);
 
 smalltalk.addMethod(
-unescape('_withAll_'),
+unescape('_unescaped'),
 smalltalk.method({
-selector: unescape('withAll%3A'),
-category: 'instance creation',
-fn: function (aCollection) {
+selector: unescape('unescaped'),
+category: 'accessing',
+fn: function () {
 var self=this;
-var instance=nil;
-(instance=smalltalk.send(self, "_new_", [smalltalk.send(aCollection, "_size", [])]));
-smalltalk.send(aCollection, "_withIndexDo_", [(function(each, index){return smalltalk.send(instance, "_at_put_", [index, each]);})]);
-return instance;
+return unescape(self);
 return self;},
-args: ["aCollection"],
-source: unescape('withAll%3A%20aCollection%0A%09%7C%20instance%20%7C%0A%09instance%20%3A%3D%20self%20new%3A%20aCollection%20size.%0A%09aCollection%20withIndexDo%3A%20%5B%3Aeach%20%3Aindex%20%20%7C%0A%09%09instance%20at%3A%20index%20put%3A%20each%5D.%0A%09%5Einstance'),
-messageSends: ["new:", "size", "withIndexDo:", "at:put:"],
+args: [],
+source: unescape('unescaped%0A%09%3Creturn%20unescape%28self%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array.klass);
+smalltalk.String);
 
 
-smalltalk.addClass('Array', smalltalk.SequenceableCollection, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_cr'),
 smalltalk.method({
-selector: unescape('size'),
+selector: unescape('cr'),
 category: 'accessing',
 fn: function () {
 var self=this;
-return self.length;
+return '\r';
 return self;},
 args: [],
-source: unescape('size%0A%09%3Creturn%20self.length%3E'),
+source: unescape('cr%0A%09%3Creturn%20%27%5Cr%27%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_crlf'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
+selector: unescape('crlf'),
 category: 'accessing',
-fn: function (anIndex, anObject) {
+fn: function () {
 var self=this;
-return self[anIndex - 1] = anObject;
+return '\r\n';
 return self;},
-args: ["anIndex", "anObject"],
-source: unescape('at%3A%20anIndex%20put%3A%20anObject%0A%09%3Creturn%20self%5BanIndex%20-%201%5D%20%3D%20anObject%3E'),
+args: [],
+source: unescape('crlf%0A%09%3Creturn%20%27%5Cr%5Cn%27%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
+unescape('_fromString_'),
 smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
-category: 'accessing',
-fn: function (anIndex, aBlock) {
+selector: unescape('fromString%3A'),
+category: 'instance creation',
+fn: function (aString) {
 var self=this;
-
-	    var value = self[anIndex - 1];
-	    if(value === undefined) {
-		return aBlock();
-	    } else {
-		return value;
-	    }
-	;
+return new self.fn(aString);
 return self;},
-args: ["anIndex", "aBlock"],
-source: unescape('at%3A%20anIndex%20ifAbsent%3A%20aBlock%0A%09%3C%0A%09%20%20%20%20var%20value%20%3D%20self%5BanIndex%20-%201%5D%3B%0A%09%20%20%20%20if%28value%20%3D%3D%3D%20undefined%29%20%7B%0A%09%09return%20aBlock%28%29%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20value%3B%0A%09%20%20%20%20%7D%0A%09%3E'),
+args: ["aString"],
+source: unescape('fromString%3A%20aString%0A%09%20%20%20%20%3Creturn%20new%20self.fn%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_add_'),
+unescape('_lf'),
 smalltalk.method({
-selector: unescape('add%3A'),
-category: 'adding/removing',
-fn: function (anObject) {
+selector: unescape('lf'),
+category: 'accessing',
+fn: function () {
 var self=this;
-self.push(anObject); return anObject;;
+return '\n';
 return self;},
-args: ["anObject"],
-source: unescape('add%3A%20anObject%0A%09%3Cself.push%28anObject%29%3B%20return%20anObject%3B%3E'),
+args: [],
+source: unescape('lf%0A%09%3Creturn%20%27%5Cn%27%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_join_'),
+unescape('_space'),
 smalltalk.method({
-selector: unescape('join%3A'),
-category: 'enumerating',
-fn: function (aString) {
+selector: unescape('space'),
+category: 'accessing',
+fn: function () {
 var self=this;
-return self.join(aString);
+return ' ';
 return self;},
-args: ["aString"],
-source: unescape('join%3A%20aString%0A%09%3Creturn%20self.join%28aString%29%3E'),
+args: [],
+source: unescape('space%0A%09%3Creturn%20%27%20%27%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_streamClass'),
 smalltalk.method({
-selector: unescape('asJavascript'),
-category: 'converting',
+selector: unescape('streamClass'),
+category: 'accessing',
 fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(unescape("%5B"), "__comma", [smalltalk.send(smalltalk.send(self, "_collect_", [(function(each){return smalltalk.send(each, "_asJavascript", []);})]), "_join_", [unescape("%2C%20")])]), "__comma", [unescape("%5D")]);
+return (smalltalk.StringStream || StringStream);
 return self;},
 args: [],
-source: unescape('asJavascript%0A%09%5E%27%5B%27%2C%20%28%28self%20collect%3A%20%5B%3Aeach%20%7C%20each%20asJavascript%5D%29%20join%3A%20%27%2C%20%27%29%2C%20%20%27%5D%27'),
-messageSends: [unescape("%2C"), "join:", "collect:", "asJavascript"],
-referencedClasses: []
+source: unescape('streamClass%0A%09%20%20%20%20%5EStringStream'),
+messageSends: [],
+referencedClasses: ["StringStream"]
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_sort'),
+unescape('_streamContents_'),
 smalltalk.method({
-selector: unescape('sort'),
-category: 'enumerating',
+selector: unescape('streamContents%3A'),
+category: 'instance creation',
+fn: function (blockWithArg) {
+var self=this;
+var stream=nil;
+(stream=smalltalk.send(smalltalk.send(self, "_streamClass", []), "_on_", [smalltalk.send((smalltalk.String || String), "_new", [])]));
+smalltalk.send(blockWithArg, "_value_", [stream]);
+return smalltalk.send(stream, "_contents", []);
+return self;},
+args: ["blockWithArg"],
+source: unescape('streamContents%3A%20blockWithArg%0A%09%7Cstream%7C%0A%09stream%20%3A%3D%20%28self%20streamClass%20on%3A%20String%20new%29.%0A%09blockWithArg%20value%3A%20stream.%0A%09%5E%20stream%20contents'),
+messageSends: ["on:", "streamClass", "new", "value:", "contents"],
+referencedClasses: ["String"]
+}),
+smalltalk.String.klass);
+
+smalltalk.addMethod(
+unescape('_tab'),
+smalltalk.method({
+selector: unescape('tab'),
+category: 'accessing',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_basicPerform_", ["sort"]);
+return '\t';
 return self;},
 args: [],
-source: unescape('sort%0A%20%20%20%20%5Eself%20basicPerform%3A%20%27sort%27'),
-messageSends: ["basicPerform:"],
+source: unescape('tab%0A%09%3Creturn%20%27%5Ct%27%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.String.klass);
 
 smalltalk.addMethod(
-unescape('_sort_'),
+unescape('_value_'),
 smalltalk.method({
-selector: unescape('sort%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
+selector: unescape('value%3A'),
+category: 'instance creation',
+fn: function (aUTFCharCode) {
 var self=this;
+return String.fromCharCode(aUTFCharCode);;
+return self;},
+args: ["aUTFCharCode"],
+source: unescape('value%3A%20aUTFCharCode%0A%0A%09%3Creturn%20String.fromCharCode%28aUTFCharCode%29%3B%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.String.klass);
 
-		return self.sort(function(a, b) {
-			if(aBlock(a,b)) {return -1} else {return 1}
-		})
-	;
+
+smalltalk.addClass('Symbol', smalltalk.CharacterArray, [], 'Kernel-Collections');
+smalltalk.addMethod(
+unescape('__lt'),
+smalltalk.method({
+selector: unescape('%3C'),
+category: 'comparing',
+fn: function (aSymbol) {
+var self=this;
+return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver <smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__lt", [smalltalk.send(aSymbol, "_asString", [])]));
 return self;},
-args: ["aBlock"],
-source: unescape('sort%3A%20aBlock%0A%09%3C%0A%09%09return%20self.sort%28function%28a%2C%20b%29%20%7B%0A%09%09%09if%28aBlock%28a%2Cb%29%29%20%7Breturn%20-1%7D%20else%20%7Breturn%201%7D%0A%09%09%7D%29%0A%09%3E'),
-messageSends: [],
+args: ["aSymbol"],
+source: unescape('%3C%20aSymbol%0A%09%5Eself%20asString%20%3C%20aSymbol%20asString'),
+messageSends: [unescape("%3C"), "asString"],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_remove_'),
+unescape('__lt_eq'),
 smalltalk.method({
-selector: unescape('remove%3A'),
-category: 'adding/removing',
-fn: function (anObject) {
+selector: unescape('%3C%3D'),
+category: 'comparing',
+fn: function (aSymbol) {
 var self=this;
-
-		for(var i=0;i<self.length;i++) {
-			if(self[i] == anObject) {
-				self.splice(i,1);
-				break;
-			}
-		}
-	;
+return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(aSymbol, "_asString", [])]));
 return self;},
-args: ["anObject"],
-source: unescape('remove%3A%20anObject%0A%09%3C%0A%09%09for%28var%20i%3D0%3Bi%3Cself.length%3Bi++%29%20%7B%0A%09%09%09if%28self%5Bi%5D%20%3D%3D%20anObject%29%20%7B%0A%09%09%09%09self.splice%28i%2C1%29%3B%0A%09%09%09%09break%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%3E'),
-messageSends: [],
+args: ["aSymbol"],
+source: unescape('%3C%3D%20aSymbol%0A%09%5Eself%20asString%20%3C%3D%20aSymbol%20asString'),
+messageSends: [unescape("%3C%3D"), "asString"],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_sorted'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('sorted'),
-category: 'enumerating',
-fn: function () {
+selector: unescape('%3D'),
+category: 'comparing',
+fn: function (aSymbol) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort", []);
-return self;},
-args: [],
-source: unescape('sorted%0A%09%5Eself%20copy%20sort'),
-messageSends: ["sort", "copy"],
+try{((($receiver = smalltalk.send(smalltalk.send(aSymbol, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
+(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return smalltalk.send(smalltalk.send(self, "_asString", []), "__eq", [smalltalk.send(aSymbol, "_asString", [])])}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}},
+args: ["aSymbol"],
+source: unescape('%3D%20aSymbol%0A%09aSymbol%20class%20%3D%20self%20class%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09%5Eself%20asString%20%3D%20aSymbol%20asString'),
+messageSends: ["ifFalse:", unescape("%3D"), "class", "asString"],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_sorted_'),
+unescape('__gt'),
 smalltalk.method({
-selector: unescape('sorted%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
+selector: unescape('%3E'),
+category: 'comparing',
+fn: function (aSymbol) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_copy", []), "_sort_", [aBlock]);
+return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver >smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__gt", [smalltalk.send(aSymbol, "_asString", [])]));
 return self;},
-args: ["aBlock"],
-source: unescape('sorted%3A%20aBlock%0A%09%5Eself%20copy%20sort%3A%20aBlock'),
-messageSends: ["sort:", "copy"],
+args: ["aSymbol"],
+source: unescape('%3E%20aSymbol%0A%09%5Eself%20asString%20%3E%20aSymbol%20asString'),
+messageSends: [unescape("%3E"), "asString"],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_removeFrom_to_'),
+unescape('__gt_eq'),
 smalltalk.method({
-selector: unescape('removeFrom%3Ato%3A'),
-category: 'adding/removing',
-fn: function (aNumber, anotherNumber) {
+selector: unescape('%3E%3D'),
+category: 'comparing',
+fn: function (aSymbol) {
 var self=this;
-self.splice(aNumber - 1,anotherNumber - 1);
+return ((($receiver = smalltalk.send(self, "_asString", [])).klass === smalltalk.Number) ? $receiver >=smalltalk.send(aSymbol, "_asString", []) : smalltalk.send($receiver, "__gt_eq", [smalltalk.send(aSymbol, "_asString", [])]));
 return self;},
-args: ["aNumber", "anotherNumber"],
-source: unescape('removeFrom%3A%20aNumber%20to%3A%20anotherNumber%0A%09%3Cself.splice%28aNumber%20-%201%2CanotherNumber%20-%201%29%3E'),
-messageSends: [],
+args: ["aSymbol"],
+source: unescape('%3E%3D%20aSymbol%0A%09%5Eself%20asString%20%3E%3D%20aSymbol%20asString'),
+messageSends: [unescape("%3E%3D"), "asString"],
 referencedClasses: []
 }),
-smalltalk.Array);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_reversed'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('reversed'),
+selector: unescape('asJSON'),
 category: 'converting',
-fn: function () {
+fn: function (){
 var self=this;
-return self._copy().reverse();
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_asJSON", []);
 return self;},
 args: [],
-source: unescape('reversed%0A%09%3Creturn%20self._copy%28%29.reverse%28%29%3E'),
-messageSends: [],
+source: unescape('asJSON%0A%09%5Eself%20asString%20asJSON'),
+messageSends: ["asJSON", "asString"],
 referencedClasses: []
 }),
-smalltalk.Array);
-
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_new_'),
+unescape('_asJavascript'),
 smalltalk.method({
-selector: unescape('new%3A'),
-category: 'instance creation',
-fn: function (anInteger) {
+selector: unescape('asJavascript'),
+category: 'converting',
+fn: function () {
 var self=this;
-return new Array(anInteger);
+return smalltalk.send(smalltalk.send(unescape("smalltalk.symbolFor%28%22"), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%22%29")]);
 return self;},
-args: ["anInteger"],
-source: unescape('new%3A%20anInteger%0A%09%3Creturn%20new%20Array%28anInteger%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('asJavascript%0A%09%5E%27smalltalk.symbolFor%28%22%27%2C%20self%20asString%2C%20%27%22%29%27'),
+messageSends: [unescape("%2C"), "asString"],
 referencedClasses: []
 }),
-smalltalk.Array.klass);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_with_'),
+unescape('_asSelector'),
 smalltalk.method({
-selector: unescape('with%3A'),
-category: 'instance creation',
-fn: function (anObject) {
+selector: unescape('asSelector'),
+category: 'converting',
+fn: function () {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(1)]));
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_asSelector", []);
 return self;},
-args: ["anObject"],
-source: unescape('with%3A%20anObject%0A%09%20%20%20%20%5E%28self%20new%3A%201%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09yourself'),
-messageSends: ["at:put:", "yourself", "new:"],
+args: [],
+source: unescape('asSelector%0A%09%5Eself%20asString%20asSelector'),
+messageSends: ["asSelector", "asString"],
 referencedClasses: []
 }),
-smalltalk.Array.klass);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_with_with_'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('with%3Awith%3A'),
-category: 'instance creation',
-fn: function (anObject, anObject2) {
+selector: unescape('asString'),
+category: 'converting',
+fn: function () {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(2)]));
+return self.value;
 return self;},
-args: ["anObject", "anObject2"],
-source: unescape('with%3A%20anObject%20with%3A%20anObject2%0A%09%20%20%20%20%5E%28self%20new%3A%202%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09at%3A%202%20put%3A%20anObject2%3B%0A%09%09yourself'),
-messageSends: ["at:put:", "yourself", "new:"],
+args: [],
+source: unescape('asString%0A%09%3Creturn%20self.value%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array.klass);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_with_with_with_'),
+unescape('_asSymbol'),
 smalltalk.method({
-selector: unescape('with%3Awith%3Awith%3A'),
-category: 'instance creation',
-fn: function (anObject, anObject2, anObject3) {
+selector: unescape('asSymbol'),
+category: 'converting',
+fn: function () {
 var self=this;
-return (function($rec){smalltalk.send($rec, "_at_put_", [(1), anObject]);smalltalk.send($rec, "_at_put_", [(2), anObject2]);smalltalk.send($rec, "_at_put_", [(3), anObject3]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new_", [(3)]));
+return self;
 return self;},
-args: ["anObject", "anObject2", "anObject3"],
-source: unescape('with%3A%20anObject%20with%3A%20anObject2%20with%3A%20anObject3%0A%09%20%20%20%20%5E%28self%20new%3A%203%29%0A%09%09at%3A%201%20put%3A%20anObject%3B%0A%09%09at%3A%202%20put%3A%20anObject2%3B%0A%09%09at%3A%203%20put%3A%20anObject3%3B%0A%09%09yourself'),
-messageSends: ["at:put:", "yourself", "new:"],
+args: [],
+source: unescape('asSymbol%0A%09%5Eself'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Array.klass);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_withAll_'),
+unescape('_at_ifAbsent_'),
 smalltalk.method({
-selector: unescape('withAll%3A'),
-category: 'instance creation',
-fn: function (aCollection) {
+selector: unescape('at%3AifAbsent%3A'),
+category: 'accessing',
+fn: function (anIndex, aBlock) {
 var self=this;
-var instance=nil;
-(instance=smalltalk.send(self, "_new_", [smalltalk.send(aCollection, "_size", [])]));
-smalltalk.send(aCollection, "_withIndexDo_", [(function(each, index){return smalltalk.send(instance, "_at_put_", [index, each]);})]);
-return instance;
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_at_ifAbsent_", [anIndex, aBlock]);
 return self;},
-args: ["aCollection"],
-source: unescape('withAll%3A%20aCollection%0A%09%7C%20instance%20%7C%0A%09instance%20%3A%3D%20self%20new%3A%20aCollection%20size.%0A%09aCollection%20withIndexDo%3A%20%5B%3Aeach%20%3Aindex%20%20%7C%0A%09%09instance%20at%3A%20index%20put%3A%20each%5D.%0A%09%5Einstance'),
-messageSends: ["new:", "size", "withIndexDo:", "at:put:"],
+args: ["anIndex", "aBlock"],
+source: unescape('at%3A%20anIndex%20ifAbsent%3A%20aBlock%0A%09%5Eself%20asString%20at%3A%20anIndex%20ifAbsent%3A%20aBlock'),
+messageSends: ["at:ifAbsent:", "asString"],
 referencedClasses: []
 }),
-smalltalk.Array.klass);
-
+smalltalk.Symbol);
 
-smalltalk.addClass('StringStream', smalltalk.Stream, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_next_'),
+unescape('_copyFrom_to_'),
 smalltalk.method({
-selector: unescape('next%3A'),
-category: 'reading',
-fn: function (anInteger) {
+selector: unescape('copyFrom%3Ato%3A'),
+category: 'copying',
+fn: function (anIndex, anotherIndex) {
 var self=this;
-var tempCollection=nil;
-(tempCollection=smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_class", []), "_new", []));
-smalltalk.send(anInteger, "_timesRepeat_", [(function(){return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (tempCollection=smalltalk.send(tempCollection, "__comma", [smalltalk.send(self, "_next", [])]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (tempCollection=smalltalk.send(tempCollection, "__comma", [smalltalk.send(self, "_next", [])]));})]));})]);
-return tempCollection;
+return smalltalk.send(smalltalk.send(self, "_class", []), "_fromString_", [smalltalk.send(smalltalk.send(self, "_asString", []), "_copyFrom_to_", [anIndex, anotherIndex])]);
 return self;},
-args: ["anInteger"],
-source: unescape('next%3A%20anInteger%0A%09%7C%20tempCollection%20%7C%0A%09tempCollection%20%3A%3D%20self%20collection%20class%20new.%0A%09anInteger%20timesRepeat%3A%20%5B%0A%09%20%20%20%20self%20atEnd%20ifFalse%3A%20%5B%0A%09%09tempCollection%20%3A%3D%20tempCollection%2C%20self%20next%5D%5D.%0A%09%5EtempCollection'),
-messageSends: ["new", "class", "collection", "timesRepeat:", "ifFalse:", "atEnd", unescape("%2C"), "next"],
+args: ["anIndex", "anotherIndex"],
+source: unescape('copyFrom%3A%20anIndex%20to%3A%20anotherIndex%0A%09%5Eself%20class%20fromString%3A%20%28self%20asString%20copyFrom%3A%20anIndex%20to%3A%20anotherIndex%29'),
+messageSends: ["fromString:", "class", "copyFrom:to:", "asString"],
 referencedClasses: []
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_nextPut_'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('nextPut%3A'),
-category: 'writing',
-fn: function (aString) {
+selector: unescape('deepCopy'),
+category: 'copying',
+fn: function () {
 var self=this;
-smalltalk.send(self, "_nextPutAll_", [aString]);
+return self;
 return self;},
-args: ["aString"],
-source: unescape('nextPut%3A%20aString%0A%09self%20nextPutAll%3A%20aString'),
-messageSends: ["nextPutAll:"],
+args: [],
+source: unescape('deepCopy%0A%09%5Eself'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_nextPutAll_'),
+unescape('_isSymbol'),
 smalltalk.method({
-selector: unescape('nextPutAll%3A'),
-category: 'writing',
-fn: function (aString) {
-var self=this;
-smalltalk.send(self, "_setCollection_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [(1), smalltalk.send(self, "_position", [])]), "__comma", [aString]), "__comma", [smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [((($receiver = ((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])])), smalltalk.send(smalltalk.send(self, "_collection", []), "_size", [])])])]);
-smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])]))]);
-smalltalk.send(self, "_setStreamSize_", [smalltalk.send(smalltalk.send(self, "_streamSize", []), "_max_", [smalltalk.send(self, "_position", [])])]);
+selector: unescape('isSymbol'),
+category: 'printing',
+fn: function () {
+var self=this;
+return true;
 return self;},
-args: ["aString"],
-source: unescape('nextPutAll%3A%20aString%0A%09self%20setCollection%3A%20%0A%09%20%20%20%20%28self%20collection%20copyFrom%3A%201%20to%3A%20self%20position%29%2C%0A%09%20%20%20%20aString%2C%0A%09%20%20%20%20%28self%20collection%20copyFrom%3A%20%28self%20position%20+%201%20+%20aString%20size%29%20to%3A%20self%20collection%20size%29.%0A%09self%20position%3A%20self%20position%20+%20aString%20size.%0A%09self%20setStreamSize%3A%20%28self%20streamSize%20max%3A%20self%20position%29'),
-messageSends: ["setCollection:", unescape("%2C"), "copyFrom:to:", "collection", "position", unescape("+"), "size", "position:", "setStreamSize:", "max:", "streamSize"],
+args: [],
+source: unescape('isSymbol%0A%09%5Etrue'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_cr'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('cr'),
-category: 'writing',
+selector: unescape('printString'),
+category: 'printing',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_cr", [])]);
+return smalltalk.send(unescape("%23"), "__comma", [smalltalk.send(self, "_asString", [])]);
 return self;},
 args: [],
-source: unescape('cr%0A%09%5Eself%20nextPutAll%3A%20String%20cr'),
-messageSends: ["nextPutAll:", "cr"],
-referencedClasses: ["String"]
+source: unescape('printString%0A%09%5E%27%23%27%2C%20self%20asString'),
+messageSends: [unescape("%2C"), "asString"],
+referencedClasses: []
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_crlf'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('crlf'),
-category: 'writing',
+selector: unescape('shallowCopy'),
+category: 'copying',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_crlf", [])]);
+return self;
 return self;},
 args: [],
-source: unescape('crlf%0A%09%5Eself%20nextPutAll%3A%20String%20crlf'),
-messageSends: ["nextPutAll:", "crlf"],
-referencedClasses: ["String"]
+source: unescape('shallowCopy%0A%09%5Eself'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
 
 smalltalk.addMethod(
-unescape('_lf'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('lf'),
-category: 'writing',
+selector: unescape('size'),
+category: 'accessing',
 fn: function () {
 var self=this;
-return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_lf", [])]);
+return smalltalk.send(smalltalk.send(self, "_asString", []), "_size", []);
 return self;},
 args: [],
-source: unescape('lf%0A%09%5Eself%20nextPutAll%3A%20String%20lf'),
-messageSends: ["nextPutAll:", "lf"],
-referencedClasses: ["String"]
+source: unescape('size%0A%09%5Eself%20asString%20size'),
+messageSends: ["size", "asString"],
+referencedClasses: []
 }),
-smalltalk.StringStream);
+smalltalk.Symbol);
+
 
 smalltalk.addMethod(
-unescape('_space'),
+unescape('_basicNew'),
 smalltalk.method({
-selector: unescape('space'),
-category: 'writing',
+selector: unescape('basicNew'),
+category: 'instance creation',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_nextPut_", [" "]);
+smalltalk.send(self, "_shouldNotImplement", []);
 return self;},
 args: [],
-source: unescape('space%0A%09self%20nextPut%3A%20%27%20%27'),
-messageSends: ["nextPut:"],
+source: unescape('basicNew%0A%09self%20shouldNotImplement'),
+messageSends: ["shouldNotImplement"],
 referencedClasses: []
 }),
-smalltalk.StringStream);
-
-
+smalltalk.Symbol.klass);
 
-smalltalk.addClass('Set', smalltalk.Collection, ['elements'], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_add_'),
+unescape('_fromString_'),
 smalltalk.method({
-selector: unescape('add%3A'),
-category: 'adding/removing',
-fn: function (anObject) {
+selector: unescape('fromString%3A'),
+category: 'instance creation',
+fn: function (aString) {
 var self=this;
-
-		var found;
-		for(var i=0; i < self['@elements'].length; i++) {
-			if(anObject == self['@elements'][i]) {
-				found = true;
-				break;
-			}
-		}
-		if(!found) {self['@elements'].push(anObject)}
-	;
+return smalltalk.send(self, "_lookup_", [aString]);
 return self;},
-args: ["anObject"],
-source: unescape('add%3A%20anObject%0A%09%3C%0A%09%09var%20found%3B%0A%09%09for%28var%20i%3D0%3B%20i%20%3C%20self%5B%27@elements%27%5D.length%3B%20i++%29%20%7B%0A%09%09%09if%28anObject%20%3D%3D%20self%5B%27@elements%27%5D%5Bi%5D%29%20%7B%0A%09%09%09%09found%20%3D%20true%3B%0A%09%09%09%09break%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09if%28%21found%29%20%7Bself%5B%27@elements%27%5D.push%28anObject%29%7D%0A%09%3E'),
-messageSends: [],
+args: ["aString"],
+source: unescape('fromString%3A%20aString%0A%09%5Eself%20lookup%3A%20aString'),
+messageSends: ["lookup:"],
 referencedClasses: []
 }),
-smalltalk.Set);
+smalltalk.Symbol.klass);
 
 smalltalk.addMethod(
-unescape('_remove_'),
+unescape('_lookup_'),
 smalltalk.method({
-selector: unescape('remove%3A'),
-category: 'adding/removing',
-fn: function (anObject) {
+selector: unescape('lookup%3A'),
+category: 'instance creation',
+fn: function (aString) {
 var self=this;
-smalltalk.send(self['@elements'], "_remove_", [anObject]);
+return smalltalk.symbolFor(aString);;
 return self;},
-args: ["anObject"],
-source: unescape('remove%3A%20anObject%0A%09elements%20remove%3A%20anObject'),
-messageSends: ["remove:"],
+args: ["aString"],
+source: unescape('lookup%3A%20aString%0A%09%3Creturn%20smalltalk.symbolFor%28aString%29%3B%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Set);
+smalltalk.Symbol.klass);
+
 
+smalltalk.addClass('Set', smalltalk.Collection, ['elements'], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
-fn: function () {
+selector: unescape('%3D'),
+category: 'comparing',
+fn: function (aCollection) {
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Collection);
-(self['@elements']=[]);
+return smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aCollection, "_class", [])]), "_and_", [(function(){return smalltalk.send(self['@elements'], "__eq", [smalltalk.send(aCollection, "_asArray", [])]);})]);
 return self;},
-args: [],
-source: unescape('initialize%0A%09super%20initialize.%0A%09elements%20%3A%3D%20%23%28%29'),
-messageSends: ["initialize"],
+args: ["aCollection"],
+source: unescape('%3D%20aCollection%0A%09%5Eself%20class%20%3D%20aCollection%20class%20and%3A%20%5B%0A%09%09elements%20%3D%20aCollection%20asArray%5D'),
+messageSends: ["and:", unescape("%3D"), "class", "asArray"],
 referencedClasses: []
 }),
 smalltalk.Set);
 
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_add_'),
 smalltalk.method({
-selector: unescape('size'),
-category: 'accessing',
-fn: function () {
+selector: unescape('add%3A'),
+category: 'adding/removing',
+fn: function (anObject) {
 var self=this;
-return smalltalk.send(self['@elements'], "_size", []);
+
+		var found;
+		for(var i=0; i < self['@elements'].length; i++) {
+			if(anObject == self['@elements'][i]) {
+				found = true;
+				break;
+			}
+		}
+		if(!found) {self['@elements'].push(anObject)}
+	;
 return self;},
-args: [],
-source: unescape('size%0A%09%5Eelements%20size'),
-messageSends: ["size"],
+args: ["anObject"],
+source: unescape('add%3A%20anObject%0A%09%3C%0A%09%09var%20found%3B%0A%09%09for%28var%20i%3D0%3B%20i%20%3C%20self%5B%27@elements%27%5D.length%3B%20i++%29%20%7B%0A%09%09%09if%28anObject%20%3D%3D%20self%5B%27@elements%27%5D%5Bi%5D%29%20%7B%0A%09%09%09%09found%20%3D%20true%3B%0A%09%09%09%09break%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09if%28%21found%29%20%7Bself%5B%27@elements%27%5D.push%28anObject%29%7D%0A%09%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Set);
@@ -3923,784 +4040,668 @@ referencedClasses: []
 smalltalk.Set);
 
 smalltalk.addMethod(
-unescape('__eq'),
-smalltalk.method({
-selector: unescape('%3D'),
-category: 'comparing',
-fn: function (aCollection) {
-var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aCollection, "_class", [])]), "_and_", [(function(){return smalltalk.send(self['@elements'], "__eq", [smalltalk.send(aCollection, "_asArray", [])]);})]);
-return self;},
-args: ["aCollection"],
-source: unescape('%3D%20aCollection%0A%09%5Eself%20class%20%3D%20aCollection%20class%20and%3A%20%5B%0A%09%09elements%20%3D%20aCollection%20asArray%5D'),
-messageSends: ["and:", unescape("%3D"), "class", "asArray"],
-referencedClasses: []
-}),
-smalltalk.Set);
-
-smalltalk.addMethod(
-unescape('_select_'),
-smalltalk.method({
-selector: unescape('select%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
-var self=this;
-var collection=nil;
-(collection=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_do_", [(function(each){return ((($receiver = smalltalk.send(aBlock, "_value_", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(collection, "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(collection, "_add_", [each]);})]));})]);
-return collection;
-return self;},
-args: ["aBlock"],
-source: unescape('select%3A%20aBlock%0A%09%7C%20collection%20%7C%0A%09collection%20%3A%3D%20self%20class%20new.%20%0A%09self%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%28aBlock%20value%3A%20each%29%20ifTrue%3A%20%5B%0A%09%09%09collection%20add%3A%20each%5D%5D.%0A%09%5Ecollection'),
-messageSends: ["new", "class", "do:", "ifTrue:", "value:", "add:"],
-referencedClasses: []
-}),
-smalltalk.Set);
-
-
-
-smalltalk.addClass('HashedCollection', smalltalk.Collection, [], 'Kernel-Collections');
-smalltalk.HashedCollection.comment=unescape('A%20HashedCollection%20is%20a%20traditional%20JavaScript%20object%2C%20or%20a%20Smalltalk%20Dictionary.%0A%0AUnlike%20a%20Dictionary%2C%20it%20can%20only%20have%20strings%20as%20keys.')
-smalltalk.addMethod(
-unescape('_size'),
-smalltalk.method({
-selector: unescape('size'),
-category: 'accessing',
-fn: function () {
-var self=this;
-return smalltalk.send(smalltalk.send(self, "_keys", []), "_size", []);
-return self;},
-args: [],
-source: unescape('size%0A%09%5Eself%20keys%20size'),
-messageSends: ["size", "keys"],
-referencedClasses: []
-}),
-smalltalk.HashedCollection);
-
-smalltalk.addMethod(
-unescape('_associations'),
-smalltalk.method({
-selector: unescape('associations'),
-category: 'accessing',
-fn: function () {
-var self=this;
-var associations=nil;
-(associations=[]);
-smalltalk.send(smalltalk.send(self, "_keys", []), "_do_", [(function(each){return smalltalk.send(associations, "_add_", [smalltalk.send((smalltalk.Association || Association), "_key_value_", [each, smalltalk.send(self, "_at_", [each])])]);})]);
-return associations;
-return self;},
-args: [],
-source: unescape('associations%0A%09%7C%20associations%20%7C%0A%09associations%20%3A%3D%20%23%28%29.%0A%09self%20keys%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20associations%20add%3A%20%28Association%20key%3A%20each%20value%3A%20%28self%20at%3A%20each%29%29%5D.%0A%09%5Eassociations'),
-messageSends: ["do:", "keys", "add:", "key:value:", "at:"],
-referencedClasses: ["Association"]
-}),
-smalltalk.HashedCollection);
-
-smalltalk.addMethod(
-unescape('_keys'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('keys'),
-category: 'accessing',
+selector: unescape('initialize'),
+category: 'initialization',
 fn: function () {
 var self=this;
-
-		var keys = [];
-		for(var i in self) {
-			if(self.hasOwnProperty(i)) {
-				keys.push(i);
-			}
-		};
-		return keys;
-	;
+smalltalk.send(self, "_initialize", [], smalltalk.Collection);
+(self['@elements']=[]);
 return self;},
 args: [],
-source: unescape('keys%0A%09%3C%0A%09%09var%20keys%20%3D%20%5B%5D%3B%0A%09%09for%28var%20i%20in%20self%29%20%7B%0A%09%09%09if%28self.hasOwnProperty%28i%29%29%20%7B%0A%09%09%09%09keys.push%28i%29%3B%0A%09%09%09%7D%0A%09%09%7D%3B%0A%09%09return%20keys%3B%0A%09%3E'),
-messageSends: [],
+source: unescape('initialize%0A%09super%20initialize.%0A%09elements%20%3A%3D%20%23%28%29'),
+messageSends: ["initialize"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Set);
 
 smalltalk.addMethod(
-unescape('_values'),
+unescape('_remove_'),
 smalltalk.method({
-selector: unescape('values'),
-category: 'accessing',
-fn: function () {
+selector: unescape('remove%3A'),
+category: 'adding/removing',
+fn: function (anObject) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_keys", []), "_collect_", [(function(each){return smalltalk.send(self, "_at_", [each]);})]);
+smalltalk.send(self['@elements'], "_remove_", [anObject]);
 return self;},
-args: [],
-source: unescape('values%0A%09%5Eself%20keys%20collect%3A%20%5B%3Aeach%20%7C%20self%20at%3A%20each%5D'),
-messageSends: ["collect:", "keys", "at:"],
+args: ["anObject"],
+source: unescape('remove%3A%20anObject%0A%09elements%20remove%3A%20anObject'),
+messageSends: ["remove:"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Set);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_select_'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-category: 'accessing',
-fn: function (aKey, aValue) {
+selector: unescape('select%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
 var self=this;
-return smalltalk.send(self, "_basicAt_put_", [aKey, aValue]);
+var collection=nil;
+(collection=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
+smalltalk.send(self, "_do_", [(function(each){return ((($receiver = smalltalk.send(aBlock, "_value_", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(collection, "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(collection, "_add_", [each]);})]));})]);
+return collection;
 return self;},
-args: ["aKey", "aValue"],
-source: unescape('at%3A%20aKey%20put%3A%20aValue%0A%09%5Eself%20basicAt%3A%20aKey%20put%3A%20aValue'),
-messageSends: ["basicAt:put:"],
+args: ["aBlock"],
+source: unescape('select%3A%20aBlock%0A%09%7C%20collection%20%7C%0A%09collection%20%3A%3D%20self%20class%20new.%20%0A%09self%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%28aBlock%20value%3A%20each%29%20ifTrue%3A%20%5B%0A%09%09%09collection%20add%3A%20each%5D%5D.%0A%09%5Ecollection'),
+messageSends: ["new", "class", "do:", "ifTrue:", "value:", "add:"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Set);
 
 smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
+selector: unescape('size'),
 category: 'accessing',
-fn: function (aKey, aBlock) {
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_includesKey_", [aKey]), "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self, "_basicAt_", [aKey]);}), aBlock]);
+return smalltalk.send(self['@elements'], "_size", []);
 return self;},
-args: ["aKey", "aBlock"],
-source: unescape('at%3A%20aKey%20ifAbsent%3A%20aBlock%0A%09%5E%28self%20includesKey%3A%20aKey%29%0A%09%09ifTrue%3A%20%5Bself%20basicAt%3A%20aKey%5D%0A%09%09ifFalse%3A%20aBlock'),
-messageSends: ["ifTrue:ifFalse:", "includesKey:", "basicAt:"],
+args: [],
+source: unescape('size%0A%09%5Eelements%20size'),
+messageSends: ["size"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Set);
+
 
+
+smalltalk.addClass('RegularExpression', smalltalk.Object, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_at_ifAbsentPut_'),
+unescape('_compile_'),
 smalltalk.method({
-selector: unescape('at%3AifAbsentPut%3A'),
-category: 'accessing',
-fn: function (aKey, aBlock) {
+selector: unescape('compile%3A'),
+category: 'evaluating',
+fn: function (aString) {
 var self=this;
-return smalltalk.send(self, "_at_ifAbsent_", [aKey, (function(){return smalltalk.send(self, "_at_put_", [aKey, smalltalk.send(aBlock, "_value", [])]);})]);
+return self.compile(aString);
 return self;},
-args: ["aKey", "aBlock"],
-source: unescape('at%3A%20aKey%20ifAbsentPut%3A%20aBlock%0A%09%5Eself%20at%3A%20aKey%20ifAbsent%3A%20%5B%0A%09%20%20%20%20self%20at%3A%20aKey%20put%3A%20aBlock%20value%5D'),
-messageSends: ["at:ifAbsent:", "at:put:", "value"],
+args: ["aString"],
+source: unescape('compile%3A%20aString%0A%09%3Creturn%20self.compile%28aString%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.RegularExpression);
 
 smalltalk.addMethod(
-unescape('_at_ifPresent_'),
+unescape('_exec_'),
 smalltalk.method({
-selector: unescape('at%3AifPresent%3A'),
-category: 'accessing',
-fn: function (aKey, aBlock) {
+selector: unescape('exec%3A'),
+category: 'evaluating',
+fn: function (aString) {
 var self=this;
-return (($receiver = smalltalk.send(self, "_basicAt_", [aKey])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_at_", [aKey])]);})() : nil;
+return self.exec(aString) || nil;
 return self;},
-args: ["aKey", "aBlock"],
-source: unescape('at%3A%20aKey%20ifPresent%3A%20aBlock%0A%09%5E%28self%20basicAt%3A%20aKey%29%20ifNotNil%3A%20%5BaBlock%20value%3A%20%28self%20at%3A%20aKey%29%5D'),
-messageSends: ["ifNotNil:", "basicAt:", "value:", "at:"],
+args: ["aString"],
+source: unescape('exec%3A%20aString%0A%09%3Creturn%20self.exec%28aString%29%20%7C%7C%20nil%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.RegularExpression);
 
 smalltalk.addMethod(
-unescape('_at_ifPresent_ifAbsent_'),
+unescape('_test_'),
 smalltalk.method({
-selector: unescape('at%3AifPresent%3AifAbsent%3A'),
-category: 'accessing',
-fn: function (aKey, aBlock, anotherBlock) {
+selector: unescape('test%3A'),
+category: 'evaluating',
+fn: function (aString) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_basicAt_", [aKey]), "_ifNil_ifNotNil_", [anotherBlock, (function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_at_", [aKey])]);})]);
+return self.test(aString);
 return self;},
-args: ["aKey", "aBlock", "anotherBlock"],
-source: unescape('at%3A%20aKey%20ifPresent%3A%20aBlock%20ifAbsent%3A%20anotherBlock%0A%09%5E%28self%20basicAt%3A%20aKey%29%0A%09%20%20%20%20ifNil%3A%20anotherBlock%0A%09%20%20%20%20ifNotNil%3A%20%5BaBlock%20value%3A%20%28self%20at%3A%20aKey%29%5D'),
-messageSends: ["ifNil:ifNotNil:", "basicAt:", "value:", "at:"],
+args: ["aString"],
+source: unescape('test%3A%20aString%0A%09%3Creturn%20self.test%28aString%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.RegularExpression);
+
 
 smalltalk.addMethod(
-unescape('_at_'),
+unescape('_fromString_'),
 smalltalk.method({
-selector: unescape('at%3A'),
-category: 'accessing',
-fn: function (aKey) {
+selector: unescape('fromString%3A'),
+category: 'instance creation',
+fn: function (aString) {
 var self=this;
-return smalltalk.send(self, "_at_ifAbsent_", [aKey, (function(){return smalltalk.send(self, "_errorNotFound", []);})]);
+return smalltalk.send(self, "_fromString_flag_", [aString, ""]);
 return self;},
-args: ["aKey"],
-source: unescape('at%3A%20aKey%0A%09%5Eself%20at%3A%20aKey%20ifAbsent%3A%20%5Bself%20errorNotFound%5D'),
-messageSends: ["at:ifAbsent:", "errorNotFound"],
+args: ["aString"],
+source: unescape('fromString%3A%20aString%0A%09%20%20%20%20%5Eself%20fromString%3A%20aString%20flag%3A%20%27%27'),
+messageSends: ["fromString:flag:"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.RegularExpression.klass);
 
 smalltalk.addMethod(
-unescape('_add_'),
+unescape('_fromString_flag_'),
 smalltalk.method({
-selector: unescape('add%3A'),
-category: 'adding/removing',
-fn: function (anAssociation) {
+selector: unescape('fromString%3Aflag%3A'),
+category: 'instance creation',
+fn: function (aString, anotherString) {
 var self=this;
-smalltalk.send(self, "_at_put_", [smalltalk.send(anAssociation, "_key", []), smalltalk.send(anAssociation, "_value", [])]);
+return new RegExp(aString, anotherString);
 return self;},
-args: ["anAssociation"],
-source: unescape('add%3A%20anAssociation%0A%09self%20at%3A%20anAssociation%20key%20put%3A%20anAssociation%20value'),
-messageSends: ["at:put:", "key", "value"],
+args: ["aString", "anotherString"],
+source: unescape('fromString%3A%20aString%20flag%3A%20anotherString%0A%09%3Creturn%20new%20RegExp%28aString%2C%20anotherString%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.RegularExpression.klass);
+
 
+smalltalk.addClass('Stream', smalltalk.Object, ['collection', 'position', 'streamSize'], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_addAll_'),
+unescape('_atEnd'),
 smalltalk.method({
-selector: unescape('addAll%3A'),
-category: 'adding/removing',
-fn: function (aHashedCollection) {
+selector: unescape('atEnd'),
+category: 'testing',
+fn: function () {
 var self=this;
-smalltalk.send(self, "_addAll_", [smalltalk.send(aHashedCollection, "_associations", [])], smalltalk.Collection);
-return aHashedCollection;
+return smalltalk.send(smalltalk.send(self, "_position", []), "__eq", [smalltalk.send(self, "_size", [])]);
 return self;},
-args: ["aHashedCollection"],
-source: unescape('addAll%3A%20aHashedCollection%0A%09super%20addAll%3A%20aHashedCollection%20associations.%0A%09%5EaHashedCollection'),
-messageSends: ["addAll:", "associations"],
+args: [],
+source: unescape('atEnd%0A%09%5Eself%20position%20%3D%20self%20size'),
+messageSends: [unescape("%3D"), "position", "size"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_removeKey_'),
+unescape('_atStart'),
 smalltalk.method({
-selector: unescape('removeKey%3A'),
-category: 'adding/removing',
-fn: function (aKey) {
+selector: unescape('atStart'),
+category: 'testing',
+fn: function () {
 var self=this;
-smalltalk.send(self, "_remove_", [aKey]);
+return smalltalk.send(smalltalk.send(self, "_position", []), "__eq", [(0)]);
 return self;},
-args: ["aKey"],
-source: unescape('removeKey%3A%20aKey%0A%20%20%20%20self%20remove%3A%20aKey'),
-messageSends: ["remove:"],
+args: [],
+source: unescape('atStart%0A%09%5Eself%20position%20%3D%200'),
+messageSends: [unescape("%3D"), "position"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_remove_ifAbsent_'),
+unescape('_close'),
 smalltalk.method({
-selector: unescape('remove%3AifAbsent%3A'),
-category: 'adding/removing',
-fn: function (aKey, aBlock) {
+selector: unescape('close'),
+category: 'actions',
+fn: function () {
 var self=this;
-return smalltalk.send(self, "_removeKey_ifAbsent_", [aKey, aBlock]);
+
 return self;},
-args: ["aKey", "aBlock"],
-source: unescape('remove%3A%20aKey%20ifAbsent%3A%20aBlock%0A%20%20%20%20%5Eself%20removeKey%3A%20aKey%20ifAbsent%3A%20aBlock'),
-messageSends: ["removeKey:ifAbsent:"],
+args: [],
+source: unescape('close'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_removeKey_ifAbsent_'),
+unescape('_collection'),
 smalltalk.method({
-selector: unescape('removeKey%3AifAbsent%3A'),
-category: 'adding/removing',
-fn: function (aKey, aBlock) {
+selector: unescape('collection'),
+category: 'accessing',
+fn: function () {
 var self=this;
-return ((($receiver = smalltalk.send(self, "_includesKey_", [aKey])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(aBlock, "_value", []);})() : (function(){return smalltalk.send(self, "_basicDelete_", [aKey]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(aBlock, "_value", []);}), (function(){return smalltalk.send(self, "_basicDelete_", [aKey]);})]));
+return self['@collection'];
 return self;},
-args: ["aKey", "aBlock"],
-source: unescape('removeKey%3A%20aKey%20ifAbsent%3A%20aBlock%0A%09%5E%28self%20includesKey%3A%20aKey%29%20%0A%09%09ifFalse%3A%20%5BaBlock%20value%5D%0A%09%09ifTrue%3A%20%5Bself%20basicDelete%3A%20aKey%5D'),
-messageSends: ["ifFalse:ifTrue:", "includesKey:", "value", "basicDelete:"],
+args: [],
+source: unescape('collection%0A%09%5Ecollection'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_contents'),
 smalltalk.method({
-selector: unescape('%3D'),
-category: 'comparing',
-fn: function (aHashedCollection) {
+selector: unescape('contents'),
+category: 'accessing',
+fn: function () {
 var self=this;
-try{((($receiver = smalltalk.send(smalltalk.send(self, "_class", []), "__eq", [smalltalk.send(aHashedCollection, "_class", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
-((($receiver = smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [smalltalk.send(aHashedCollection, "_size", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})]));
-(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return smalltalk.send(smalltalk.send(self, "_associations", []), "__eq", [smalltalk.send(aHashedCollection, "_associations", [])])}})})();
-return self;
-} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}},
-args: ["aHashedCollection"],
-source: unescape('%3D%20aHashedCollection%0A%09self%20class%20%3D%20aHashedCollection%20class%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09self%20size%20%3D%20aHashedCollection%20size%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09%5Eself%20associations%20%3D%20aHashedCollection%20associations'),
-messageSends: ["ifFalse:", unescape("%3D"), "class", "size", "associations"],
+return smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [(1), smalltalk.send(self, "_streamSize", [])]);
+return self;},
+args: [],
+source: unescape('contents%0A%09%5Eself%20collection%0A%09%20%20%20%20copyFrom%3A%201%20%0A%09%20%20%20%20to%3A%20self%20streamSize'),
+messageSends: ["copyFrom:to:", "collection", "streamSize"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_do_'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
-category: 'copying',
-fn: function () {
+selector: unescape('do%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
 var self=this;
-var copy=nil;
-(copy=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(copy, "_at_put_", [smalltalk.send(each, "_key", []), smalltalk.send(each, "_value", [])]);})]);
-return copy;
+(function(){while(!(function(){return smalltalk.send(self, "_atEnd", []);})()) {(function(){return smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_next", [])]);})()}})();
 return self;},
-args: [],
-source: unescape('shallowCopy%0A%09%7C%20copy%20%7C%0A%09copy%20%3A%3D%20self%20class%20new.%0A%09self%20associationsDo%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20copy%20at%3A%20each%20key%20%20put%3A%20each%20value%5D.%0A%09%5Ecopy'),
-messageSends: ["new", "class", "associationsDo:", "at:put:", "key", "value"],
+args: ["aBlock"],
+source: unescape('do%3A%20aBlock%0A%09%5Bself%20atEnd%5D%20whileFalse%3A%20%5BaBlock%20value%3A%20self%20next%5D'),
+messageSends: ["whileFalse:", "atEnd", "value:", "next"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('__comma'),
+unescape('_flush'),
 smalltalk.method({
-selector: unescape('%2C'),
-category: 'copying',
-fn: function (aCollection) {
+selector: unescape('flush'),
+category: 'actions',
+fn: function () {
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+
 return self;},
-args: ["aCollection"],
-source: unescape('%2C%20aCollection%0A%09self%20shouldNotImplement'),
-messageSends: ["shouldNotImplement"],
+args: [],
+source: unescape('flush'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_copyFrom_to_'),
+unescape('_isEmpty'),
 smalltalk.method({
-selector: unescape('copyFrom%3Ato%3A'),
-category: 'copying',
-fn: function (anIndex, anotherIndex) {
+selector: unescape('isEmpty'),
+category: 'testing',
+fn: function () {
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+return smalltalk.send(smalltalk.send(self, "_size", []), "__eq", [(0)]);
 return self;},
-args: ["anIndex", "anotherIndex"],
-source: unescape('copyFrom%3A%20anIndex%20to%3A%20anotherIndex%0A%09self%20shouldNotImplement'),
-messageSends: ["shouldNotImplement"],
+args: [],
+source: unescape('isEmpty%0A%09%5Eself%20size%20%3D%200'),
+messageSends: [unescape("%3D"), "size"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_next'),
 smalltalk.method({
-selector: unescape('deepCopy'),
-category: 'copying',
+selector: unescape('next'),
+category: 'reading',
 fn: function () {
 var self=this;
-var copy=nil;
-(copy=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(copy, "_at_put_", [smalltalk.send(each, "_key", []), smalltalk.send(smalltalk.send(each, "_value", []), "_deepCopy", [])]);})]);
-return copy;
+return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return nil;})() : (function(){smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);return smalltalk.send(self['@collection'], "_at_", [smalltalk.send(self, "_position", [])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return nil;}), (function(){smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);return smalltalk.send(self['@collection'], "_at_", [smalltalk.send(self, "_position", [])]);})]));
 return self;},
 args: [],
-source: unescape('deepCopy%0A%09%7C%20copy%20%7C%0A%09copy%20%3A%3D%20self%20class%20new.%0A%09self%20associationsDo%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20copy%20at%3A%20each%20key%20%20put%3A%20each%20value%20deepCopy%5D.%0A%09%5Ecopy'),
-messageSends: ["new", "class", "associationsDo:", "at:put:", "key", "deepCopy", "value"],
+source: unescape('next%0A%09%5Eself%20atEnd%20%0A%09%09ifTrue%3A%20%5Bnil%5D%0A%09%09ifFalse%3A%20%5B%0A%09%09%09self%20position%3A%20self%20position%20+%201.%20%0A%09%09%09collection%20at%3A%20self%20position%5D'),
+messageSends: ["ifTrue:ifFalse:", "atEnd", "position:", unescape("+"), "position", "at:"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_associationsDo_'),
+unescape('_next_'),
 smalltalk.method({
-selector: unescape('associationsDo%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
+selector: unescape('next%3A'),
+category: 'reading',
+fn: function (anInteger) {
 var self=this;
-smalltalk.send(smalltalk.send(self, "_associations", []), "_do_", [aBlock]);
+var tempCollection=nil;
+(tempCollection=smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_class", []), "_new", []));
+smalltalk.send(anInteger, "_timesRepeat_", [(function(){return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(tempCollection, "_add_", [smalltalk.send(self, "_next", [])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(tempCollection, "_add_", [smalltalk.send(self, "_next", [])]);})]));})]);
+return tempCollection;
 return self;},
-args: ["aBlock"],
-source: unescape('associationsDo%3A%20aBlock%0A%09self%20associations%20do%3A%20aBlock'),
-messageSends: ["do:", "associations"],
+args: ["anInteger"],
+source: unescape('next%3A%20anInteger%0A%09%7C%20tempCollection%20%7C%0A%09tempCollection%20%3A%3D%20self%20collection%20class%20new.%0A%09anInteger%20timesRepeat%3A%20%5B%0A%09%20%20%20%20self%20atEnd%20ifFalse%3A%20%5B%0A%09%09tempCollection%20add%3A%20self%20next%5D%5D.%0A%09%5EtempCollection'),
+messageSends: ["new", "class", "collection", "timesRepeat:", "ifFalse:", "atEnd", "add:", "next"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_keysAndValuesDo_'),
+unescape('_nextPut_'),
 smalltalk.method({
-selector: unescape('keysAndValuesDo%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
+selector: unescape('nextPut%3A'),
+category: 'writing',
+fn: function (anObject) {
 var self=this;
-smalltalk.send(self, "_associationsDo_", [(function(each){return smalltalk.send(aBlock, "_value_value_", [smalltalk.send(each, "_key", []), smalltalk.send(each, "_value", [])]);})]);
+smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);
+smalltalk.send(smalltalk.send(self, "_collection", []), "_at_put_", [smalltalk.send(self, "_position", []), anObject]);
+smalltalk.send(self, "_setStreamSize_", [smalltalk.send(smalltalk.send(self, "_streamSize", []), "_max_", [smalltalk.send(self, "_position", [])])]);
 return self;},
-args: ["aBlock"],
-source: unescape('keysAndValuesDo%3A%20aBlock%0A%09self%20associationsDo%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20aBlock%20value%3A%20each%20key%20value%3A%20each%20value%5D'),
-messageSends: ["associationsDo:", "value:value:", "key", "value"],
+args: ["anObject"],
+source: unescape('nextPut%3A%20anObject%0A%09self%20position%3A%20self%20position%20+%201.%0A%09self%20collection%20at%3A%20self%20position%20put%3A%20anObject.%0A%09self%20setStreamSize%3A%20%28self%20streamSize%20max%3A%20self%20position%29'),
+messageSends: ["position:", unescape("+"), "position", "at:put:", "collection", "setStreamSize:", "max:", "streamSize"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_do_'),
+unescape('_nextPutAll_'),
 smalltalk.method({
-selector: unescape('do%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
+selector: unescape('nextPutAll%3A'),
+category: 'writing',
+fn: function (aCollection) {
 var self=this;
-smalltalk.send(smalltalk.send(self, "_values", []), "_do_", [aBlock]);
+smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(self, "_nextPut_", [each]);})]);
 return self;},
-args: ["aBlock"],
-source: unescape('do%3A%20aBlock%0A%09self%20values%20do%3A%20aBlock'),
-messageSends: ["do:", "values"],
+args: ["aCollection"],
+source: unescape('nextPutAll%3A%20aCollection%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20nextPut%3A%20each%5D'),
+messageSends: ["do:", "nextPut:"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_select_'),
+unescape('_peek'),
 smalltalk.method({
-selector: unescape('select%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
+selector: unescape('peek'),
+category: 'reading',
+fn: function () {
 var self=this;
-var newDict=nil;
-(newDict=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return ((($receiver = smalltalk.send(aBlock, "_value_", [value])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(newDict, "_at_put_", [key, value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(newDict, "_at_put_", [key, value]);})]));})]);
-return newDict;
+return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_collection", []), "_at_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_collection", []), "_at_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))]);})]));
 return self;},
-args: ["aBlock"],
-source: unescape('select%3A%20aBlock%0A%09%7C%20newDict%20%7C%0A%09newDict%20%3A%3D%20self%20class%20new.%0A%09self%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%20%20%20%20%28aBlock%20value%3A%20value%29%20ifTrue%3A%20%5BnewDict%20at%3A%20key%20put%3A%20value%5D%5D.%0A%09%5EnewDict'),
-messageSends: ["new", "class", "keysAndValuesDo:", "ifTrue:", "value:", "at:put:"],
+args: [],
+source: unescape('peek%0A%09%5Eself%20atEnd%20ifFalse%3A%20%5B%0A%09%20%20%20%20self%20collection%20at%3A%20self%20position%20+%201%5D'),
+messageSends: ["ifFalse:", "atEnd", "at:", "collection", unescape("+"), "position"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_collect_'),
+unescape('_position'),
 smalltalk.method({
-selector: unescape('collect%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
+selector: unescape('position'),
+category: 'accessing',
+fn: function () {
 var self=this;
-var newDict=nil;
-(newDict=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(newDict, "_at_put_", [key, smalltalk.send(aBlock, "_value_", [value])]);})]);
-return newDict;
+return (($receiver = self['@position']) == nil || $receiver == undefined) ? (function(){return (self['@position']=(0));})() : $receiver;
 return self;},
-args: ["aBlock"],
-source: unescape('collect%3A%20aBlock%0A%09%7C%20newDict%20%7C%0A%09newDict%20%3A%3D%20self%20class%20new.%0A%09self%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%20%20%20%20newDict%20at%3A%20key%20put%3A%20%28aBlock%20value%3A%20value%29%5D.%0A%09%5EnewDict'),
-messageSends: ["new", "class", "keysAndValuesDo:", "at:put:", "value:"],
+args: [],
+source: unescape('position%0A%09%5Eposition%20ifNil%3A%20%5Bposition%20%3A%3D%200%5D'),
+messageSends: ["ifNil:"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_detect_ifNone_'),
+unescape('_position_'),
 smalltalk.method({
-selector: unescape('detect%3AifNone%3A'),
-category: 'enumerating',
-fn: function (aBlock, anotherBlock) {
+selector: unescape('position%3A'),
+category: 'accessing',
+fn: function (anInteger) {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_values", []), "_detect_ifNone_", [aBlock, anotherBlock]);
+(self['@position']=anInteger);
 return self;},
-args: ["aBlock", "anotherBlock"],
-source: unescape('detect%3A%20aBlock%20ifNone%3A%20anotherBlock%0A%09%5Eself%20values%20detect%3A%20aBlock%20ifNone%3A%20anotherBlock'),
-messageSends: ["detect:ifNone:", "values"],
+args: ["anInteger"],
+source: unescape('position%3A%20anInteger%0A%09position%20%3A%3D%20anInteger'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_includes_'),
+unescape('_reset'),
 smalltalk.method({
-selector: unescape('includes%3A'),
-category: 'enumerating',
-fn: function (anObject) {
+selector: unescape('reset'),
+category: 'actions',
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_values", []), "_includes_", [anObject]);
+smalltalk.send(self, "_position_", [(0)]);
 return self;},
-args: ["anObject"],
-source: unescape('includes%3A%20anObject%0A%09%5Eself%20values%20includes%3A%20anObject'),
-messageSends: ["includes:", "values"],
+args: [],
+source: unescape('reset%0A%09self%20position%3A%200'),
+messageSends: ["position:"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_resetContents'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
+selector: unescape('resetContents'),
+category: 'actions',
 fn: function () {
 var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(aStream){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Collection)]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);})(aStream);smalltalk.send(smalltalk.send(self, "_associations", []), "_do_separatedBy_", [(function(anAssociation){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(anAssociation, "_key", []), "_printString", [])]);smalltalk.send($rec, "_nextPutAll_", [unescape("%20-%3E%20")]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(anAssociation, "_value", []), "_printString", [])]);})(aStream);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [unescape("%20%2C%20")]);})]);return smalltalk.send(aStream, "_nextPutAll_", [unescape("%29")]);})]);
+smalltalk.send(self, "_reset", []);
+smalltalk.send(self, "_setStreamSize_", [(0)]);
 return self;},
 args: [],
-source: unescape('printString%0A%09%5EString%20streamContents%3A%20%5B%3AaStream%7C%20%20%0A%09%09aStream%20%0A%09%09%09nextPutAll%3A%20super%20printString%3B%0A%09%09%09nextPutAll%3A%20%27%28%27.%0A%09%09%09%09self%20associations%20%0A%09%09%09%09%09do%3A%20%5B%3AanAssociation%7C%20%20%0A%09%09%09%09%09%09aStream%20%0A%09%09%09%09%09%09%09nextPutAll%3A%20anAssociation%20key%20printString%3B%0A%09%09%09%09%09%09%09%09nextPutAll%3A%20%27%20-%3E%20%27%3B%0A%09%09%09%09%09%09%09%09nextPutAll%3A%20anAssociation%20value%20printString%5D%0A%09%09%09%09%09%09%09separatedBy%3A%20%5BaStream%20nextPutAll%3A%20%27%20%2C%20%27%5D.%0A%09%09%09%09%09%09aStream%20nextPutAll%3A%20%27%29%27%5D'),
-messageSends: ["streamContents:", "nextPutAll:", "printString", "do:separatedBy:", "associations", "key", "value"],
-referencedClasses: ["String"]
+source: unescape('resetContents%0A%09self%20reset.%0A%09self%20setStreamSize%3A%200'),
+messageSends: ["reset", "setStreamSize:"],
+referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_storeOn_'),
+unescape('_setCollection_'),
 smalltalk.method({
-selector: unescape('storeOn%3A'),
-category: 'printing',
-fn: function (aStream) {
+selector: unescape('setCollection%3A'),
+category: 'accessing',
+fn: function (aCollection) {
 var self=this;
-smalltalk.send(aStream, "_nextPutAll_", [unescape("%23%7B")]);
-smalltalk.send(smalltalk.send(self, "_associations", []), "_do_separatedBy_", [(function(each){return smalltalk.send(each, "_storeOn_", [aStream]);}), (function(){return smalltalk.send(aStream, "_nextPutAll_", [". "]);})]);
-smalltalk.send(aStream, "_nextPutAll_", [unescape("%7D")]);
+(self['@collection']=aCollection);
 return self;},
-args: ["aStream"],
-source: unescape('storeOn%3A%20aStream%0A%09aStream%20nextPutAll%3A%20%27%23%7B%27.%0A%09self%20associations%0A%09%09do%3A%20%5B%3Aeach%20%7C%20each%20storeOn%3A%20aStream%5D%0A%09%09separatedBy%3A%20%5B%20aStream%20nextPutAll%3A%20%27.%20%27%5D.%0A%09aStream%20nextPutAll%3A%20%27%7D%27'),
-messageSends: ["nextPutAll:", "do:separatedBy:", "associations", "storeOn:"],
+args: ["aCollection"],
+source: unescape('setCollection%3A%20aCollection%0A%09collection%20%3A%3D%20aCollection'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_includesKey_'),
+unescape('_setStreamSize_'),
 smalltalk.method({
-selector: unescape('includesKey%3A'),
-category: 'testing',
-fn: function (aKey) {
+selector: unescape('setStreamSize%3A'),
+category: 'accessing',
+fn: function (anInteger) {
 var self=this;
-return self.hasOwnProperty(aKey);
+(self['@streamSize']=anInteger);
 return self;},
-args: ["aKey"],
-source: unescape('includesKey%3A%20aKey%0A%09%3Creturn%20self.hasOwnProperty%28aKey%29%3E'),
+args: ["anInteger"],
+source: unescape('setStreamSize%3A%20anInteger%0A%09streamSize%20%3A%3D%20anInteger'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_asDictionary'),
+unescape('_setToEnd'),
 smalltalk.method({
-selector: unescape('asDictionary'),
-category: 'converting',
+selector: unescape('setToEnd'),
+category: 'positioning',
 fn: function () {
 var self=this;
-return smalltalk.send((smalltalk.Dictionary || Dictionary), "_fromPairs_", [smalltalk.send(self, "_associations", [])]);
+smalltalk.send(self, "_position_", [smalltalk.send(self, "_size", [])]);
 return self;},
 args: [],
-source: unescape('asDictionary%0A%09%5EDictionary%20fromPairs%3A%20self%20associations'),
-messageSends: ["fromPairs:", "associations"],
-referencedClasses: ["Dictionary"]
+source: unescape('setToEnd%0A%09self%20position%3A%20self%20size'),
+messageSends: ["position:", "size"],
+referencedClasses: []
 }),
-smalltalk.HashedCollection);
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('asJSON'),
-category: 'converting',
-fn: function (){
+selector: unescape('size'),
+category: 'accessing',
+fn: function () {
 var self=this;
-var c=nil;
-(c=smalltalk.send(smalltalk.send(self, "_class", []), "_new", []));
-smalltalk.send(self, "_keysAndValuesDo_", [(function(key, value){return smalltalk.send(c, "_at_put_", [key, smalltalk.send(value, "_asJSON", [])]);})]);
-return c;
+return smalltalk.send(self, "_streamSize", []);
 return self;},
 args: [],
-source: unescape('asJSON%0A%09%7C%20c%20%7C%0A%09c%20%3A%3D%20self%20class%20new.%0A%09self%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%09c%20at%3A%20key%20put%3A%20value%20asJSON%5D.%0A%09%5Ec'),
-messageSends: ["new", "class", "keysAndValuesDo:", "at:put:", "asJSON"],
+source: unescape('size%0A%09%5Eself%20streamSize'),
+messageSends: ["streamSize"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection);
-
+smalltalk.Stream);
 
 smalltalk.addMethod(
-unescape('_fromPairs_'),
+unescape('_skip_'),
 smalltalk.method({
-selector: unescape('fromPairs%3A'),
-category: 'instance creation',
-fn: function (aCollection) {
+selector: unescape('skip%3A'),
+category: 'positioning',
+fn: function (anInteger) {
 var self=this;
-var dict=nil;
-(dict=smalltalk.send(self, "_new", []));
-smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(dict, "_add_", [each]);})]);
-return dict;
+smalltalk.send(self, "_position_", [smalltalk.send(((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +anInteger : smalltalk.send($receiver, "__plus", [anInteger])), "_min_max_", [smalltalk.send(self, "_size", []), (0)])]);
 return self;},
-args: ["aCollection"],
-source: unescape('fromPairs%3A%20aCollection%0A%09%7C%20dict%20%7C%0A%09dict%20%3A%3D%20self%20new.%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%20dict%20add%3A%20each%5D.%0A%09%5Edict'),
-messageSends: ["new", "do:", "add:"],
+args: ["anInteger"],
+source: unescape('skip%3A%20anInteger%0A%09self%20position%3A%20%28%28self%20position%20+%20anInteger%29%20min%3A%20self%20size%20max%3A%200%29'),
+messageSends: ["position:", "min:max:", unescape("+"), "position", "size"],
 referencedClasses: []
 }),
-smalltalk.HashedCollection.klass);
-
+smalltalk.Stream);
 
-smalltalk.addClass('Dictionary', smalltalk.HashedCollection, ['keys', 'values'], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_at_ifAbsent_'),
+unescape('_streamSize'),
 smalltalk.method({
-selector: unescape('at%3AifAbsent%3A'),
+selector: unescape('streamSize'),
 category: 'accessing',
-fn: function (aKey, aBlock) {
+fn: function () {
 var self=this;
-
-		var index;
-		for(var i=0;i<self['@keys'].length;i++){
-			if(self['@keys'][i].__eq(aKey)) {index = i;}
-		};
-		if(typeof index === 'undefined') {
-			return aBlock();
-		} else {
-			return self['@values'][index];
-		}
-	;
+return self['@streamSize'];
 return self;},
-args: ["aKey", "aBlock"],
-source: unescape('at%3A%20aKey%20ifAbsent%3A%20aBlock%0A%09%3C%0A%09%09var%20index%3B%0A%09%09for%28var%20i%3D0%3Bi%3Cself%5B%27@keys%27%5D.length%3Bi++%29%7B%0A%09%09%09if%28self%5B%27@keys%27%5D%5Bi%5D.__eq%28aKey%29%29%20%7Bindex%20%3D%20i%3B%7D%0A%09%09%7D%3B%0A%09%09if%28typeof%20index%20%3D%3D%3D%20%27undefined%27%29%20%7B%0A%09%09%09return%20aBlock%28%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09return%20self%5B%27@values%27%5D%5Bindex%5D%3B%0A%09%09%7D%0A%09%3E'),
+args: [],
+source: unescape('streamSize%0A%09%5EstreamSize'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Dictionary);
+smalltalk.Stream);
+
 
 smalltalk.addMethod(
-unescape('_keys'),
+unescape('_on_'),
 smalltalk.method({
-selector: unescape('keys'),
-category: 'accessing',
-fn: function () {
+selector: unescape('on%3A'),
+category: 'instance creation',
+fn: function (aCollection) {
 var self=this;
-return smalltalk.send(self['@keys'], "_copy", []);
+return (function($rec){smalltalk.send($rec, "_setCollection_", [aCollection]);smalltalk.send($rec, "_setStreamSize_", [smalltalk.send(aCollection, "_size", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-args: [],
-source: unescape('keys%0A%09%5Ekeys%20copy'),
-messageSends: ["copy"],
+args: ["aCollection"],
+source: unescape('on%3A%20aCollection%0A%09%20%20%20%20%5Eself%20new%20%0A%09%09setCollection%3A%20aCollection%3B%0A%09%09setStreamSize%3A%20aCollection%20size%3B%0A%09%09yourself'),
+messageSends: ["setCollection:", "setStreamSize:", "size", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.Dictionary);
+smalltalk.Stream.klass);
+
 
+smalltalk.addClass('StringStream', smalltalk.Stream, [], 'Kernel-Collections');
 smalltalk.addMethod(
-unescape('_values'),
+unescape('_cr'),
 smalltalk.method({
-selector: unescape('values'),
-category: 'accessing',
+selector: unescape('cr'),
+category: 'writing',
 fn: function () {
 var self=this;
-return smalltalk.send(self['@values'], "_copy", []);
+return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_cr", [])]);
 return self;},
 args: [],
-source: unescape('values%0A%09%5Evalues%20copy'),
-messageSends: ["copy"],
-referencedClasses: []
+source: unescape('cr%0A%09%5Eself%20nextPutAll%3A%20String%20cr'),
+messageSends: ["nextPutAll:", "cr"],
+referencedClasses: ["String"]
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_crlf'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-category: 'accessing',
-fn: function (aKey, aValue) {
+selector: unescape('crlf'),
+category: 'writing',
+fn: function () {
 var self=this;
-
-		var index = self['@keys'].indexOf(aKey);
-		if(index === -1) {
-			self['@values'].push(aValue);
-			self['@keys'].push(aKey);
-		} else {
-			self['@values'][index] = aValue;
-		};
-
-		return aValue;
-	;
+return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_crlf", [])]);
 return self;},
-args: ["aKey", "aValue"],
-source: unescape('at%3A%20aKey%20put%3A%20aValue%0A%09%3C%0A%09%09var%20index%20%3D%20self%5B%27@keys%27%5D.indexOf%28aKey%29%3B%0A%09%09if%28index%20%3D%3D%3D%20-1%29%20%7B%0A%09%09%09self%5B%27@values%27%5D.push%28aValue%29%3B%0A%09%09%09self%5B%27@keys%27%5D.push%28aKey%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09self%5B%27@values%27%5D%5Bindex%5D%20%3D%20aValue%3B%0A%09%09%7D%3B%0A%0A%09%09return%20aValue%3B%0A%09%3E'),
-messageSends: [],
-referencedClasses: []
+args: [],
+source: unescape('crlf%0A%09%5Eself%20nextPutAll%3A%20String%20crlf'),
+messageSends: ["nextPutAll:", "crlf"],
+referencedClasses: ["String"]
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_removeKey_ifAbsent_'),
+unescape('_lf'),
 smalltalk.method({
-selector: unescape('removeKey%3AifAbsent%3A'),
-category: 'adding/removing',
-fn: function (aKey, aBlock) {
+selector: unescape('lf'),
+category: 'writing',
+fn: function () {
 var self=this;
-
-		var index = self['@keys'].indexOf(aKey);
-		if(index === -1) {
-			return aBlock()
-		} else {
-			self['@keys'].splice(i, 1);
-			self['@values'].splice(i, 1);
-			return aKey
-		};
-	;
+return smalltalk.send(self, "_nextPutAll_", [smalltalk.send((smalltalk.String || String), "_lf", [])]);
 return self;},
-args: ["aKey", "aBlock"],
-source: unescape('removeKey%3A%20aKey%20ifAbsent%3A%20aBlock%0A%09%3C%0A%09%09var%20index%20%3D%20self%5B%27@keys%27%5D.indexOf%28aKey%29%3B%0A%09%09if%28index%20%3D%3D%3D%20-1%29%20%7B%0A%09%09%09return%20aBlock%28%29%0A%09%09%7D%20else%20%7B%0A%09%09%09self%5B%27@keys%27%5D.splice%28i%2C%201%29%3B%0A%09%09%09self%5B%27@values%27%5D.splice%28i%2C%201%29%3B%0A%09%09%09return%20aKey%0A%09%09%7D%3B%0A%09%3E'),
-messageSends: [],
-referencedClasses: []
+args: [],
+source: unescape('lf%0A%09%5Eself%20nextPutAll%3A%20String%20lf'),
+messageSends: ["nextPutAll:", "lf"],
+referencedClasses: ["String"]
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_next_'),
 smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
-fn: function () {
+selector: unescape('next%3A'),
+category: 'reading',
+fn: function (anInteger) {
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.HashedCollection);
-(self['@keys']=[]);
-(self['@values']=[]);
+var tempCollection=nil;
+(tempCollection=smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_class", []), "_new", []));
+smalltalk.send(anInteger, "_timesRepeat_", [(function(){return ((($receiver = smalltalk.send(self, "_atEnd", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (tempCollection=smalltalk.send(tempCollection, "__comma", [smalltalk.send(self, "_next", [])]));})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (tempCollection=smalltalk.send(tempCollection, "__comma", [smalltalk.send(self, "_next", [])]));})]));})]);
+return tempCollection;
 return self;},
-args: [],
-source: unescape('initialize%0A%09super%20initialize.%0A%09keys%20%3A%3D%20%23%28%29.%0A%09values%20%3A%3D%20%23%28%29'),
-messageSends: ["initialize"],
+args: ["anInteger"],
+source: unescape('next%3A%20anInteger%0A%09%7C%20tempCollection%20%7C%0A%09tempCollection%20%3A%3D%20self%20collection%20class%20new.%0A%09anInteger%20timesRepeat%3A%20%5B%0A%09%20%20%20%20self%20atEnd%20ifFalse%3A%20%5B%0A%09%09tempCollection%20%3A%3D%20tempCollection%2C%20self%20next%5D%5D.%0A%09%5EtempCollection'),
+messageSends: ["new", "class", "collection", "timesRepeat:", "ifFalse:", "atEnd", unescape("%2C"), "next"],
 referencedClasses: []
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_includesKey_'),
+unescape('_nextPut_'),
 smalltalk.method({
-selector: unescape('includesKey%3A'),
-category: 'testing',
-fn: function (aKey) {
+selector: unescape('nextPut%3A'),
+category: 'writing',
+fn: function (aString) {
 var self=this;
-return smalltalk.send(self['@keys'], "_includes_", [aKey]);
+smalltalk.send(self, "_nextPutAll_", [aString]);
 return self;},
-args: ["aKey"],
-source: unescape('includesKey%3A%20aKey%0A%09%5Ekeys%20includes%3A%20aKey'),
-messageSends: ["includes:"],
+args: ["aString"],
+source: unescape('nextPut%3A%20aString%0A%09self%20nextPutAll%3A%20aString'),
+messageSends: ["nextPutAll:"],
 referencedClasses: []
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_asHashedCollection'),
+unescape('_nextPutAll_'),
 smalltalk.method({
-selector: unescape('asHashedCollection'),
-category: 'converting',
-fn: function () {
+selector: unescape('nextPutAll%3A'),
+category: 'writing',
+fn: function (aString) {
 var self=this;
-return smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_fromPairs_", [smalltalk.send(self, "_associations", [])]);
+smalltalk.send(self, "_setCollection_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [(1), smalltalk.send(self, "_position", [])]), "__comma", [aString]), "__comma", [smalltalk.send(smalltalk.send(self, "_collection", []), "_copyFrom_to_", [((($receiver = ((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]))).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])])), smalltalk.send(smalltalk.send(self, "_collection", []), "_size", [])])])]);
+smalltalk.send(self, "_position_", [((($receiver = smalltalk.send(self, "_position", [])).klass === smalltalk.Number) ? $receiver +smalltalk.send(aString, "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(aString, "_size", [])]))]);
+smalltalk.send(self, "_setStreamSize_", [smalltalk.send(smalltalk.send(self, "_streamSize", []), "_max_", [smalltalk.send(self, "_position", [])])]);
 return self;},
-args: [],
-source: unescape('asHashedCollection%0A%09%5EHashedCollection%20fromPairs%3A%20self%20associations'),
-messageSends: ["fromPairs:", "associations"],
-referencedClasses: ["HashedCollection"]
+args: ["aString"],
+source: unescape('nextPutAll%3A%20aString%0A%09self%20setCollection%3A%20%0A%09%20%20%20%20%28self%20collection%20copyFrom%3A%201%20to%3A%20self%20position%29%2C%0A%09%20%20%20%20aString%2C%0A%09%20%20%20%20%28self%20collection%20copyFrom%3A%20%28self%20position%20+%201%20+%20aString%20size%29%20to%3A%20self%20collection%20size%29.%0A%09self%20position%3A%20self%20position%20+%20aString%20size.%0A%09self%20setStreamSize%3A%20%28self%20streamSize%20max%3A%20self%20position%29'),
+messageSends: ["setCollection:", unescape("%2C"), "copyFrom:to:", "collection", "position", unescape("+"), "size", "position:", "setStreamSize:", "max:", "streamSize"],
+referencedClasses: []
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_space'),
 smalltalk.method({
-selector: unescape('asJSON'),
-category: 'converting',
-fn: function (){
+selector: unescape('space'),
+category: 'writing',
+fn: function () {
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_asHashedCollection", []), "_asJSON", []);
+smalltalk.send(self, "_nextPut_", [" "]);
 return self;},
 args: [],
-source: unescape('asJSON%0A%09%5Eself%20asHashedCollection%20asJSON'),
-messageSends: ["asJSON", "asHashedCollection"],
+source: unescape('space%0A%09self%20nextPut%3A%20%27%20%27'),
+messageSends: ["nextPut:"],
 referencedClasses: []
 }),
-smalltalk.Dictionary);
+smalltalk.StringStream);
 
 
 
diff --git a/amber/src/js/Kernel-Exceptions.deploy.js b/amber/src/js/Kernel-Exceptions.deploy.js
index ec8539d71cb..b06fca01abd 100644
--- a/amber/src/js/Kernel-Exceptions.deploy.js
+++ b/amber/src/js/Kernel-Exceptions.deploy.js
@@ -1,76 +1,76 @@
 smalltalk.addPackage('Kernel-Exceptions', {});
 smalltalk.addClass('Error', smalltalk.Object, ['messageText'], 'Kernel-Exceptions');
 smalltalk.addMethod(
-'_messageText',
+unescape('_context'),
 smalltalk.method({
-selector: 'messageText',
+selector: unescape('context'),
 fn: function (){
 var self=this;
-return self['@messageText'];
+return self.context;
 return self;}
 }),
 smalltalk.Error);
 
 smalltalk.addMethod(
-'_messageText_',
+unescape('_isSmalltalkError'),
 smalltalk.method({
-selector: 'messageText:',
-fn: function (aString){
+selector: unescape('isSmalltalkError'),
+fn: function (){
 var self=this;
-(self['@messageText']=aString);
+return self.smalltalkError === true;
 return self;}
 }),
 smalltalk.Error);
 
 smalltalk.addMethod(
-'_signal',
+unescape('_jsStack'),
 smalltalk.method({
-selector: 'signal',
+selector: unescape('jsStack'),
 fn: function (){
 var self=this;
-self.context = smalltalk.getThisContext(); self.smalltalkError = true; throw(self);
+return self.stack;
 return self;}
 }),
 smalltalk.Error);
 
 smalltalk.addMethod(
-'_context',
+unescape('_messageText'),
 smalltalk.method({
-selector: 'context',
+selector: unescape('messageText'),
 fn: function (){
 var self=this;
-return self.context;
+return self['@messageText'];
 return self;}
 }),
 smalltalk.Error);
 
 smalltalk.addMethod(
-'_jsStack',
+unescape('_messageText_'),
 smalltalk.method({
-selector: 'jsStack',
-fn: function (){
+selector: unescape('messageText%3A'),
+fn: function (aString){
 var self=this;
-return self.stack;
+(self['@messageText']=aString);
 return self;}
 }),
 smalltalk.Error);
 
 smalltalk.addMethod(
-'_isSmalltalkError',
+unescape('_signal'),
 smalltalk.method({
-selector: 'isSmalltalkError',
+selector: unescape('signal'),
 fn: function (){
 var self=this;
-return self.smalltalkError === true;
+self.context = smalltalk.getThisContext(); self.smalltalkError = true; throw(self);
 return self;}
 }),
 smalltalk.Error);
 
 
 smalltalk.addMethod(
-'_signal_',
+unescape('_signal_'),
 smalltalk.method({
-selector: 'signal:',
+selector: unescape('signal%3A'),
 fn: function (aString){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_messageText_", [aString]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send(self, "_new", []));
@@ -81,9 +81,9 @@ smalltalk.Error.klass);
 
 smalltalk.addClass('MessageNotUnderstood', smalltalk.Error, ['message', 'receiver'], 'Kernel-Exceptions');
 smalltalk.addMethod(
-'_message',
+unescape('_message'),
 smalltalk.method({
-selector: 'message',
+selector: unescape('message'),
 fn: function (){
 var self=this;
 return self['@message'];
@@ -92,9 +92,9 @@ return self;}
 smalltalk.MessageNotUnderstood);
 
 smalltalk.addMethod(
-'_message_',
+unescape('_message_'),
 smalltalk.method({
-selector: 'message:',
+selector: unescape('message%3A'),
 fn: function (aMessage){
 var self=this;
 (self['@message']=aMessage);
@@ -103,34 +103,34 @@ return self;}
 smalltalk.MessageNotUnderstood);
 
 smalltalk.addMethod(
-'_receiver',
+unescape('_messageText'),
 smalltalk.method({
-selector: 'receiver',
+selector: unescape('messageText'),
 fn: function (){
 var self=this;
-return self['@receiver'];
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_asString", []), "__comma", [unescape("%20does%20not%20understand%20%23")]), "__comma", [smalltalk.send(smalltalk.send(self, "_message", []), "_selector", [])]);
 return self;}
 }),
 smalltalk.MessageNotUnderstood);
 
 smalltalk.addMethod(
-'_receiver_',
+unescape('_receiver'),
 smalltalk.method({
-selector: 'receiver:',
-fn: function (anObject){
+selector: unescape('receiver'),
+fn: function (){
 var self=this;
-(self['@receiver']=anObject);
+return self['@receiver'];
 return self;}
 }),
 smalltalk.MessageNotUnderstood);
 
 smalltalk.addMethod(
-'_messageText',
+unescape('_receiver_'),
 smalltalk.method({
-selector: 'messageText',
-fn: function (){
+selector: unescape('receiver%3A'),
+fn: function (anObject){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_asString", []), "__comma", [unescape("%20does%20not%20understand%20%23")]), "__comma", [smalltalk.send(smalltalk.send(self, "_message", []), "_selector", [])]);
+(self['@receiver']=anObject);
 return self;}
 }),
 smalltalk.MessageNotUnderstood);
@@ -139,9 +139,9 @@ smalltalk.MessageNotUnderstood);
 
 smalltalk.addClass('ErrorHandler', smalltalk.Object, [], 'Kernel-Exceptions');
 smalltalk.addMethod(
-'_handleError_',
+unescape('_handleError_'),
 smalltalk.method({
-selector: 'handleError:',
+selector: unescape('handleError%3A'),
 fn: function (anError){
 var self=this;
 (($receiver = smalltalk.send(anError, "_context", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_logErrorContext_", [smalltalk.send(anError, "_context", [])]);})() : nil;
@@ -151,32 +151,32 @@ return self;}
 smalltalk.ErrorHandler);
 
 smalltalk.addMethod(
-'_logContext_',
+unescape('_log_'),
 smalltalk.method({
-selector: 'logContext:',
-fn: function (aContext){
+selector: unescape('log%3A'),
+fn: function (aString){
 var self=this;
-(($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_logContext_", [smalltalk.send(aContext, "_home", [])]);})() : nil;
-smalltalk.send(self, "_log_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aContext, "_receiver", []), "_asString", []), "__comma", [unescape("%3E%3E")]), "__comma", [smalltalk.send(aContext, "_selector", [])])]);
+smalltalk.send((typeof console == 'undefined' ? nil : console), "_log_", [aString]);
 return self;}
 }),
 smalltalk.ErrorHandler);
 
 smalltalk.addMethod(
-'_logErrorContext_',
+unescape('_logContext_'),
 smalltalk.method({
-selector: 'logErrorContext:',
+selector: unescape('logContext%3A'),
 fn: function (aContext){
 var self=this;
-(($receiver = aContext) != nil && $receiver != undefined) ? (function(){return (($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_logContext_", [smalltalk.send(aContext, "_home", [])]);})() : nil;})() : nil;
+(($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_logContext_", [smalltalk.send(aContext, "_home", [])]);})() : nil;
+smalltalk.send(self, "_log_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aContext, "_receiver", []), "_asString", []), "__comma", [unescape("%3E%3E")]), "__comma", [smalltalk.send(aContext, "_selector", [])])]);
 return self;}
 }),
 smalltalk.ErrorHandler);
 
 smalltalk.addMethod(
-'_logError_',
+unescape('_logError_'),
 smalltalk.method({
-selector: 'logError:',
+selector: unescape('logError%3A'),
 fn: function (anError){
 var self=this;
 smalltalk.send(self, "_log_", [smalltalk.send(anError, "_messageText", [])]);
@@ -185,12 +185,12 @@ return self;}
 smalltalk.ErrorHandler);
 
 smalltalk.addMethod(
-'_log_',
+unescape('_logErrorContext_'),
 smalltalk.method({
-selector: 'log:',
-fn: function (aString){
+selector: unescape('logErrorContext%3A'),
+fn: function (aContext){
 var self=this;
-smalltalk.send((typeof console == 'undefined' ? nil : console), "_log_", [aString]);
+(($receiver = aContext) != nil && $receiver != undefined) ? (function(){return (($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_logContext_", [smalltalk.send(aContext, "_home", [])]);})() : nil;})() : nil;
 return self;}
 }),
 smalltalk.ErrorHandler);
@@ -198,9 +198,9 @@ smalltalk.ErrorHandler);
 
 smalltalk.ErrorHandler.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-'_current',
+unescape('_current'),
 smalltalk.method({
-selector: 'current',
+selector: unescape('current'),
 fn: function (){
 var self=this;
 return (($receiver = self['@current']) == nil || $receiver == undefined) ? (function(){return (self['@current']=smalltalk.send(self, "_new", []));})() : $receiver;
@@ -209,9 +209,9 @@ return self;}
 smalltalk.ErrorHandler.klass);
 
 smalltalk.addMethod(
-'_initialize',
+unescape('_initialize'),
 smalltalk.method({
-selector: 'initialize',
+selector: unescape('initialize'),
 fn: function (){
 var self=this;
 smalltalk.send(self, "_register", []);
@@ -220,9 +220,9 @@ return self;}
 smalltalk.ErrorHandler.klass);
 
 smalltalk.addMethod(
-'_register',
+unescape('_register'),
 smalltalk.method({
-selector: 'register',
+selector: unescape('register'),
 fn: function (){
 var self=this;
 smalltalk.send((smalltalk.ErrorHandler || ErrorHandler), "_setCurrent_", [smalltalk.send(self, "_new", [])]);
@@ -231,9 +231,9 @@ return self;}
 smalltalk.ErrorHandler.klass);
 
 smalltalk.addMethod(
-'_setCurrent_',
+unescape('_setCurrent_'),
 smalltalk.method({
-selector: 'setCurrent:',
+selector: unescape('setCurrent%3A'),
 fn: function (anHandler){
 var self=this;
 (self['@current']=anHandler);
diff --git a/amber/src/js/Kernel-Exceptions.js b/amber/src/js/Kernel-Exceptions.js
index 970d9f244b6..459163afcf9 100644
--- a/amber/src/js/Kernel-Exceptions.js
+++ b/amber/src/js/Kernel-Exceptions.js
@@ -1,96 +1,96 @@
 smalltalk.addPackage('Kernel-Exceptions', {});
 smalltalk.addClass('Error', smalltalk.Object, ['messageText'], 'Kernel-Exceptions');
 smalltalk.addMethod(
-unescape('_messageText'),
+unescape('_context'),
 smalltalk.method({
-selector: unescape('messageText'),
+selector: unescape('context'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@messageText'];
+return self.context;
 return self;},
 args: [],
-source: unescape('messageText%0A%09%5EmessageText'),
+source: unescape('context%0A%09%3Creturn%20self.context%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Error);
 
 smalltalk.addMethod(
-unescape('_messageText_'),
+unescape('_isSmalltalkError'),
 smalltalk.method({
-selector: unescape('messageText%3A'),
-category: 'accessing',
-fn: function (aString){
+selector: unescape('isSmalltalkError'),
+category: 'testing',
+fn: function (){
 var self=this;
-(self['@messageText']=aString);
+return self.smalltalkError === true;
 return self;},
-args: ["aString"],
-source: unescape('messageText%3A%20aString%0A%09messageText%20%3A%3D%20aString'),
+args: [],
+source: unescape('isSmalltalkError%0A%09%3Creturn%20self.smalltalkError%20%3D%3D%3D%20true%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Error);
 
 smalltalk.addMethod(
-unescape('_signal'),
+unescape('_jsStack'),
 smalltalk.method({
-selector: unescape('signal'),
-category: 'signaling',
+selector: unescape('jsStack'),
+category: 'accessing',
 fn: function (){
 var self=this;
-self.context = smalltalk.getThisContext(); self.smalltalkError = true; throw(self);
+return self.stack;
 return self;},
 args: [],
-source: unescape('signal%0A%09%3Cself.context%20%3D%20smalltalk.getThisContext%28%29%3B%20self.smalltalkError%20%3D%20true%3B%20throw%28self%29%3E'),
+source: unescape('jsStack%0A%09%3Creturn%20self.stack%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Error);
 
 smalltalk.addMethod(
-unescape('_context'),
+unescape('_messageText'),
 smalltalk.method({
-selector: unescape('context'),
+selector: unescape('messageText'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self.context;
+return self['@messageText'];
 return self;},
 args: [],
-source: unescape('context%0A%09%3Creturn%20self.context%3E'),
+source: unescape('messageText%0A%09%5EmessageText'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Error);
 
 smalltalk.addMethod(
-unescape('_jsStack'),
+unescape('_messageText_'),
 smalltalk.method({
-selector: unescape('jsStack'),
+selector: unescape('messageText%3A'),
 category: 'accessing',
-fn: function (){
+fn: function (aString){
 var self=this;
-return self.stack;
+(self['@messageText']=aString);
 return self;},
-args: [],
-source: unescape('jsStack%0A%09%3Creturn%20self.stack%3E'),
+args: ["aString"],
+source: unescape('messageText%3A%20aString%0A%09messageText%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Error);
 
 smalltalk.addMethod(
-unescape('_isSmalltalkError'),
+unescape('_signal'),
 smalltalk.method({
-selector: unescape('isSmalltalkError'),
-category: 'testing',
+selector: unescape('signal'),
+category: 'signaling',
 fn: function (){
 var self=this;
-return self.smalltalkError === true;
+self.context = smalltalk.getThisContext(); self.smalltalkError = true; throw(self);
 return self;},
 args: [],
-source: unescape('isSmalltalkError%0A%09%3Creturn%20self.smalltalkError%20%3D%3D%3D%20true%3E'),
+source: unescape('signal%0A%09%3Cself.context%20%3D%20smalltalk.getThisContext%28%29%3B%20self.smalltalkError%20%3D%20true%3B%20throw%28self%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -147,6 +147,22 @@ referencedClasses: []
 }),
 smalltalk.MessageNotUnderstood);
 
+smalltalk.addMethod(
+unescape('_messageText'),
+smalltalk.method({
+selector: unescape('messageText'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_asString", []), "__comma", [unescape("%20does%20not%20understand%20%23")]), "__comma", [smalltalk.send(smalltalk.send(self, "_message", []), "_selector", [])]);
+return self;},
+args: [],
+source: unescape('messageText%0A%09%5Eself%20receiver%20asString%2C%20%27%20does%20not%20understand%20%23%27%2C%20self%20message%20selector'),
+messageSends: [unescape("%2C"), "asString", "receiver", "selector", "message"],
+referencedClasses: []
+}),
+smalltalk.MessageNotUnderstood);
+
 smalltalk.addMethod(
 unescape('_receiver'),
 smalltalk.method({
@@ -179,22 +195,6 @@ referencedClasses: []
 }),
 smalltalk.MessageNotUnderstood);
 
-smalltalk.addMethod(
-unescape('_messageText'),
-smalltalk.method({
-selector: unescape('messageText'),
-category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_asString", []), "__comma", [unescape("%20does%20not%20understand%20%23")]), "__comma", [smalltalk.send(smalltalk.send(self, "_message", []), "_selector", [])]);
-return self;},
-args: [],
-source: unescape('messageText%0A%09%5Eself%20receiver%20asString%2C%20%27%20does%20not%20understand%20%23%27%2C%20self%20message%20selector'),
-messageSends: [unescape("%2C"), "asString", "receiver", "selector", "message"],
-referencedClasses: []
-}),
-smalltalk.MessageNotUnderstood);
-
 
 
 smalltalk.addClass('ErrorHandler', smalltalk.Object, [], 'Kernel-Exceptions');
@@ -216,34 +216,34 @@ referencedClasses: []
 smalltalk.ErrorHandler);
 
 smalltalk.addMethod(
-unescape('_logContext_'),
+unescape('_log_'),
 smalltalk.method({
-selector: unescape('logContext%3A'),
+selector: unescape('log%3A'),
 category: 'private',
-fn: function (aContext){
+fn: function (aString){
 var self=this;
-(($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_logContext_", [smalltalk.send(aContext, "_home", [])]);})() : nil;
-smalltalk.send(self, "_log_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aContext, "_receiver", []), "_asString", []), "__comma", [unescape("%3E%3E")]), "__comma", [smalltalk.send(aContext, "_selector", [])])]);
+smalltalk.send((typeof console == 'undefined' ? nil : console), "_log_", [aString]);
 return self;},
-args: ["aContext"],
-source: unescape('logContext%3A%20aContext%0A%09aContext%20home%20ifNotNil%3A%20%5B%0A%09%09self%20logContext%3A%20aContext%20home%5D.%0A%09self%20log%3A%20aContext%20receiver%20asString%2C%20%27%3E%3E%27%2C%20aContext%20selector'),
-messageSends: ["ifNotNil:", "home", "logContext:", "log:", unescape("%2C"), "asString", "receiver", "selector"],
+args: ["aString"],
+source: unescape('log%3A%20aString%0A%09console%20log%3A%20aString'),
+messageSends: ["log:"],
 referencedClasses: []
 }),
 smalltalk.ErrorHandler);
 
 smalltalk.addMethod(
-unescape('_logErrorContext_'),
+unescape('_logContext_'),
 smalltalk.method({
-selector: unescape('logErrorContext%3A'),
+selector: unescape('logContext%3A'),
 category: 'private',
 fn: function (aContext){
 var self=this;
-(($receiver = aContext) != nil && $receiver != undefined) ? (function(){return (($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_logContext_", [smalltalk.send(aContext, "_home", [])]);})() : nil;})() : nil;
+(($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_logContext_", [smalltalk.send(aContext, "_home", [])]);})() : nil;
+smalltalk.send(self, "_log_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aContext, "_receiver", []), "_asString", []), "__comma", [unescape("%3E%3E")]), "__comma", [smalltalk.send(aContext, "_selector", [])])]);
 return self;},
 args: ["aContext"],
-source: unescape('logErrorContext%3A%20aContext%0A%09aContext%20ifNotNil%3A%20%5B%0A%09%09aContext%20home%20ifNotNil%3A%20%5B%0A%09%09%09self%20logContext%3A%20aContext%20home%5D%5D'),
-messageSends: ["ifNotNil:", "home", "logContext:"],
+source: unescape('logContext%3A%20aContext%0A%09aContext%20home%20ifNotNil%3A%20%5B%0A%09%09self%20logContext%3A%20aContext%20home%5D.%0A%09self%20log%3A%20aContext%20receiver%20asString%2C%20%27%3E%3E%27%2C%20aContext%20selector'),
+messageSends: ["ifNotNil:", "home", "logContext:", "log:", unescape("%2C"), "asString", "receiver", "selector"],
 referencedClasses: []
 }),
 smalltalk.ErrorHandler);
@@ -265,17 +265,17 @@ referencedClasses: []
 smalltalk.ErrorHandler);
 
 smalltalk.addMethod(
-unescape('_log_'),
+unescape('_logErrorContext_'),
 smalltalk.method({
-selector: unescape('log%3A'),
+selector: unescape('logErrorContext%3A'),
 category: 'private',
-fn: function (aString){
+fn: function (aContext){
 var self=this;
-smalltalk.send((typeof console == 'undefined' ? nil : console), "_log_", [aString]);
+(($receiver = aContext) != nil && $receiver != undefined) ? (function(){return (($receiver = smalltalk.send(aContext, "_home", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_logContext_", [smalltalk.send(aContext, "_home", [])]);})() : nil;})() : nil;
 return self;},
-args: ["aString"],
-source: unescape('log%3A%20aString%0A%09console%20log%3A%20aString'),
-messageSends: ["log:"],
+args: ["aContext"],
+source: unescape('logErrorContext%3A%20aContext%0A%09aContext%20ifNotNil%3A%20%5B%0A%09%09aContext%20home%20ifNotNil%3A%20%5B%0A%09%09%09self%20logContext%3A%20aContext%20home%5D%5D'),
+messageSends: ["ifNotNil:", "home", "logContext:"],
 referencedClasses: []
 }),
 smalltalk.ErrorHandler);
diff --git a/amber/src/js/Kernel-Methods.deploy.js b/amber/src/js/Kernel-Methods.deploy.js
index b86481fc7bf..4b9771b6a93 100644
--- a/amber/src/js/Kernel-Methods.deploy.js
+++ b/amber/src/js/Kernel-Methods.deploy.js
@@ -1,202 +1,122 @@
 smalltalk.addPackage('Kernel-Methods', {});
-smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
-smalltalk.addMethod(
-unescape('_selector'),
-smalltalk.method({
-selector: unescape('selector'),
-fn: function () {
-    var self = this;
-    return self['@selector'];
-    return self;
-}
-}),
-smalltalk.Message);
-
-smalltalk.addMethod(
-unescape('_selector_'),
-smalltalk.method({
-selector: unescape('selector%3A'),
-fn: function (aString) {
-    var self = this;
-    self['@selector'] = aString;
-    return self;
-}
-}),
-smalltalk.Message);
-
-smalltalk.addMethod(
-unescape('_arguments_'),
-smalltalk.method({
-selector: unescape('arguments%3A'),
-fn: function (anArray) {
-    var self = this;
-    self['@arguments'] = anArray;
-    return self;
-}
-}),
-smalltalk.Message);
-
-smalltalk.addMethod(
-unescape('_arguments'),
-smalltalk.method({
-selector: unescape('arguments'),
-fn: function () {
-    var self = this;
-    return self['@arguments'];
-    return self;
-}
-}),
-smalltalk.Message);
-
-smalltalk.addMethod(
-unescape('_printString'),
-smalltalk.method({
-selector: unescape('printString'),
-fn: function () {
-    var self = this;
-    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (aStream) {return function ($rec) {smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Object)]);smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);smalltalk.send($rec, "_nextPutAll_", [self['@selector']]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29")]);}(aStream);}]);
-    return self;
-}
-}),
-smalltalk.Message);
-
-smalltalk.addMethod(
-unescape('_sendTo_'),
-smalltalk.method({
-selector: unescape('sendTo%3A'),
-fn: function (anObject) {
-    var self = this;
-    smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_send_to_arguments_", [smalltalk.send(self, "_selector", []), anObject, smalltalk.send(self, "_arguments", [])]);
-    return self;
-}
-}),
-smalltalk.Message);
-
-
+smalltalk.addClass('BlockClosure', smalltalk.Object, [], 'Kernel-Methods');
 smalltalk.addMethod(
-unescape('_selector_arguments_'),
+unescape('_applyTo_arguments_'),
 smalltalk.method({
-selector: unescape('selector%3Aarguments%3A'),
-fn: function (aString, anArray) {
+selector: unescape('applyTo%3Aarguments%3A'),
+fn: function (anObject, aCollection) {
     var self = this;
-    return function ($rec) {smalltalk.send($rec, "_selector_", [aString]);smalltalk.send($rec, "_arguments_", [anArray]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
+    return self.apply(anObject, aCollection);
     return self;
 }
 }),
-smalltalk.Message.klass);
-
+smalltalk.BlockClosure);
 
-smalltalk.addClass('MethodContext', smalltalk.Object, [], 'Kernel-Methods');
 smalltalk.addMethod(
-unescape('_receiver'),
+unescape('_compiledSource'),
 smalltalk.method({
-selector: unescape('receiver'),
+selector: unescape('compiledSource'),
 fn: function () {
     var self = this;
-    return self.receiver;
+    return self.toString();
     return self;
 }
 }),
-smalltalk.MethodContext);
+smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_ensure_'),
 smalltalk.method({
-selector: unescape('selector'),
-fn: function () {
+selector: unescape('ensure%3A'),
+fn: function (aBlock) {
     var self = this;
-    return smalltalk.convertSelector(self.selector);
+    var success = nil;
+    success = false;
+    return smalltalk.send(function () {smalltalk.send(self, "_value", []);success = true;return smalltalk.send(aBlock, "_value", []);}, "_on_do_", [smalltalk.Error || Error, function (ex) {($receiver = success).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(aBlock, "_value", []);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(aBlock, "_value", []);}]);return smalltalk.send(ex, "_signal", []);}]);
     return self;
 }
 }),
-smalltalk.MethodContext);
+smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_home'),
+unescape('_new'),
 smalltalk.method({
-selector: unescape('home'),
+selector: unescape('new'),
 fn: function () {
     var self = this;
-    return self.homeContext;
+    return new self;
     return self;
 }
 }),
-smalltalk.MethodContext);
+smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_temps'),
+unescape('_newValue_'),
 smalltalk.method({
-selector: unescape('temps'),
-fn: function () {
+selector: unescape('newValue%3A'),
+fn: function (anObject) {
     var self = this;
-    return self.temps;
+    return new self(anObject);
     return self;
 }
 }),
-smalltalk.MethodContext);
+smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_newValue_value_'),
 smalltalk.method({
-selector: unescape('printString'),
-fn: function () {
+selector: unescape('newValue%3Avalue%3A'),
+fn: function (anObject, anObject2) {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printString", [], smalltalk.Object), "__comma", [unescape("%28")]), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%29")]);
+    return new self(anObject, anObject2);
     return self;
 }
 }),
-smalltalk.MethodContext);
+smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_newValue_value_value_'),
 smalltalk.method({
-selector: unescape('asString'),
-fn: function () {
+selector: unescape('newValue%3Avalue%3Avalue%3A'),
+fn: function (anObject, anObject2, anObject3) {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_printString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])]);
+    return new self(anObject, anObject2);
     return self;
 }
 }),
-smalltalk.MethodContext);
-
-
+smalltalk.BlockClosure);
 
-smalltalk.addClass('BlockClosure', smalltalk.Object, [], 'Kernel-Methods');
 smalltalk.addMethod(
-unescape('_compiledSource'),
+unescape('_numArgs'),
 smalltalk.method({
-selector: unescape('compiledSource'),
+selector: unescape('numArgs'),
 fn: function () {
     var self = this;
-    return self.toString();
+    return self.length;
     return self;
 }
 }),
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_whileTrue_'),
+unescape('_on_do_'),
 smalltalk.method({
-selector: unescape('whileTrue%3A'),
-fn: function (aBlock) {
+selector: unescape('on%3Ado%3A'),
+fn: function (anErrorClass, aBlock) {
     var self = this;
-    while (self()) {
-        aBlock();
-    }
+    return smalltalk.send(self, "_try_catch_", [self, function (error) {return ($receiver = smalltalk.send(error, "_isKindOf_", [anErrorClass])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(aBlock, "_value_", [error]);}() : function () {return smalltalk.send(error, "_signal", []);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return smalltalk.send(aBlock, "_value_", [error]);}, function () {return smalltalk.send(error, "_signal", []);}]);}]);
     return self;
 }
 }),
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_whileFalse_'),
+unescape('_timeToRun'),
 smalltalk.method({
-selector: unescape('whileFalse%3A'),
-fn: function (aBlock) {
+selector: unescape('timeToRun'),
+fn: function () {
     var self = this;
-    while (!self()) {
-        aBlock();
-    }
+    return smalltalk.send(smalltalk.Date || Date, "_millisecondsToRun_", [self]);
     return self;
 }
 }),
@@ -251,24 +171,24 @@ fn: function (firstArg, secondArg, thirdArg) {
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_valueWithPossibleArguments_'),
+unescape('_valueWithInterval_'),
 smalltalk.method({
-selector: unescape('valueWithPossibleArguments%3A'),
-fn: function (aCollection) {
+selector: unescape('valueWithInterval%3A'),
+fn: function (aNumber) {
     var self = this;
-    return self.apply(null, aCollection);
+    return setInterval(self, aNumber);
     return self;
 }
 }),
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_on_do_'),
+unescape('_valueWithPossibleArguments_'),
 smalltalk.method({
-selector: unescape('on%3Ado%3A'),
-fn: function (anErrorClass, aBlock) {
+selector: unescape('valueWithPossibleArguments%3A'),
+fn: function (aCollection) {
     var self = this;
-    return smalltalk.send(self, "_try_catch_", [self, function (error) {return ($receiver = smalltalk.send(error, "_isKindOf_", [anErrorClass])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(aBlock, "_value_", [error]);}() : function () {return smalltalk.send(error, "_signal", []);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return smalltalk.send(aBlock, "_value_", [error]);}, function () {return smalltalk.send(error, "_signal", []);}]);}]);
+    return self.apply(null, aCollection);
     return self;
 }
 }),
@@ -287,24 +207,26 @@ fn: function (aNumber) {
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_valueWithInterval_'),
+unescape('_whileFalse'),
 smalltalk.method({
-selector: unescape('valueWithInterval%3A'),
-fn: function (aNumber) {
+selector: unescape('whileFalse'),
+fn: function () {
     var self = this;
-    return setInterval(self, aNumber);
+    smalltalk.send(self, "_whileFalse_", [function () {return nil;}]);
     return self;
 }
 }),
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_whileFalse'),
+unescape('_whileFalse_'),
 smalltalk.method({
-selector: unescape('whileFalse'),
-fn: function () {
+selector: unescape('whileFalse%3A'),
+fn: function (aBlock) {
     var self = this;
-    smalltalk.send(self, "_whileFalse_", [function () {return nil;}]);
+    while (!self()) {
+        aBlock();
+    }
     return self;
 }
 }),
@@ -323,106 +245,143 @@ fn: function () {
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_new'),
+unescape('_whileTrue_'),
 smalltalk.method({
-selector: unescape('new'),
-fn: function () {
+selector: unescape('whileTrue%3A'),
+fn: function (aBlock) {
     var self = this;
-    return new self;
+    while (self()) {
+        aBlock();
+    }
     return self;
 }
 }),
 smalltalk.BlockClosure);
 
+
+
+smalltalk.addClass('CompiledMethod', smalltalk.Object, [], 'Kernel-Methods');
 smalltalk.addMethod(
-unescape('_applyTo_arguments_'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('applyTo%3Aarguments%3A'),
-fn: function (anObject, aCollection) {
+selector: unescape('arguments'),
+fn: function () {
     var self = this;
-    return self.apply(anObject, aCollection);
+    return self.args || [];
     return self;
 }
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_timeToRun'),
+unescape('_category'),
 smalltalk.method({
-selector: unescape('timeToRun'),
+selector: unescape('category'),
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.Date || Date, "_millisecondsToRun_", [self]);
+    return ($receiver = smalltalk.send(self, "_basicAt_", ["category"])) == nil ||
+        $receiver == undefined ? function () {return "";}() : $receiver;
     return self;
 }
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_numArgs'),
+unescape('_category_'),
 smalltalk.method({
-selector: unescape('numArgs'),
+selector: unescape('category%3A'),
+fn: function (aString) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["category", aString]);
+    return self;
+}
+}),
+smalltalk.CompiledMethod);
+
+smalltalk.addMethod(
+unescape('_fn'),
+smalltalk.method({
+selector: unescape('fn'),
 fn: function () {
     var self = this;
-    return self.length;
+    return smalltalk.send(self, "_basicAt_", ["fn"]);
     return self;
 }
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_ensure_'),
+unescape('_fn_'),
 smalltalk.method({
-selector: unescape('ensure%3A'),
+selector: unescape('fn%3A'),
 fn: function (aBlock) {
     var self = this;
-    var success = nil;
-    success = false;
-    return smalltalk.send(function () {smalltalk.send(self, "_value", []);success = true;return smalltalk.send(aBlock, "_value", []);}, "_on_do_", [smalltalk.Error || Error, function (ex) {($receiver = success).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(aBlock, "_value", []);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(aBlock, "_value", []);}]);return smalltalk.send(ex, "_signal", []);}]);
+    smalltalk.send(self, "_basicAt_put_", ["fn", aBlock]);
     return self;
 }
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_newValue_'),
+unescape('_messageSends'),
 smalltalk.method({
-selector: unescape('newValue%3A'),
-fn: function (anObject) {
+selector: unescape('messageSends'),
+fn: function () {
     var self = this;
-    return new self(anObject);
+    return smalltalk.send(self, "_basicAt_", ["messageSends"]);
     return self;
 }
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_newValue_value_'),
+unescape('_methodClass'),
 smalltalk.method({
-selector: unescape('newValue%3Avalue%3A'),
-fn: function (anObject, anObject2) {
+selector: unescape('methodClass'),
+fn: function () {
     var self = this;
-    return new self(anObject, anObject2);
+    return smalltalk.send(self, "_basicAt_", ["methodClass"]);
     return self;
 }
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_newValue_value_value_'),
+unescape('_referencedClasses'),
 smalltalk.method({
-selector: unescape('newValue%3Avalue%3Avalue%3A'),
-fn: function (anObject, anObject2, anObject3) {
+selector: unescape('referencedClasses'),
+fn: function () {
     var self = this;
-    return new self(anObject, anObject2);
+    return smalltalk.send(self, "_basicAt_", ["referencedClasses"]);
     return self;
 }
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
+smalltalk.addMethod(
+unescape('_selector'),
+smalltalk.method({
+selector: unescape('selector'),
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["selector"]);
+    return self;
+}
+}),
+smalltalk.CompiledMethod);
 
+smalltalk.addMethod(
+unescape('_selector_'),
+smalltalk.method({
+selector: unescape('selector%3A'),
+fn: function (aString) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["selector", aString]);
+    return self;
+}
+}),
+smalltalk.CompiledMethod);
 
-smalltalk.addClass('CompiledMethod', smalltalk.Object, [], 'Kernel-Methods');
 smalltalk.addMethod(
 unescape('_source'),
 smalltalk.method({
@@ -448,30 +407,44 @@ fn: function (aString) {
 }),
 smalltalk.CompiledMethod);
 
+
+
+smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
 smalltalk.addMethod(
-unescape('_category'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('category'),
+selector: unescape('arguments'),
 fn: function () {
     var self = this;
-    return ($receiver = smalltalk.send(self, "_basicAt_", ["category"])) == nil ||
-        $receiver == undefined ? function () {return "";}() : $receiver;
+    return self['@arguments'];
     return self;
 }
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_category_'),
+unescape('_arguments_'),
 smalltalk.method({
-selector: unescape('category%3A'),
-fn: function (aString) {
+selector: unescape('arguments%3A'),
+fn: function (anArray) {
     var self = this;
-    smalltalk.send(self, "_basicAt_put_", ["category", aString]);
+    self['@arguments'] = anArray;
     return self;
 }
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
+
+smalltalk.addMethod(
+unescape('_printString'),
+smalltalk.method({
+selector: unescape('printString'),
+fn: function () {
+    var self = this;
+    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (aStream) {return function ($rec) {smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Object)]);smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);smalltalk.send($rec, "_nextPutAll_", [self['@selector']]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29")]);}(aStream);}]);
+    return self;
+}
+}),
+smalltalk.Message);
 
 smalltalk.addMethod(
 unescape('_selector'),
@@ -479,11 +452,11 @@ smalltalk.method({
 selector: unescape('selector'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_basicAt_", ["selector"]);
+    return self['@selector'];
     return self;
 }
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
 unescape('_selector_'),
@@ -491,83 +464,110 @@ smalltalk.method({
 selector: unescape('selector%3A'),
 fn: function (aString) {
     var self = this;
-    smalltalk.send(self, "_basicAt_put_", ["selector", aString]);
+    self['@selector'] = aString;
     return self;
 }
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_fn'),
+unescape('_sendTo_'),
 smalltalk.method({
-selector: unescape('fn'),
+selector: unescape('sendTo%3A'),
+fn: function (anObject) {
+    var self = this;
+    smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_send_to_arguments_", [smalltalk.send(self, "_selector", []), anObject, smalltalk.send(self, "_arguments", [])]);
+    return self;
+}
+}),
+smalltalk.Message);
+
+
+smalltalk.addMethod(
+unescape('_selector_arguments_'),
+smalltalk.method({
+selector: unescape('selector%3Aarguments%3A'),
+fn: function (aString, anArray) {
+    var self = this;
+    return function ($rec) {smalltalk.send($rec, "_selector_", [aString]);smalltalk.send($rec, "_arguments_", [anArray]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
+    return self;
+}
+}),
+smalltalk.Message.klass);
+
+
+smalltalk.addClass('MethodContext', smalltalk.Object, [], 'Kernel-Methods');
+smalltalk.addMethod(
+unescape('_asString'),
+smalltalk.method({
+selector: unescape('asString'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_basicAt_", ["fn"]);
+    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_printString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])]);
     return self;
 }
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_fn_'),
+unescape('_home'),
 smalltalk.method({
-selector: unescape('fn%3A'),
-fn: function (aBlock) {
+selector: unescape('home'),
+fn: function () {
     var self = this;
-    smalltalk.send(self, "_basicAt_put_", ["fn", aBlock]);
+    return self.homeContext;
     return self;
 }
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_messageSends'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('messageSends'),
+selector: unescape('printString'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_basicAt_", ["messageSends"]);
+    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printString", [], smalltalk.Object), "__comma", [unescape("%28")]), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%29")]);
     return self;
 }
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_methodClass'),
+unescape('_receiver'),
 smalltalk.method({
-selector: unescape('methodClass'),
+selector: unescape('receiver'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_basicAt_", ["methodClass"]);
+    return self.receiver;
     return self;
 }
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_referencedClasses'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('referencedClasses'),
+selector: unescape('selector'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_basicAt_", ["referencedClasses"]);
+    return smalltalk.convertSelector(self.selector);
     return self;
 }
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_arguments'),
+unescape('_temps'),
 smalltalk.method({
-selector: unescape('arguments'),
+selector: unescape('temps'),
 fn: function () {
     var self = this;
-    return self.args || [];
+    return self.temps;
     return self;
 }
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 
 
diff --git a/amber/src/js/Kernel-Methods.js b/amber/src/js/Kernel-Methods.js
index e455e27e740..09e811fbef9 100644
--- a/amber/src/js/Kernel-Methods.js
+++ b/amber/src/js/Kernel-Methods.js
@@ -1,287 +1,175 @@
 smalltalk.addPackage('Kernel-Methods', {});
-smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
-smalltalk.Message.comment=unescape('Generally%2C%20the%20system%20does%20not%20use%20instances%20of%20Message%20for%20efficiency%20reasons.%0AHowever%2C%20when%20a%20message%20is%20not%20understood%20by%20its%20receiver%2C%20the%20interpreter%20will%20make%20up%20an%20instance%20of%20it%20in%20order%20to%20capture%20the%20information%20involved%20in%20an%20actual%20message%20transmission.%20%0AThis%20instance%20is%20sent%20it%20as%20an%20argument%20with%20the%20message%20%60doesNotUnderstand%3A%60%20to%20the%20receiver.%0A%0ASee%20boot.js%2C%20%60messageNotUnderstood%60%20%20and%20its%20counterpart%20%60Object%3E%3EdoesNotUnderstand%3A%60')
-smalltalk.addMethod(
-unescape('_selector'),
-smalltalk.method({
-selector: unescape('selector'),
-category: 'accessing',
-fn: function () {
-    var self = this;
-    return self['@selector'];
-    return self;
-},
-args: [],
-source: unescape('selector%0A%09%5Eselector'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Message);
-
-smalltalk.addMethod(
-unescape('_selector_'),
-smalltalk.method({
-selector: unescape('selector%3A'),
-category: 'accessing',
-fn: function (aString) {
-    var self = this;
-    self['@selector'] = aString;
-    return self;
-},
-args: ["aString"],
-source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Message);
-
+smalltalk.addClass('BlockClosure', smalltalk.Object, [], 'Kernel-Methods');
+smalltalk.BlockClosure.comment=unescape('A%20BlockClosure%20is%20a%20lexical%20closure.%0AThe%20JavaScript%20representation%20is%20a%20function.%0A%0AA%20BlockClosure%20is%20evaluated%20with%20the%20%60%23value*%60%20methods%20in%20the%20%27evaluating%27%20protocol.')
 smalltalk.addMethod(
-unescape('_arguments_'),
+unescape('_applyTo_arguments_'),
 smalltalk.method({
-selector: unescape('arguments%3A'),
-category: 'accessing',
-fn: function (anArray) {
+selector: unescape('applyTo%3Aarguments%3A'),
+category: 'evaluating',
+fn: function (anObject, aCollection) {
     var self = this;
-    self['@arguments'] = anArray;
+    return self.apply(anObject, aCollection);
     return self;
 },
-args: ["anArray"],
-source: unescape('arguments%3A%20anArray%0A%09arguments%20%3A%3D%20anArray'),
+args: ["anObject", "aCollection"],
+source: unescape('applyTo%3A%20anObject%20arguments%3A%20aCollection%0A%09%3Creturn%20self.apply%28anObject%2C%20aCollection%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Message);
+smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_arguments'),
+unescape('_compiledSource'),
 smalltalk.method({
-selector: unescape('arguments'),
+selector: unescape('compiledSource'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return self['@arguments'];
+    return self.toString();
     return self;
 },
 args: [],
-source: unescape('arguments%0A%09%5Earguments'),
+source: unescape('compiledSource%0A%09%3Creturn%20self.toString%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Message);
-
-smalltalk.addMethod(
-unescape('_printString'),
-smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
-fn: function () {
-    var self = this;
-    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (aStream) {return function ($rec) {smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Object)]);smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);smalltalk.send($rec, "_nextPutAll_", [self['@selector']]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29")]);}(aStream);}]);
-    return self;
-},
-args: [],
-source: unescape('printString%0A%09%5E%20String%20streamContents%3A%20%5B%3AaStream%7C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09aStream%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20super%20printString%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27%28%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20selector%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27%29%27%20%09%09%09%09%5D'),
-messageSends: ["streamContents:", "nextPutAll:", "printString"],
-referencedClasses: ["String"]
-}),
-smalltalk.Message);
-
-smalltalk.addMethod(
-unescape('_sendTo_'),
-smalltalk.method({
-selector: unescape('sendTo%3A'),
-category: 'printing',
-fn: function (anObject) {
-    var self = this;
-    smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_send_to_arguments_", [smalltalk.send(self, "_selector", []), anObject, smalltalk.send(self, "_arguments", [])]);
-    return self;
-},
-args: ["anObject"],
-source: unescape('sendTo%3A%20anObject%0A%09Smalltalk%20current%20send%3A%20self%20selector%20to%3A%20anObject%20arguments%3A%20self%20arguments'),
-messageSends: ["send:to:arguments:", "current", "selector", "arguments"],
-referencedClasses: ["Smalltalk"]
-}),
-smalltalk.Message);
-
+smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_selector_arguments_'),
+unescape('_ensure_'),
 smalltalk.method({
-selector: unescape('selector%3Aarguments%3A'),
-category: 'instance creation',
-fn: function (aString, anArray) {
+selector: unescape('ensure%3A'),
+category: 'evaluating',
+fn: function (aBlock) {
     var self = this;
-    return function ($rec) {smalltalk.send($rec, "_selector_", [aString]);smalltalk.send($rec, "_arguments_", [anArray]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
+    var success = nil;
+    success = false;
+    return smalltalk.send(function () {smalltalk.send(self, "_value", []);success = true;return smalltalk.send(aBlock, "_value", []);}, "_on_do_", [smalltalk.Error || Error, function (ex) {($receiver = success).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(aBlock, "_value", []);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(aBlock, "_value", []);}]);return smalltalk.send(ex, "_signal", []);}]);
     return self;
 },
-args: ["aString", "anArray"],
-source: unescape('selector%3A%20aString%20arguments%3A%20anArray%0A%09%5Eself%20new%0A%09%09selector%3A%20aString%3B%0A%09%09arguments%3A%20anArray%3B%0A%09%09yourself'),
-messageSends: ["selector:", "arguments:", "yourself", "new"],
-referencedClasses: []
+args: ["aBlock"],
+source: unescape('ensure%3A%20aBlock%0A%09%7C%20success%20%7C%0A%09success%20%3A%3D%20false.%0A%09%5E%5Bself%20value.%20success%20%3A%3D%20true.%20aBlock%20value%5D%0A%09%09on%3A%20Error%0A%09%09do%3A%20%5B%3Aex%20%7C%0A%09%09%09success%20ifFalse%3A%20%5BaBlock%20value%5D.%0A%09%09%09ex%20signal%5D'),
+messageSends: ["on:do:", "value", "ifFalse:", "signal"],
+referencedClasses: ["Error"]
 }),
-smalltalk.Message.klass);
-
+smalltalk.BlockClosure);
 
-smalltalk.addClass('MethodContext', smalltalk.Object, [], 'Kernel-Methods');
-smalltalk.MethodContext.comment=unescape('MethodContext%20holds%20all%20the%20dynamic%20state%20associated%20with%20the%20execution%20of%20either%20a%20method%20activation%20resulting%20from%20a%20message%20send.%20That%20is%20used%20to%20build%20the%20call%20stack%20while%20debugging.%0A%20%20%0AMethodContext%20instances%20are%20JavaScript%20%60SmalltalkMethodContext%60%20objects%20defined%20in%20boot.js%20%0A%0ACurrent%20limitation%3A%20MethodContext%20instances%20are%20not%20created%20on%20Block%20evaluation.%20That%20means%20it%27s%20actually%20impossible%20to%20debug%20inside%20a%20Block.')
 smalltalk.addMethod(
-unescape('_receiver'),
+unescape('_new'),
 smalltalk.method({
-selector: unescape('receiver'),
-category: 'accessing',
+selector: unescape('new'),
+category: 'evaluating',
 fn: function () {
     var self = this;
-    return self.receiver;
+    return new self;
     return self;
 },
 args: [],
-source: unescape('receiver%0A%09%3Creturn%20self.receiver%3E'),
+source: unescape('new%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.MethodContext);
+smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_newValue_'),
 smalltalk.method({
-selector: unescape('selector'),
-category: 'accessing',
-fn: function () {
+selector: unescape('newValue%3A'),
+category: 'evaluating',
+fn: function (anObject) {
     var self = this;
-    return smalltalk.convertSelector(self.selector);
+    return new self(anObject);
     return self;
 },
-args: [],
-source: unescape('selector%0A%09%3Creturn%20smalltalk.convertSelector%28self.selector%29%3E'),
+args: ["anObject"],
+source: unescape('newValue%3A%20anObject%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28anObject%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.MethodContext);
+smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_home'),
+unescape('_newValue_value_'),
 smalltalk.method({
-selector: unescape('home'),
-category: 'accessing',
-fn: function () {
+selector: unescape('newValue%3Avalue%3A'),
+category: 'evaluating',
+fn: function (anObject, anObject2) {
     var self = this;
-    return self.homeContext;
+    return new self(anObject, anObject2);
     return self;
 },
-args: [],
-source: unescape('home%0A%09%3Creturn%20self.homeContext%3E'),
+args: ["anObject", "anObject2"],
+source: unescape('newValue%3A%20%20anObject%20value%3A%20anObject2%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28anObject%2C%20anObject2%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.MethodContext);
+smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_temps'),
+unescape('_newValue_value_value_'),
 smalltalk.method({
-selector: unescape('temps'),
-category: 'accessing',
-fn: function () {
+selector: unescape('newValue%3Avalue%3Avalue%3A'),
+category: 'evaluating',
+fn: function (anObject, anObject2, anObject3) {
     var self = this;
-    return self.temps;
+    return new self(anObject, anObject2);
     return self;
 },
-args: [],
-source: unescape('temps%0A%09%3Creturn%20self.temps%3E'),
+args: ["anObject", "anObject2", "anObject3"],
+source: unescape('newValue%3A%20%20anObject%20value%3A%20anObject2%20value%3A%20anObject3%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28anObject%2C%20anObject2%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.MethodContext);
-
-smalltalk.addMethod(
-unescape('_printString'),
-smalltalk.method({
-selector: unescape('printString'),
-category: 'accessing',
-fn: function () {
-    var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printString", [], smalltalk.Object), "__comma", [unescape("%28")]), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%29")]);
-    return self;
-},
-args: [],
-source: unescape('printString%0A%09%5Esuper%20printString%2C%20%27%28%27%2C%20self%20asString%2C%20%27%29%27'),
-messageSends: [unescape("%2C"), "printString", "asString"],
-referencedClasses: []
-}),
-smalltalk.MethodContext);
-
-smalltalk.addMethod(
-unescape('_asString'),
-smalltalk.method({
-selector: unescape('asString'),
-category: 'accessing',
-fn: function () {
-    var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_printString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])]);
-    return self;
-},
-args: [],
-source: unescape('asString%0A%09%5Eself%20receiver%20class%20printString%2C%20%27%20%3E%3E%20%27%2C%20self%20selector'),
-messageSends: [unescape("%2C"), "printString", "class", "receiver", "selector"],
-referencedClasses: []
-}),
-smalltalk.MethodContext);
-
-
+smalltalk.BlockClosure);
 
-smalltalk.addClass('BlockClosure', smalltalk.Object, [], 'Kernel-Methods');
-smalltalk.BlockClosure.comment=unescape('A%20BlockClosure%20is%20a%20lexical%20closure.%0AThe%20JavaScript%20representation%20is%20a%20function.%0A%0AA%20BlockClosure%20is%20evaluated%20with%20the%20%60%23value*%60%20methods%20in%20the%20%27evaluating%27%20protocol.')
 smalltalk.addMethod(
-unescape('_compiledSource'),
+unescape('_numArgs'),
 smalltalk.method({
-selector: unescape('compiledSource'),
+selector: unescape('numArgs'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return self.toString();
+    return self.length;
     return self;
 },
 args: [],
-source: unescape('compiledSource%0A%09%3Creturn%20self.toString%28%29%3E'),
+source: unescape('numArgs%0A%09%3Creturn%20self.length%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_whileTrue_'),
+unescape('_on_do_'),
 smalltalk.method({
-selector: unescape('whileTrue%3A'),
-category: 'controlling',
-fn: function (aBlock) {
+selector: unescape('on%3Ado%3A'),
+category: 'error handling',
+fn: function (anErrorClass, aBlock) {
     var self = this;
-    while (self()) {
-        aBlock();
-    }
+    return smalltalk.send(self, "_try_catch_", [self, function (error) {return ($receiver = smalltalk.send(error, "_isKindOf_", [anErrorClass])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(aBlock, "_value_", [error]);}() : function () {return smalltalk.send(error, "_signal", []);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return smalltalk.send(aBlock, "_value_", [error]);}, function () {return smalltalk.send(error, "_signal", []);}]);}]);
     return self;
 },
-args: ["aBlock"],
-source: unescape('whileTrue%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3Cwhile%28self%28%29%29%20%7BaBlock%28%29%7D%3E'),
-messageSends: [],
+args: ["anErrorClass", "aBlock"],
+source: unescape('on%3A%20anErrorClass%20do%3A%20aBlock%0A%09%5Eself%20try%3A%20self%20catch%3A%20%5B%3Aerror%20%7C%0A%09%20%20%20%20%28error%20isKindOf%3A%20anErrorClass%29%20%0A%09%20%20%20%20%20ifTrue%3A%20%5BaBlock%20value%3A%20error%5D%0A%09%20%20%20%20%20ifFalse%3A%20%5Berror%20signal%5D%5D'),
+messageSends: ["try:catch:", "ifTrue:ifFalse:", "isKindOf:", "value:", "signal"],
 referencedClasses: []
 }),
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_whileFalse_'),
+unescape('_timeToRun'),
 smalltalk.method({
-selector: unescape('whileFalse%3A'),
-category: 'controlling',
-fn: function (aBlock) {
+selector: unescape('timeToRun'),
+category: 'evaluating',
+fn: function () {
     var self = this;
-    while (!self()) {
-        aBlock();
-    }
+    return smalltalk.send(smalltalk.Date || Date, "_millisecondsToRun_", [self]);
     return self;
 },
-args: ["aBlock"],
-source: unescape('whileFalse%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3Cwhile%28%21self%28%29%29%20%7BaBlock%28%29%7D%3E'),
-messageSends: [],
-referencedClasses: []
+args: [],
+source: unescape('timeToRun%0A%09%22Answer%20the%20number%20of%20milliseconds%20taken%20to%20execute%20this%20block.%22%0A%0A%09%5E%20Date%20millisecondsToRun%3A%20self'),
+messageSends: ["millisecondsToRun:"],
+referencedClasses: ["Date"]
 }),
 smalltalk.BlockClosure);
 
@@ -354,35 +242,35 @@ referencedClasses: []
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_valueWithPossibleArguments_'),
+unescape('_valueWithInterval_'),
 smalltalk.method({
-selector: unescape('valueWithPossibleArguments%3A'),
-category: 'evaluating',
-fn: function (aCollection) {
+selector: unescape('valueWithInterval%3A'),
+category: 'timeout/interval',
+fn: function (aNumber) {
     var self = this;
-    return self.apply(null, aCollection);
+    return setInterval(self, aNumber);
     return self;
 },
-args: ["aCollection"],
-source: unescape('valueWithPossibleArguments%3A%20aCollection%0A%09%3Creturn%20self.apply%28null%2C%20aCollection%29%3B%3E'),
+args: ["aNumber"],
+source: unescape('valueWithInterval%3A%20aNumber%0A%09%3Creturn%20setInterval%28self%2C%20aNumber%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_on_do_'),
+unescape('_valueWithPossibleArguments_'),
 smalltalk.method({
-selector: unescape('on%3Ado%3A'),
-category: 'error handling',
-fn: function (anErrorClass, aBlock) {
+selector: unescape('valueWithPossibleArguments%3A'),
+category: 'evaluating',
+fn: function (aCollection) {
     var self = this;
-    return smalltalk.send(self, "_try_catch_", [self, function (error) {return ($receiver = smalltalk.send(error, "_isKindOf_", [anErrorClass])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(aBlock, "_value_", [error]);}() : function () {return smalltalk.send(error, "_signal", []);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return smalltalk.send(aBlock, "_value_", [error]);}, function () {return smalltalk.send(error, "_signal", []);}]);}]);
+    return self.apply(null, aCollection);
     return self;
 },
-args: ["anErrorClass", "aBlock"],
-source: unescape('on%3A%20anErrorClass%20do%3A%20aBlock%0A%09%5Eself%20try%3A%20self%20catch%3A%20%5B%3Aerror%20%7C%0A%09%20%20%20%20%28error%20isKindOf%3A%20anErrorClass%29%20%0A%09%20%20%20%20%20ifTrue%3A%20%5BaBlock%20value%3A%20error%5D%0A%09%20%20%20%20%20ifFalse%3A%20%5Berror%20signal%5D%5D'),
-messageSends: ["try:catch:", "ifTrue:ifFalse:", "isKindOf:", "value:", "signal"],
+args: ["aCollection"],
+source: unescape('valueWithPossibleArguments%3A%20aCollection%0A%09%3Creturn%20self.apply%28null%2C%20aCollection%29%3B%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.BlockClosure);
@@ -405,35 +293,37 @@ referencedClasses: []
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_valueWithInterval_'),
+unescape('_whileFalse'),
 smalltalk.method({
-selector: unescape('valueWithInterval%3A'),
-category: 'timeout/interval',
-fn: function (aNumber) {
+selector: unescape('whileFalse'),
+category: 'controlling',
+fn: function () {
     var self = this;
-    return setInterval(self, aNumber);
+    smalltalk.send(self, "_whileFalse_", [function () {return nil;}]);
     return self;
 },
-args: ["aNumber"],
-source: unescape('valueWithInterval%3A%20aNumber%0A%09%3Creturn%20setInterval%28self%2C%20aNumber%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('whileFalse%0A%09%22inlined%20in%20the%20Compiler%22%0A%09self%20whileFalse%3A%20%5B%5D'),
+messageSends: ["whileFalse:"],
 referencedClasses: []
 }),
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_whileFalse'),
+unescape('_whileFalse_'),
 smalltalk.method({
-selector: unescape('whileFalse'),
+selector: unescape('whileFalse%3A'),
 category: 'controlling',
-fn: function () {
+fn: function (aBlock) {
     var self = this;
-    smalltalk.send(self, "_whileFalse_", [function () {return nil;}]);
+    while (!self()) {
+        aBlock();
+    }
     return self;
 },
-args: [],
-source: unescape('whileFalse%0A%09%22inlined%20in%20the%20Compiler%22%0A%09self%20whileFalse%3A%20%5B%5D'),
-messageSends: ["whileFalse:"],
+args: ["aBlock"],
+source: unescape('whileFalse%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3Cwhile%28%21self%28%29%29%20%7BaBlock%28%29%7D%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.BlockClosure);
@@ -456,147 +346,199 @@ referencedClasses: []
 smalltalk.BlockClosure);
 
 smalltalk.addMethod(
-unescape('_new'),
+unescape('_whileTrue_'),
 smalltalk.method({
-selector: unescape('new'),
-category: 'evaluating',
-fn: function () {
+selector: unescape('whileTrue%3A'),
+category: 'controlling',
+fn: function (aBlock) {
     var self = this;
-    return new self;
+    while (self()) {
+        aBlock();
+    }
     return self;
 },
-args: [],
-source: unescape('new%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28%29%3E'),
+args: ["aBlock"],
+source: unescape('whileTrue%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3Cwhile%28self%28%29%29%20%7BaBlock%28%29%7D%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.BlockClosure);
 
+
+
+smalltalk.addClass('CompiledMethod', smalltalk.Object, [], 'Kernel-Methods');
+smalltalk.CompiledMethod.comment=unescape('CompiledMethod%20hold%20the%20source%20and%20compiled%20code%20of%20a%20class%20method.%0A%0AYou%20can%20get%20a%20CompiledMethod%20using%20%60Behavior%3E%3EmethodAt%3A%60%0A%0A%09String%20methodAt%3A%20%27lines%27%0A%0Aand%20read%20the%20source%20code%0A%0A%09%28String%20methodAt%3A%20%27lines%27%29%20source%0A%0ASee%20referenced%20classes%3A%0A%0A%09%28String%20methodAt%3A%20%27lines%27%29%20referencedClasses%0A%0Aor%20messages%20sent%20from%20this%20method%3A%0A%09%0A%09%28String%20methodAt%3A%20%27lines%27%29%20%20messageSends')
 smalltalk.addMethod(
-unescape('_applyTo_arguments_'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('applyTo%3Aarguments%3A'),
-category: 'evaluating',
-fn: function (anObject, aCollection) {
+selector: unescape('arguments'),
+category: 'accessing',
+fn: function () {
     var self = this;
-    return self.apply(anObject, aCollection);
+    return self.args || [];
     return self;
 },
-args: ["anObject", "aCollection"],
-source: unescape('applyTo%3A%20anObject%20arguments%3A%20aCollection%0A%09%3Creturn%20self.apply%28anObject%2C%20aCollection%29%3E'),
+args: [],
+source: unescape('arguments%0A%09%3Creturn%20self.args%20%7C%7C%20%5B%5D%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_timeToRun'),
+unescape('_category'),
 smalltalk.method({
-selector: unescape('timeToRun'),
-category: 'evaluating',
+selector: unescape('category'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.Date || Date, "_millisecondsToRun_", [self]);
+    return ($receiver = smalltalk.send(self, "_basicAt_", ["category"])) == nil ||
+        $receiver == undefined ? function () {return "";}() : $receiver;
     return self;
 },
 args: [],
-source: unescape('timeToRun%0A%09%22Answer%20the%20number%20of%20milliseconds%20taken%20to%20execute%20this%20block.%22%0A%0A%09%5E%20Date%20millisecondsToRun%3A%20self'),
-messageSends: ["millisecondsToRun:"],
-referencedClasses: ["Date"]
+source: unescape('category%0A%09%5E%28self%20basicAt%3A%20%27category%27%29%20ifNil%3A%20%5B%27%27%5D'),
+messageSends: ["ifNil:", "basicAt:"],
+referencedClasses: []
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_numArgs'),
+unescape('_category_'),
 smalltalk.method({
-selector: unescape('numArgs'),
+selector: unescape('category%3A'),
+category: 'accessing',
+fn: function (aString) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["category", aString]);
+    return self;
+},
+args: ["aString"],
+source: unescape('category%3A%20aString%0A%09self%20basicAt%3A%20%27category%27%20put%3A%20aString'),
+messageSends: ["basicAt:put:"],
+referencedClasses: []
+}),
+smalltalk.CompiledMethod);
+
+smalltalk.addMethod(
+unescape('_fn'),
+smalltalk.method({
+selector: unescape('fn'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return self.length;
+    return smalltalk.send(self, "_basicAt_", ["fn"]);
     return self;
 },
 args: [],
-source: unescape('numArgs%0A%09%3Creturn%20self.length%3E'),
-messageSends: [],
+source: unescape('fn%0A%09%5Eself%20basicAt%3A%20%27fn%27'),
+messageSends: ["basicAt:"],
 referencedClasses: []
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_ensure_'),
+unescape('_fn_'),
+smalltalk.method({
+selector: unescape('fn%3A'),
+category: 'accessing',
+fn: function (aBlock) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["fn", aBlock]);
+    return self;
+},
+args: ["aBlock"],
+source: unescape('fn%3A%20aBlock%0A%09self%20basicAt%3A%20%27fn%27%20put%3A%20aBlock'),
+messageSends: ["basicAt:put:"],
+referencedClasses: []
+}),
+smalltalk.CompiledMethod);
+
+smalltalk.addMethod(
+unescape('_messageSends'),
+smalltalk.method({
+selector: unescape('messageSends'),
+category: 'accessing',
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["messageSends"]);
+    return self;
+},
+args: [],
+source: unescape('messageSends%0A%09%5Eself%20basicAt%3A%20%27messageSends%27'),
+messageSends: ["basicAt:"],
+referencedClasses: []
+}),
+smalltalk.CompiledMethod);
+
+smalltalk.addMethod(
+unescape('_methodClass'),
 smalltalk.method({
-selector: unescape('ensure%3A'),
-category: 'evaluating',
-fn: function (aBlock) {
+selector: unescape('methodClass'),
+category: 'accessing',
+fn: function () {
     var self = this;
-    var success = nil;
-    success = false;
-    return smalltalk.send(function () {smalltalk.send(self, "_value", []);success = true;return smalltalk.send(aBlock, "_value", []);}, "_on_do_", [smalltalk.Error || Error, function (ex) {($receiver = success).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(aBlock, "_value", []);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(aBlock, "_value", []);}]);return smalltalk.send(ex, "_signal", []);}]);
+    return smalltalk.send(self, "_basicAt_", ["methodClass"]);
     return self;
 },
-args: ["aBlock"],
-source: unescape('ensure%3A%20aBlock%0A%09%7C%20success%20%7C%0A%09success%20%3A%3D%20false.%0A%09%5E%5Bself%20value.%20success%20%3A%3D%20true.%20aBlock%20value%5D%0A%09%09on%3A%20Error%0A%09%09do%3A%20%5B%3Aex%20%7C%0A%09%09%09success%20ifFalse%3A%20%5BaBlock%20value%5D.%0A%09%09%09ex%20signal%5D'),
-messageSends: ["on:do:", "value", "ifFalse:", "signal"],
-referencedClasses: ["Error"]
+args: [],
+source: unescape('methodClass%0A%09%5Eself%20basicAt%3A%20%27methodClass%27'),
+messageSends: ["basicAt:"],
+referencedClasses: []
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_newValue_'),
+unescape('_referencedClasses'),
 smalltalk.method({
-selector: unescape('newValue%3A'),
-category: 'evaluating',
-fn: function (anObject) {
+selector: unescape('referencedClasses'),
+category: 'accessing',
+fn: function () {
     var self = this;
-    return new self(anObject);
+    return smalltalk.send(self, "_basicAt_", ["referencedClasses"]);
     return self;
 },
-args: ["anObject"],
-source: unescape('newValue%3A%20anObject%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28anObject%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('referencedClasses%0A%09%5Eself%20basicAt%3A%20%27referencedClasses%27'),
+messageSends: ["basicAt:"],
 referencedClasses: []
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_newValue_value_'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('newValue%3Avalue%3A'),
-category: 'evaluating',
-fn: function (anObject, anObject2) {
+selector: unescape('selector'),
+category: 'accessing',
+fn: function () {
     var self = this;
-    return new self(anObject, anObject2);
+    return smalltalk.send(self, "_basicAt_", ["selector"]);
     return self;
 },
-args: ["anObject", "anObject2"],
-source: unescape('newValue%3A%20%20anObject%20value%3A%20anObject2%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28anObject%2C%20anObject2%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('selector%0A%09%5Eself%20basicAt%3A%20%27selector%27'),
+messageSends: ["basicAt:"],
 referencedClasses: []
 }),
-smalltalk.BlockClosure);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_newValue_value_value_'),
+unescape('_selector_'),
 smalltalk.method({
-selector: unescape('newValue%3Avalue%3Avalue%3A'),
-category: 'evaluating',
-fn: function (anObject, anObject2, anObject3) {
+selector: unescape('selector%3A'),
+category: 'accessing',
+fn: function (aString) {
     var self = this;
-    return new self(anObject, anObject2);
+    smalltalk.send(self, "_basicAt_put_", ["selector", aString]);
     return self;
 },
-args: ["anObject", "anObject2", "anObject3"],
-source: unescape('newValue%3A%20%20anObject%20value%3A%20anObject2%20value%3A%20anObject3%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28anObject%2C%20anObject2%29%3E'),
-messageSends: [],
+args: ["aString"],
+source: unescape('selector%3A%20aString%0A%09self%20basicAt%3A%20%27selector%27%20put%3A%20aString'),
+messageSends: ["basicAt:put:"],
 referencedClasses: []
 }),
-smalltalk.BlockClosure);
-
-
+smalltalk.CompiledMethod);
 
-smalltalk.addClass('CompiledMethod', smalltalk.Object, [], 'Kernel-Methods');
-smalltalk.CompiledMethod.comment=unescape('CompiledMethod%20hold%20the%20source%20and%20compiled%20code%20of%20a%20class%20method.%0A%0AYou%20can%20get%20a%20CompiledMethod%20using%20%60Behavior%3E%3EmethodAt%3A%60%0A%0A%09String%20methodAt%3A%20%27lines%27%0A%0Aand%20read%20the%20source%20code%0A%0A%09%28String%20methodAt%3A%20%27lines%27%29%20source%0A%0ASee%20referenced%20classes%3A%0A%0A%09%28String%20methodAt%3A%20%27lines%27%29%20referencedClasses%0A%0Aor%20messages%20sent%20from%20this%20method%3A%0A%09%0A%09%28String%20methodAt%3A%20%27lines%27%29%20%20messageSends')
 smalltalk.addMethod(
 unescape('_source'),
 smalltalk.method({
@@ -632,40 +574,60 @@ referencedClasses: []
 }),
 smalltalk.CompiledMethod);
 
+
+
+smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
+smalltalk.Message.comment=unescape('Generally%2C%20the%20system%20does%20not%20use%20instances%20of%20Message%20for%20efficiency%20reasons.%0AHowever%2C%20when%20a%20message%20is%20not%20understood%20by%20its%20receiver%2C%20the%20interpreter%20will%20make%20up%20an%20instance%20of%20it%20in%20order%20to%20capture%20the%20information%20involved%20in%20an%20actual%20message%20transmission.%20%0AThis%20instance%20is%20sent%20it%20as%20an%20argument%20with%20the%20message%20%60doesNotUnderstand%3A%60%20to%20the%20receiver.%0A%0ASee%20boot.js%2C%20%60messageNotUnderstood%60%20%20and%20its%20counterpart%20%60Object%3E%3EdoesNotUnderstand%3A%60')
 smalltalk.addMethod(
-unescape('_category'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('category'),
+selector: unescape('arguments'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return ($receiver = smalltalk.send(self, "_basicAt_", ["category"])) == nil ||
-        $receiver == undefined ? function () {return "";}() : $receiver;
+    return self['@arguments'];
     return self;
 },
 args: [],
-source: unescape('category%0A%09%5E%28self%20basicAt%3A%20%27category%27%29%20ifNil%3A%20%5B%27%27%5D'),
-messageSends: ["ifNil:", "basicAt:"],
+source: unescape('arguments%0A%09%5Earguments'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_category_'),
+unescape('_arguments_'),
 smalltalk.method({
-selector: unescape('category%3A'),
+selector: unescape('arguments%3A'),
 category: 'accessing',
-fn: function (aString) {
+fn: function (anArray) {
     var self = this;
-    smalltalk.send(self, "_basicAt_put_", ["category", aString]);
+    self['@arguments'] = anArray;
     return self;
 },
-args: ["aString"],
-source: unescape('category%3A%20aString%0A%09self%20basicAt%3A%20%27category%27%20put%3A%20aString'),
-messageSends: ["basicAt:put:"],
+args: ["anArray"],
+source: unescape('arguments%3A%20anArray%0A%09arguments%20%3A%3D%20anArray'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
+
+smalltalk.addMethod(
+unescape('_printString'),
+smalltalk.method({
+selector: unescape('printString'),
+category: 'printing',
+fn: function () {
+    var self = this;
+    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (aStream) {return function ($rec) {smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Object)]);smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);smalltalk.send($rec, "_nextPutAll_", [self['@selector']]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29")]);}(aStream);}]);
+    return self;
+},
+args: [],
+source: unescape('printString%0A%09%5E%20String%20streamContents%3A%20%5B%3AaStream%7C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09aStream%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20super%20printString%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27%28%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20selector%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27%29%27%20%09%09%09%09%5D'),
+messageSends: ["streamContents:", "nextPutAll:", "printString"],
+referencedClasses: ["String"]
+}),
+smalltalk.Message);
 
 smalltalk.addMethod(
 unescape('_selector'),
@@ -674,15 +636,15 @@ selector: unescape('selector'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_basicAt_", ["selector"]);
+    return self['@selector'];
     return self;
 },
 args: [],
-source: unescape('selector%0A%09%5Eself%20basicAt%3A%20%27selector%27'),
-messageSends: ["basicAt:"],
+source: unescape('selector%0A%09%5Eselector'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
 unescape('_selector_'),
@@ -691,117 +653,155 @@ selector: unescape('selector%3A'),
 category: 'accessing',
 fn: function (aString) {
     var self = this;
-    smalltalk.send(self, "_basicAt_put_", ["selector", aString]);
+    self['@selector'] = aString;
     return self;
 },
 args: ["aString"],
-source: unescape('selector%3A%20aString%0A%09self%20basicAt%3A%20%27selector%27%20put%3A%20aString'),
-messageSends: ["basicAt:put:"],
+source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_fn'),
+unescape('_sendTo_'),
 smalltalk.method({
-selector: unescape('fn'),
+selector: unescape('sendTo%3A'),
+category: 'printing',
+fn: function (anObject) {
+    var self = this;
+    smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_send_to_arguments_", [smalltalk.send(self, "_selector", []), anObject, smalltalk.send(self, "_arguments", [])]);
+    return self;
+},
+args: ["anObject"],
+source: unescape('sendTo%3A%20anObject%0A%09Smalltalk%20current%20send%3A%20self%20selector%20to%3A%20anObject%20arguments%3A%20self%20arguments'),
+messageSends: ["send:to:arguments:", "current", "selector", "arguments"],
+referencedClasses: ["Smalltalk"]
+}),
+smalltalk.Message);
+
+
+smalltalk.addMethod(
+unescape('_selector_arguments_'),
+smalltalk.method({
+selector: unescape('selector%3Aarguments%3A'),
+category: 'instance creation',
+fn: function (aString, anArray) {
+    var self = this;
+    return function ($rec) {smalltalk.send($rec, "_selector_", [aString]);smalltalk.send($rec, "_arguments_", [anArray]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
+    return self;
+},
+args: ["aString", "anArray"],
+source: unescape('selector%3A%20aString%20arguments%3A%20anArray%0A%09%5Eself%20new%0A%09%09selector%3A%20aString%3B%0A%09%09arguments%3A%20anArray%3B%0A%09%09yourself'),
+messageSends: ["selector:", "arguments:", "yourself", "new"],
+referencedClasses: []
+}),
+smalltalk.Message.klass);
+
+
+smalltalk.addClass('MethodContext', smalltalk.Object, [], 'Kernel-Methods');
+smalltalk.MethodContext.comment=unescape('MethodContext%20holds%20all%20the%20dynamic%20state%20associated%20with%20the%20execution%20of%20either%20a%20method%20activation%20resulting%20from%20a%20message%20send.%20That%20is%20used%20to%20build%20the%20call%20stack%20while%20debugging.%0A%20%20%0AMethodContext%20instances%20are%20JavaScript%20%60SmalltalkMethodContext%60%20objects%20defined%20in%20boot.js%20%0A%0ACurrent%20limitation%3A%20MethodContext%20instances%20are%20not%20created%20on%20Block%20evaluation.%20That%20means%20it%27s%20actually%20impossible%20to%20debug%20inside%20a%20Block.')
+smalltalk.addMethod(
+unescape('_asString'),
+smalltalk.method({
+selector: unescape('asString'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_basicAt_", ["fn"]);
+    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_printString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])]);
     return self;
 },
 args: [],
-source: unescape('fn%0A%09%5Eself%20basicAt%3A%20%27fn%27'),
-messageSends: ["basicAt:"],
+source: unescape('asString%0A%09%5Eself%20receiver%20class%20printString%2C%20%27%20%3E%3E%20%27%2C%20self%20selector'),
+messageSends: [unescape("%2C"), "printString", "class", "receiver", "selector"],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_fn_'),
+unescape('_home'),
 smalltalk.method({
-selector: unescape('fn%3A'),
+selector: unescape('home'),
 category: 'accessing',
-fn: function (aBlock) {
+fn: function () {
     var self = this;
-    smalltalk.send(self, "_basicAt_put_", ["fn", aBlock]);
+    return self.homeContext;
     return self;
 },
-args: ["aBlock"],
-source: unescape('fn%3A%20aBlock%0A%09self%20basicAt%3A%20%27fn%27%20put%3A%20aBlock'),
-messageSends: ["basicAt:put:"],
+args: [],
+source: unescape('home%0A%09%3Creturn%20self.homeContext%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_messageSends'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('messageSends'),
+selector: unescape('printString'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_basicAt_", ["messageSends"]);
+    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printString", [], smalltalk.Object), "__comma", [unescape("%28")]), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%29")]);
     return self;
 },
 args: [],
-source: unescape('messageSends%0A%09%5Eself%20basicAt%3A%20%27messageSends%27'),
-messageSends: ["basicAt:"],
+source: unescape('printString%0A%09%5Esuper%20printString%2C%20%27%28%27%2C%20self%20asString%2C%20%27%29%27'),
+messageSends: [unescape("%2C"), "printString", "asString"],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_methodClass'),
+unescape('_receiver'),
 smalltalk.method({
-selector: unescape('methodClass'),
+selector: unescape('receiver'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_basicAt_", ["methodClass"]);
+    return self.receiver;
     return self;
 },
 args: [],
-source: unescape('methodClass%0A%09%5Eself%20basicAt%3A%20%27methodClass%27'),
-messageSends: ["basicAt:"],
+source: unescape('receiver%0A%09%3Creturn%20self.receiver%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_referencedClasses'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('referencedClasses'),
+selector: unescape('selector'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_basicAt_", ["referencedClasses"]);
+    return smalltalk.convertSelector(self.selector);
     return self;
 },
 args: [],
-source: unescape('referencedClasses%0A%09%5Eself%20basicAt%3A%20%27referencedClasses%27'),
-messageSends: ["basicAt:"],
+source: unescape('selector%0A%09%3Creturn%20smalltalk.convertSelector%28self.selector%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_arguments'),
+unescape('_temps'),
 smalltalk.method({
-selector: unescape('arguments'),
+selector: unescape('temps'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return self.args || [];
+    return self.temps;
     return self;
 },
 args: [],
-source: unescape('arguments%0A%09%3Creturn%20self.args%20%7C%7C%20%5B%5D%3E'),
+source: unescape('temps%0A%09%3Creturn%20self.temps%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 
 
diff --git a/amber/src/js/Kernel-Objects.deploy.js b/amber/src/js/Kernel-Objects.deploy.js
index 62041816909..770c194cdf1 100644
--- a/amber/src/js/Kernel-Objects.deploy.js
+++ b/amber/src/js/Kernel-Objects.deploy.js
@@ -1,5 +1,17 @@
 smalltalk.addPackage('Kernel-Objects', {});
 smalltalk.addClass('Object', smalltalk.nil, [], 'Kernel-Objects');
+smalltalk.addMethod(
+unescape('__minus_gt'),
+smalltalk.method({
+selector: unescape('-%3E'),
+fn: function (anObject) {
+    var self = this;
+    return smalltalk.send(smalltalk.Association || Association, "_key_value_", [self, anObject]);
+    return self;
+}
+}),
+smalltalk.Object);
+
 smalltalk.addMethod(
 unescape('__eq'),
 smalltalk.method({
@@ -13,307 +25,323 @@ fn: function (anObject) {
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_%7E_eq'),
+unescape('__eq_eq'),
 smalltalk.method({
-selector: unescape('%7E%3D'),
+selector: unescape('%3D%3D'),
 fn: function (anObject) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "__eq", [anObject]), "__eq", [false]);
+    return smalltalk.send(smalltalk.send(self, "_identityHash", []), "__eq", [smalltalk.send(anObject, "_identityHash", [])]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('initialize'),
+selector: unescape('asJSON'),
+fn: function (){
+var self=this;
+var variables=nil;
+(variables=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_allInstanceVariableNames", []), "_do_", [(function(each){return smalltalk.send(variables, "_at_put_", [each, smalltalk.send(smalltalk.send(self, "_instVarAt_", [each]), "_asJSON", [])]);})]);
+return variables;
+return self;}
+}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+unescape('_asJSONString'),
+smalltalk.method({
+selector: unescape('asJSONString'),
+fn: function (){
+var self=this;
+return smalltalk.send((smalltalk.JSON || JSON), "_stringify_", [smalltalk.send(self, "_asJSON", [])]);
+return self;}
+}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+unescape('_asJavascript'),
+smalltalk.method({
+selector: unescape('asJavascript'),
 fn: function () {
     var self = this;
+    return smalltalk.send(self, "_asString", []);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_yourself'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('yourself'),
+selector: unescape('asString'),
 fn: function () {
     var self = this;
-    return self;
+    return smalltalk.send(self, "_printString", []);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_class'),
+unescape('_basicAt_'),
 smalltalk.method({
-selector: unescape('class'),
-fn: function () {
+selector: unescape('basicAt%3A'),
+fn: function (aString) {
     var self = this;
-    return self.klass;
+    return self[aString];
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_basicAt_put_'),
 smalltalk.method({
-selector: unescape('size'),
-fn: function () {
+selector: unescape('basicAt%3Aput%3A'),
+fn: function (aString, anObject) {
     var self = this;
-    smalltalk.send(self, "_error_", ["Object not indexable"]);
+    return self[aString] = anObject;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_copy'),
+unescape('_basicDelete_'),
 smalltalk.method({
-selector: unescape('copy'),
-fn: function () {
+selector: unescape('basicDelete%3A'),
+fn: function (aString) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_shallowCopy", []), "_postCopy", []);
+    delete self[aString];
+    return aString;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_basicPerform_'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
-fn: function () {
+selector: unescape('basicPerform%3A'),
+fn: function (aSymbol) {
     var self = this;
-    var copy = self.klass._new();
-    for (var i in self) {
-        if (/^@.+/.test(i)) {
-            copy[i] = self[i];
-        }
-    }
-    return copy;
+    return smalltalk.send(self, "_basicPerform_withArguments_", [aSymbol, []]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_basicPerform_withArguments_'),
 smalltalk.method({
-selector: unescape('deepCopy'),
-fn: function () {
+selector: unescape('basicPerform%3AwithArguments%3A'),
+fn: function (aSymbol, aCollection) {
     var self = this;
-    var copy = self.klass._new();
-    for (var i in self) {
-        if (/^@.+/.test(i)) {
-            copy[i] = self[i]._deepCopy();
-        }
-    }
-    return copy;
+    return self[aSymbol].apply(self, aCollection);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_postCopy'),
+unescape('_class'),
 smalltalk.method({
-selector: unescape('postCopy'),
+selector: unescape('class'),
 fn: function () {
     var self = this;
+    return self.klass;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('__minus_gt'),
+unescape('_copy'),
 smalltalk.method({
-selector: unescape('-%3E'),
-fn: function (anObject) {
+selector: unescape('copy'),
+fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.Association || Association, "_key_value_", [self, anObject]);
+    return smalltalk.send(smalltalk.send(self, "_shallowCopy", []), "_postCopy", []);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('asString'),
+selector: unescape('deepCopy'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_printString", []);
+    var copy = self.klass._new();
+    for (var i in self) {
+        if (/^@.+/.test(i)) {
+            copy[i] = self[i]._deepCopy();
+        }
+    }
+    return copy;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_deprecatedAPI'),
 smalltalk.method({
-selector: unescape('asJavascript'),
+selector: unescape('deprecatedAPI'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_asString", []);
+    smalltalk.send(typeof console == "undefined" ? nil : console, "_warn_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.getThisContext(), "_home", []), "_asString", []), "__comma", [unescape("%20is%20deprecated%21%20%28in%20")]), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.getThisContext(), "_home", []), "_home", []), "_asString", [])]), "__comma", [unescape("%29")])]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_perform_'),
+unescape('_doesNotUnderstand_'),
 smalltalk.method({
-selector: unescape('perform%3A'),
-fn: function (aSymbol) {
+selector: unescape('doesNotUnderstand%3A'),
+fn: function (aMessage) {
     var self = this;
-    return smalltalk.send(self, "_perform_withArguments_", [aSymbol, []]);
+    (function ($rec) {smalltalk.send($rec, "_receiver_", [self]);smalltalk.send($rec, "_message_", [aMessage]);return smalltalk.send($rec, "_signal", []);}(smalltalk.send(smalltalk.MessageNotUnderstood || MessageNotUnderstood, "_new", [])));
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_perform_withArguments_'),
+unescape('_error_'),
 smalltalk.method({
-selector: unescape('perform%3AwithArguments%3A'),
-fn: function (aSymbol, aCollection) {
+selector: unescape('error%3A'),
+fn: function (aString) {
     var self = this;
-    return smalltalk.send(self, "_basicPerform_withArguments_", [smalltalk.send(aSymbol, "_asSelector", []), aCollection]);
+    smalltalk.send(smalltalk.Error || Error, "_signal_", [aString]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_instVarAt_'),
+unescape('_halt'),
 smalltalk.method({
-selector: unescape('instVarAt%3A'),
-fn: function (aSymbol) {
+selector: unescape('halt'),
+fn: function () {
     var self = this;
-    var varname = nil;
-    varname = smalltalk.send(aSymbol, "_asString", []);
-    return self["@" + varname];
+    smalltalk.send(self, "_error_", ["Halt encountered"]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_instVarAt_put_'),
+unescape('_identityHash'),
 smalltalk.method({
-selector: unescape('instVarAt%3Aput%3A'),
-fn: function (aSymbol, anObject) {
+selector: unescape('identityHash'),
+fn: function () {
     var self = this;
-    var varname = nil;
-    varname = smalltalk.send(aSymbol, "_asString", []);
-    self["@" + varname] = anObject;
+    return self.identityHash || (self.identityHash = smalltalk.nextId());
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_basicAt_'),
+unescape('_ifNil_'),
 smalltalk.method({
-selector: unescape('basicAt%3A'),
-fn: function (aString) {
+selector: unescape('ifNil%3A'),
+fn: function (aBlock) {
     var self = this;
-    return self[aString];
+    return self;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_basicAt_put_'),
+unescape('_ifNil_ifNotNil_'),
 smalltalk.method({
-selector: unescape('basicAt%3Aput%3A'),
-fn: function (aString, anObject) {
+selector: unescape('ifNil%3AifNotNil%3A'),
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    return self[aString] = anObject;
+    return smalltalk.send(anotherBlock, "_value", []);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_error_'),
+unescape('_ifNotNil_'),
 smalltalk.method({
-selector: unescape('error%3A'),
-fn: function (aString) {
+selector: unescape('ifNotNil%3A'),
+fn: function (aBlock) {
     var self = this;
-    smalltalk.send(smalltalk.Error || Error, "_signal_", [aString]);
+    return smalltalk.send(aBlock, "_value", []);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_subclassResponsibility'),
+unescape('_ifNotNil_ifNil_'),
 smalltalk.method({
-selector: unescape('subclassResponsibility'),
-fn: function () {
+selector: unescape('ifNotNil%3AifNil%3A'),
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    smalltalk.send(self, "_error_", ["This method is a responsibility of a subclass"]);
+    return smalltalk.send(aBlock, "_value", []);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_shouldNotImplement'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('shouldNotImplement'),
+selector: unescape('initialize'),
 fn: function () {
     var self = this;
-    smalltalk.send(self, "_error_", [smalltalk.send("This method should not be implemented in ", "__comma", [smalltalk.send(smalltalk.send(self, "_class", []), "_name", [])])]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_try_catch_'),
+unescape('_instVarAt_'),
 smalltalk.method({
-selector: unescape('try%3Acatch%3A'),
-fn: function (aBlock, anotherBlock) {
+selector: unescape('instVarAt%3A'),
+fn: function (aSymbol) {
     var self = this;
-    try {
-        result = aBlock();
-    } catch (e) {
-        result = anotherBlock(e);
-    }
-    return result;
+    var varname = nil;
+    varname = smalltalk.send(aSymbol, "_asString", []);
+    return self["@" + varname];
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_instVarAt_put_'),
 smalltalk.method({
-selector: unescape('printString'),
-fn: function () {
+selector: unescape('instVarAt%3Aput%3A'),
+fn: function (aSymbol, anObject) {
     var self = this;
-    return smalltalk.send("a ", "__comma", [smalltalk.send(smalltalk.send(self, "_class", []), "_name", [])]);
+    var varname = nil;
+    varname = smalltalk.send(aSymbol, "_asString", []);
+    self["@" + varname] = anObject;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_printNl'),
+unescape('_isClass'),
 smalltalk.method({
-selector: unescape('printNl'),
+selector: unescape('isClass'),
 fn: function () {
     var self = this;
-    console.log(self);
+    return false;
     return self;
 }
 }),
@@ -344,58 +372,22 @@ fn: function (aClass) {
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_ifNil_'),
+unescape('_isMetaclass'),
 smalltalk.method({
-selector: unescape('ifNil%3A'),
-fn: function (aBlock) {
+selector: unescape('isMetaclass'),
+fn: function () {
     var self = this;
-    return self;
+    return false;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_ifNil_ifNotNil_'),
+unescape('_isNil'),
 smalltalk.method({
-selector: unescape('ifNil%3AifNotNil%3A'),
-fn: function (aBlock, anotherBlock) {
-    var self = this;
-    return smalltalk.send(anotherBlock, "_value", []);
-    return self;
-}
-}),
-smalltalk.Object);
-
-smalltalk.addMethod(
-unescape('_ifNotNil_'),
-smalltalk.method({
-selector: unescape('ifNotNil%3A'),
-fn: function (aBlock) {
-    var self = this;
-    return smalltalk.send(aBlock, "_value", []);
-    return self;
-}
-}),
-smalltalk.Object);
-
-smalltalk.addMethod(
-unescape('_ifNotNil_ifNil_'),
-smalltalk.method({
-selector: unescape('ifNotNil%3AifNil%3A'),
-fn: function (aBlock, anotherBlock) {
-    var self = this;
-    return smalltalk.send(aBlock, "_value", []);
-    return self;
-}
-}),
-smalltalk.Object);
-
-smalltalk.addMethod(
-unescape('_isNil'),
-smalltalk.method({
-selector: unescape('isNil'),
-fn: function () {
+selector: unescape('isNil'),
+fn: function () {
     var self = this;
     return false;
     return self;
@@ -404,21 +396,21 @@ fn: function () {
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_notNil'),
+unescape('_isNumber'),
 smalltalk.method({
-selector: unescape('notNil'),
+selector: unescape('isNumber'),
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_isNil", []), "_not", []);
+    return false;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isClass'),
+unescape('_isParseFailure'),
 smalltalk.method({
-selector: unescape('isClass'),
+selector: unescape('isParseFailure'),
 fn: function () {
     var self = this;
     return false;
@@ -428,9 +420,9 @@ fn: function () {
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isMetaclass'),
+unescape('_isString'),
 smalltalk.method({
-selector: unescape('isMetaclass'),
+selector: unescape('isString'),
 fn: function () {
     var self = this;
     return false;
@@ -440,9 +432,9 @@ fn: function () {
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isNumber'),
+unescape('_isSymbol'),
 smalltalk.method({
-selector: unescape('isNumber'),
+selector: unescape('isSymbol'),
 fn: function () {
     var self = this;
     return false;
@@ -452,208 +444,216 @@ fn: function () {
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isString'),
+unescape('_log_block_'),
 smalltalk.method({
-selector: unescape('isString'),
-fn: function () {
+selector: unescape('log%3Ablock%3A'),
+fn: function (aString, aBlock) {
     var self = this;
-    return false;
+    var result = nil;
+    smalltalk.send(typeof console == "undefined" ? nil : console, "_log_", [smalltalk.send(smalltalk.send(aString, "__comma", [" time: "]), "__comma", [smalltalk.send(smalltalk.send(smalltalk.Date || Date, "_millisecondsToRun_", [function () {return result = smalltalk.send(aBlock, "_value", []);}]), "_printString", [])])]);
+    return result;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isParseFailure'),
+unescape('_notNil'),
 smalltalk.method({
-selector: unescape('isParseFailure'),
+selector: unescape('notNil'),
 fn: function () {
     var self = this;
-    return false;
+    return smalltalk.send(smalltalk.send(self, "_isNil", []), "_not", []);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_basicPerform_'),
+unescape('_perform_'),
 smalltalk.method({
-selector: unescape('basicPerform%3A'),
+selector: unescape('perform%3A'),
 fn: function (aSymbol) {
     var self = this;
-    return smalltalk.send(self, "_basicPerform_withArguments_", [aSymbol, []]);
+    return smalltalk.send(self, "_perform_withArguments_", [aSymbol, []]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_basicPerform_withArguments_'),
+unescape('_perform_withArguments_'),
 smalltalk.method({
-selector: unescape('basicPerform%3AwithArguments%3A'),
+selector: unescape('perform%3AwithArguments%3A'),
 fn: function (aSymbol, aCollection) {
     var self = this;
-    return self[aSymbol].apply(self, aCollection);
+    return smalltalk.send(self, "_basicPerform_withArguments_", [smalltalk.send(aSymbol, "_asSelector", []), aCollection]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_basicDelete_'),
+unescape('_postCopy'),
 smalltalk.method({
-selector: unescape('basicDelete%3A'),
-fn: function (aString) {
+selector: unescape('postCopy'),
+fn: function () {
     var self = this;
-    delete self[aString];
-    return aString;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_doesNotUnderstand_'),
+unescape('_printNl'),
 smalltalk.method({
-selector: unescape('doesNotUnderstand%3A'),
-fn: function (aMessage) {
+selector: unescape('printNl'),
+fn: function () {
     var self = this;
-    (function ($rec) {smalltalk.send($rec, "_receiver_", [self]);smalltalk.send($rec, "_message_", [aMessage]);return smalltalk.send($rec, "_signal", []);}(smalltalk.send(smalltalk.MessageNotUnderstood || MessageNotUnderstood, "_new", [])));
+    console.log(self);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('asJSON'),
-fn: function (){
-var self=this;
-var variables=nil;
-(variables=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_allInstanceVariableNames", []), "_do_", [(function(each){return smalltalk.send(variables, "_at_put_", [each, smalltalk.send(smalltalk.send(self, "_instVarAt_", [each]), "_asJSON", [])]);})]);
-return variables;
-return self;}
+selector: unescape('printString'),
+fn: function () {
+    var self = this;
+    return smalltalk.send("a ", "__comma", [smalltalk.send(smalltalk.send(self, "_class", []), "_name", [])]);
+    return self;
+}
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_halt'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('halt'),
+selector: unescape('shallowCopy'),
 fn: function () {
     var self = this;
-    smalltalk.send(self, "_error_", ["Halt encountered"]);
+    var copy = self.klass._new();
+    for (var i in self) {
+        if (/^@.+/.test(i)) {
+            copy[i] = self[i];
+        }
+    }
+    return copy;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_log_block_'),
+unescape('_shouldNotImplement'),
 smalltalk.method({
-selector: unescape('log%3Ablock%3A'),
-fn: function (aString, aBlock) {
+selector: unescape('shouldNotImplement'),
+fn: function () {
     var self = this;
-    var result = nil;
-    smalltalk.send(typeof console == "undefined" ? nil : console, "_log_", [smalltalk.send(smalltalk.send(aString, "__comma", [" time: "]), "__comma", [smalltalk.send(smalltalk.send(smalltalk.Date || Date, "_millisecondsToRun_", [function () {return result = smalltalk.send(aBlock, "_value", []);}]), "_printString", [])])]);
-    return result;
+    smalltalk.send(self, "_error_", [smalltalk.send("This method should not be implemented in ", "__comma", [smalltalk.send(smalltalk.send(self, "_class", []), "_name", [])])]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('__eq_eq'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('%3D%3D'),
-fn: function (anObject) {
+selector: unescape('size'),
+fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_identityHash", []), "__eq", [smalltalk.send(anObject, "_identityHash", [])]);
+    smalltalk.send(self, "_error_", ["Object not indexable"]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_%7E%7E'),
+unescape('_storeOn_'),
 smalltalk.method({
-selector: unescape('%7E%7E'),
-fn: function (anObject) {
+selector: unescape('storeOn%3A'),
+fn: function (aStream) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "__eq_eq", [anObject]), "__eq", [false]);
+    smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(self, "_printString", [])]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_deprecatedAPI'),
+unescape('_storeString'),
 smalltalk.method({
-selector: unescape('deprecatedAPI'),
+selector: unescape('storeString'),
 fn: function () {
     var self = this;
-    smalltalk.send(typeof console == "undefined" ? nil : console, "_warn_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.getThisContext(), "_home", []), "_asString", []), "__comma", [unescape("%20is%20deprecated%21%20%28in%20")]), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.getThisContext(), "_home", []), "_home", []), "_asString", [])]), "__comma", [unescape("%29")])]);
+    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (s) {return smalltalk.send(self, "_storeOn_", [s]);}]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_storeString'),
+unescape('_subclassResponsibility'),
 smalltalk.method({
-selector: unescape('storeString'),
+selector: unescape('subclassResponsibility'),
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (s) {return smalltalk.send(self, "_storeOn_", [s]);}]);
+    smalltalk.send(self, "_error_", ["This method is a responsibility of a subclass"]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_storeOn_'),
+unescape('_try_catch_'),
 smalltalk.method({
-selector: unescape('storeOn%3A'),
-fn: function (aStream) {
+selector: unescape('try%3Acatch%3A'),
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(self, "_printString", [])]);
+    try {
+        result = aBlock();
+    } catch (e) {
+        result = anotherBlock(e);
+    }
+    return result;
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_asJSONString'),
+unescape('_yourself'),
 smalltalk.method({
-selector: unescape('asJSONString'),
-fn: function (){
-var self=this;
-return smalltalk.send((smalltalk.JSON || JSON), "_stringify_", [smalltalk.send(self, "_asJSON", [])]);
-return self;}
+selector: unescape('yourself'),
+fn: function () {
+    var self = this;
+    return self;
+    return self;
+}
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_identityHash'),
+unescape('_%7E_eq'),
 smalltalk.method({
-selector: unescape('identityHash'),
-fn: function () {
+selector: unescape('%7E%3D'),
+fn: function (anObject) {
     var self = this;
-    return self.identityHash || (self.identityHash = smalltalk.nextId());
+    return smalltalk.send(smalltalk.send(self, "__eq", [anObject]), "__eq", [false]);
     return self;
 }
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isSymbol'),
+unescape('_%7E%7E'),
 smalltalk.method({
-selector: unescape('isSymbol'),
-fn: function () {
+selector: unescape('%7E%7E'),
+fn: function (anObject) {
     var self = this;
-    return false;
+    return smalltalk.send(smalltalk.send(self, "__eq_eq", [anObject]), "__eq", [false]);
     return self;
 }
 }),
@@ -672,853 +672,802 @@ fn: function () {
 smalltalk.Object.klass);
 
 
-smalltalk.addClass('Smalltalk', smalltalk.Object, [], 'Kernel-Objects');
+smalltalk.addClass('Boolean', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_classes'),
+unescape('_%26'),
 smalltalk.method({
-selector: unescape('classes'),
-fn: function () {
+selector: unescape('%26'),
+fn: function (aBoolean) {
     var self = this;
-    return self.classes();
+    if (self == true) {
+        return aBoolean;
+    } else {
+        return false;
+    }
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_at_'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('at%3A'),
-fn: function (aString) {
+selector: unescape('%3D'),
+fn: function (aBoolean) {
     var self = this;
-    return self[aString];
-    return self;
+    try {
+        ($receiver = smalltalk.send(smalltalk.send(aBoolean, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean ? !$receiver ? function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}]);
+        return Boolean(self == true) == aBoolean;
+        return self;
+    } catch (e) {
+        if (e.name === "stReturn" && e.selector === "__eq") {
+            return e.fn();
+        }
+        throw e;
+    }
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_removeClass_'),
+unescape('_and_'),
 smalltalk.method({
-selector: unescape('removeClass%3A'),
-fn: function (aClass) {
+selector: unescape('and%3A'),
+fn: function (aBlock) {
     var self = this;
-    ($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_asString", []), "__comma", [unescape("%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21")])]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_asString", []), "__comma", [unescape("%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21")])]);}]);
-    smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_do_", [function (each) {return smalltalk.send(aClass, "_removeCompiledMethod_", [each]);}]);
-    smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_methodDictionary", []), "_values", []), "_do_", [function (each) {return smalltalk.send(smalltalk.send(aClass, "_class", []), "_removeCompiledMethod_", [each]);}]);
-    smalltalk.send(self, "_basicDelete_", [smalltalk.send(aClass, "_name", [])]);
+    return smalltalk.send(smalltalk.send(self, "__eq", [true]), "_ifTrue_ifFalse_", [aBlock, function () {return false;}]);
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_basicParse_'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('basicParse%3A'),
-fn: function (aString) {
-    var self = this;
-    return smalltalk.parser.parse(aString);
-    return self;
-}
+selector: unescape('asJSON'),
+fn: function (){
+var self=this;
+return self;
+return self;}
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_parse_'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('parse%3A'),
-fn: function (aString) {
+selector: unescape('deepCopy'),
+fn: function () {
     var self = this;
-    var result = nil;
-    smalltalk.send(self, "_try_catch_", [function () {return result = smalltalk.send(self, "_basicParse_", [aString]);}, function (ex) {return smalltalk.send(smalltalk.send(self, "_parseError_parsing_", [ex, aString]), "_signal", []);}]);
-    return result;
+    return self;
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_parseError_parsing_'),
+unescape('_ifFalse_'),
 smalltalk.method({
-selector: unescape('parseError%3Aparsing%3A'),
-fn: function (anException, aString) {
+selector: unescape('ifFalse%3A'),
+fn: function (aBlock) {
     var self = this;
-    var row = nil;
-    var col = nil;
-    var message = nil;
-    var lines = nil;
-    var badLine = nil;
-    var code = nil;
-    row = anException.line;
-    col = anException.column;
-    message = anException.message;
-    lines = smalltalk.send(aString, "_lines", []);
-    badLine = smalltalk.send(lines, "_at_", [row]);
-    badLine = smalltalk.send(smalltalk.send(smalltalk.send(badLine, "_copyFrom_to_", [1, ($receiver = col).klass === smalltalk.Number ? $receiver - 1 : smalltalk.send($receiver, "__minus", [1])]), "__comma", [unescape("%20%3D%3D%3D%3E")]), "__comma", [smalltalk.send(badLine, "_copyFrom_to_", [col, smalltalk.send(badLine, "_size", [])])]);
-    smalltalk.send(lines, "_at_put_", [row, badLine]);
-    code = smalltalk.send(smalltalk.String || String, "_streamContents_", [function (s) {return smalltalk.send(lines, "_withIndexDo_", [function (l, i) {return smalltalk.send(s, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(i, "_asString", []), "__comma", [": "]), "__comma", [l]), "__comma", [smalltalk.send(smalltalk.String || String, "_lf", [])])]);}]);}]);
-    return smalltalk.send(smalltalk.send(smalltalk.Error || Error, "_new", []), "_messageText_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send("Parse error on line ", "__comma", [row]), "__comma", [" column "]), "__comma", [col]), "__comma", [" : "]), "__comma", [message]), "__comma", [unescape("%20Below%20is%20code%20with%20line%20numbers%20and%20%3D%3D%3D%3E%20marker%20inserted%3A")]), "__comma", [smalltalk.send(smalltalk.String || String, "_lf", [])]), "__comma", [code])]);
+    return smalltalk.send(self, "_ifTrue_ifFalse_", [function () {return nil;}, aBlock]);
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_packages'),
+unescape('_ifFalse_ifTrue_'),
 smalltalk.method({
-selector: unescape('packages'),
-fn: function () {
+selector: unescape('ifFalse%3AifTrue%3A'),
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    return self.packages.all();
+    return smalltalk.send(self, "_ifTrue_ifFalse_", [anotherBlock, aBlock]);
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_packageAt_'),
+unescape('_ifTrue_'),
 smalltalk.method({
-selector: unescape('packageAt%3A'),
-fn: function (packageName) {
+selector: unescape('ifTrue%3A'),
+fn: function (aBlock) {
     var self = this;
-    return self.packages[packageName];
+    return smalltalk.send(self, "_ifTrue_ifFalse_", [aBlock, function () {return nil;}]);
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_packageAt_ifAbsent_'),
+unescape('_ifTrue_ifFalse_'),
 smalltalk.method({
-selector: unescape('packageAt%3AifAbsent%3A'),
-fn: function (packageName, aBlock) {
+selector: unescape('ifTrue%3AifFalse%3A'),
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_packageAt_", [packageName]), "_ifNil_", [aBlock]);
+    if (self == true) {
+        return aBlock();
+    } else {
+        return anotherBlock();
+    }
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_createPackage_'),
+unescape('_not'),
 smalltalk.method({
-selector: unescape('createPackage%3A'),
-fn: function (packageName) {
+selector: unescape('not'),
+fn: function () {
     var self = this;
-    return smalltalk.addPackage(packageName, nil);
+    return smalltalk.send(self, "__eq", [false]);
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_deletePackage_'),
+unescape('_or_'),
 smalltalk.method({
-selector: unescape('deletePackage%3A'),
-fn: function (packageName) {
+selector: unescape('or%3A'),
+fn: function (aBlock) {
     var self = this;
-    delete smalltalk.packages[packageName];
+    return smalltalk.send(smalltalk.send(self, "__eq", [true]), "_ifTrue_ifFalse_", [function () {return true;}, aBlock]);
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_removePackage_'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('removePackage%3A'),
-fn: function (packageName) {
+selector: unescape('printString'),
+fn: function () {
     var self = this;
-    var pkg = nil;
-    pkg = smalltalk.send(self, "_packageAt_ifAbsent_", [packageName, function () {return smalltalk.send(self, "_error_", [smalltalk.send("Missing package: ", "__comma", [packageName])]);}]);
-    smalltalk.send(smalltalk.send(pkg, "_classes", []), "_do_", [function (each) {return smalltalk.send(self, "_removeClass_", [each]);}]);
-    smalltalk.send(self, "_deletePackage_", [packageName]);
+    return self.toString();
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_renamePackage_to_'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('renamePackage%3Ato%3A'),
-fn: function (packageName, newName) {
+selector: unescape('shallowCopy'),
+fn: function () {
     var self = this;
-    var pkg = nil;
-    pkg = smalltalk.send(self, "_packageAt_ifAbsent_", [packageName, function () {return smalltalk.send(self, "_error_", [smalltalk.send("Missing package: ", "__comma", [packageName])]);}]);
-    ($receiver = smalltalk.send(self, "_packageAt_", [newName])) != nil &&
-        $receiver != undefined ? function () {return smalltalk.send(self, "_error_", [smalltalk.send("Already exists a package called: ", "__comma", [newName])]);}() : nil;
-    smalltalk.packages[newName] = smalltalk.packages[packageName];
-    smalltalk.send(pkg, "_name_", [newName]);
-    smalltalk.send(self, "_deletePackage_", [packageName]);
+    return self;
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_reservedWords'),
+unescape('_%7C'),
 smalltalk.method({
-selector: unescape('reservedWords'),
-fn: function () {
+selector: unescape('%7C'),
+fn: function (aBoolean) {
     var self = this;
-    return self.reservedWords;
+    if (self == true) {
+        return true;
+    } else {
+        return aBoolean;
+    }
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
+
 
+
+smalltalk.addClass('Date', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_createPackage_properties_'),
+unescape('__plus'),
 smalltalk.method({
-selector: unescape('createPackage%3Aproperties%3A'),
-fn: function (packageName, aDict) {
+selector: unescape('+'),
+fn: function (aDate) {
     var self = this;
-    var object = nil;
-    object = {};
-    smalltalk.send(aDict, "_keysAndValuesDo_", [function (key, value) {return object[key] = value;}]);
-    return smalltalk.addPackage(packageName, object);
+    return self + aDate;
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_readJSObject_'),
+unescape('__minus'),
 smalltalk.method({
-selector: unescape('readJSObject%3A'),
-fn: function (anObject) {
+selector: unescape('-'),
+fn: function (aDate) {
     var self = this;
-    return self.readJSObject(anObject);
+    return self - aDate;
     return self;
 }
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_send_to_arguments_'),
+unescape('__lt'),
 smalltalk.method({
-selector: unescape('send%3Ato%3Aarguments%3A'),
-fn: function (aSelector, anObject, aCollection) {
+selector: unescape('%3C'),
+fn: function (aDate) {
     var self = this;
-    var selector = nil;
-    selector = smalltalk.send(smalltalk.send(aSelector, "_asString", []), "_asSelector", []);
-    self.send(anObject, selector, aCollection);
+    return self < aDate;
     return self;
 }
 }),
-smalltalk.Smalltalk);
-
+smalltalk.Date);
 
-smalltalk.Smalltalk.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_current'),
+unescape('__lt_eq'),
 smalltalk.method({
-selector: unescape('current'),
-fn: function () {
+selector: unescape('%3C%3D'),
+fn: function (aDate) {
     var self = this;
-    return smalltalk;
+    return self <= aDate;
     return self;
 }
 }),
-smalltalk.Smalltalk.klass);
-
+smalltalk.Date);
 
-smalltalk.addClass('Package', smalltalk.Object, ['commitPathJs', 'commitPathSt'], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_name'),
+unescape('__gt'),
 smalltalk.method({
-selector: unescape('name'),
-fn: function () {
+selector: unescape('%3E'),
+fn: function (aDate) {
     var self = this;
-    return self.pkgName;
+    return self > aDate;
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_name_'),
+unescape('__gt_eq'),
 smalltalk.method({
-selector: unescape('name%3A'),
-fn: function (aString) {
+selector: unescape('%3E%3D'),
+fn: function (aDate) {
     var self = this;
-    self.pkgName = aString;
+    return self >= aDate;
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_classes'),
+unescape('_asDateString'),
 smalltalk.method({
-selector: unescape('classes'),
+selector: unescape('asDateString'),
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_classes", []), "_select_", [function (c) {return smalltalk.send(smalltalk.send(c, "_package", []), "__eq_eq", [self]);}]);
+    return self.toDateString();
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_asLocaleString'),
 smalltalk.method({
-selector: unescape('printString'),
+selector: unescape('asLocaleString'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_name", []);
+    return self.toLocaleString();
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_dependencies'),
+unescape('_asMilliseconds'),
 smalltalk.method({
-selector: unescape('dependencies'),
+selector: unescape('asMilliseconds'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_propertyAt_ifAbsent_", ["dependencies", function () {return [];}]);
+    return smalltalk.send(self, "_time", []);
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_dependencies_'),
+unescape('_asNumber'),
 smalltalk.method({
-selector: unescape('dependencies%3A'),
-fn: function (anArray) {
+selector: unescape('asNumber'),
+fn: function () {
     var self = this;
-    return smalltalk.send(self, "_propertyAt_put_", ["dependencies", anArray]);
+    return smalltalk.send(self, "_asMilliseconds", []);
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_properties'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('properties'),
+selector: unescape('asString'),
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_readJSObject_", [smalltalk.send(self, "_basicAt_", ["properties"])]);
+    return self.toString();
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_propertiesAsJSON'),
+unescape('_asTimeString'),
 smalltalk.method({
-selector: unescape('propertiesAsJSON'),
+selector: unescape('asTimeString'),
 fn: function () {
     var self = this;
-    return JSON.stringify(self.properties);
+    return self.toTimeString();
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_properties_'),
+unescape('_day'),
 smalltalk.method({
-selector: unescape('properties%3A'),
-fn: function (aDict) {
+selector: unescape('day'),
+fn: function () {
     var self = this;
-    var object = nil;
-    object = {};
-    smalltalk.send(aDict, "_keysAndValuesDo_", [function (key, value) {return object[key] = value;}]);
-    return self.properties = object;
+    return smalltalk.send(self, "_dayOfWeek", []);
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_jsProperties'),
+unescape('_day_'),
 smalltalk.method({
-selector: unescape('jsProperties'),
-fn: function () {
+selector: unescape('day%3A'),
+fn: function (aNumber) {
     var self = this;
-    return self.properties;
+    smalltalk.send(self, "_day_", [aNumber]);
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_jsProperties_'),
+unescape('_dayOfMonth'),
 smalltalk.method({
-selector: unescape('jsProperties%3A'),
-fn: function (aJSObject) {
+selector: unescape('dayOfMonth'),
+fn: function () {
     var self = this;
-    return self.properties = aJSObject;
+    return self.getDate();
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_propertyAt_'),
+unescape('_dayOfMonth_'),
 smalltalk.method({
-selector: unescape('propertyAt%3A'),
-fn: function (key) {
+selector: unescape('dayOfMonth%3A'),
+fn: function (aNumber) {
     var self = this;
-    return self.properties[key];
+    self.setDate(aNumber);
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_propertyAt_put_'),
+unescape('_dayOfWeek'),
 smalltalk.method({
-selector: unescape('propertyAt%3Aput%3A'),
-fn: function (key, value) {
+selector: unescape('dayOfWeek'),
+fn: function () {
     var self = this;
-    return self.properties[key] = value;
+    return self.getDay() + 1;
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_propertyAt_ifAbsent_'),
+unescape('_dayOfWeek_'),
 smalltalk.method({
-selector: unescape('propertyAt%3AifAbsent%3A'),
-fn: function (key, block) {
+selector: unescape('dayOfWeek%3A'),
+fn: function (aNumber) {
     var self = this;
-    return ($receiver = smalltalk.send(self, "_propertyAt_", [key])) == nil ||
-        $receiver == undefined ? function () {return smalltalk.send(block, "_value", []);}() : $receiver;
+    return self.setDay(aNumber - 1);
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_commitPathJs'),
+unescape('_hours'),
 smalltalk.method({
-selector: unescape('commitPathJs'),
+selector: unescape('hours'),
 fn: function () {
     var self = this;
-    return ($receiver = self['@commitPathJs']) == nil ||
-        $receiver == undefined ? function () {return smalltalk.send(smalltalk.send(self, "_class", []), "_defaultCommitPathJs", []);}() : $receiver;
+    return self.getHours();
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_commitPathJs_'),
+unescape('_hours_'),
 smalltalk.method({
-selector: unescape('commitPathJs%3A'),
-fn: function (aString) {
+selector: unescape('hours%3A'),
+fn: function (aNumber) {
     var self = this;
-    self['@commitPathJs'] = aString;
+    self.setHours(aNumber);
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_commitPathSt'),
+unescape('_milliseconds'),
 smalltalk.method({
-selector: unescape('commitPathSt'),
+selector: unescape('milliseconds'),
 fn: function () {
     var self = this;
-    return ($receiver = self['@commitPathSt']) == nil ||
-        $receiver == undefined ? function () {return smalltalk.send(smalltalk.send(self, "_class", []), "_defaultCommitPathSt", []);}() : $receiver;
+    return self.getMilliseconds();
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_commitPathSt_'),
+unescape('_milliseconds_'),
 smalltalk.method({
-selector: unescape('commitPathSt%3A'),
-fn: function (aString) {
+selector: unescape('milliseconds%3A'),
+fn: function (aNumber) {
     var self = this;
-    self['@commitPathSt'] = aString;
+    self.setMilliseconds(aNumber);
     return self;
 }
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_sortedClasses'),
+unescape('_minutes'),
 smalltalk.method({
-selector: unescape('sortedClasses'),
+selector: unescape('minutes'),
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_classes", []), "_inject_into_", [[], function (acc, each) {return ($receiver = smalltalk.send(acc, "_isEmpty", [])).klass === smalltalk.Boolean ? $receiver ? function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}() : function () {return ($receiver = smalltalk.send(acc, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean ? $receiver ? function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}() : function () {return smalltalk.send([each], "__comma", [acc]);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}, function () {return smalltalk.send([each], "__comma", [acc]);}]);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}, function () {return ($receiver = smalltalk.send(acc, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean ? $receiver ? function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}() : function () {return smalltalk.send([each], "__comma", [acc]);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}, function () {return smalltalk.send([each], "__comma", [acc]);}]);}]);}]);
+    return self.getMinutes();
     return self;
 }
 }),
-smalltalk.Package);
-
+smalltalk.Date);
 
-smalltalk.Package.klass.iVarNames = ['defaultCommitPathJs','defaultCommitPathSt'];
 smalltalk.addMethod(
-unescape('_named_'),
+unescape('_minutes_'),
 smalltalk.method({
-selector: unescape('named%3A'),
-fn: function (aPackageName) {
+selector: unescape('minutes%3A'),
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_packageAt_", [aPackageName]);
+    self.setMinutes(aNumber);
     return self;
 }
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_named_ifAbsent_'),
+unescape('_month'),
 smalltalk.method({
-selector: unescape('named%3AifAbsent%3A'),
-fn: function (aPackageName, aBlock) {
+selector: unescape('month'),
+fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_packageAt_ifAbsent_", [aPackageName, aBlock]);
+    return self.getMonth() + 1;
     return self;
 }
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_defaultCommitPathJs'),
+unescape('_month_'),
 smalltalk.method({
-selector: unescape('defaultCommitPathJs'),
-fn: function () {
+selector: unescape('month%3A'),
+fn: function (aNumber) {
     var self = this;
-    return ($receiver = self['@defaultCommitPathJs']) == nil ||
-        $receiver == undefined ? function () {return self['@defaultCommitPathJs'] = "js";}() : $receiver;
+    self.setMonth(aNumber - 1);
     return self;
 }
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_defaultCommitPathJs_'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('defaultCommitPathJs%3A'),
-fn: function (aString) {
+selector: unescape('printString'),
+fn: function () {
     var self = this;
-    self['@defaultCommitPathJs'] = aString;
+    return smalltalk.send(self, "_asString", []);
     return self;
 }
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_defaultCommitPathSt'),
+unescape('_seconds'),
 smalltalk.method({
-selector: unescape('defaultCommitPathSt'),
+selector: unescape('seconds'),
 fn: function () {
     var self = this;
-    return ($receiver = self['@defaultCommitPathSt']) == nil ||
-        $receiver == undefined ? function () {return self['@defaultCommitPathSt'] = "st";}() : $receiver;
+    return self.getSeconds();
     return self;
 }
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_defaultCommitPathSt_'),
+unescape('_seconds_'),
 smalltalk.method({
-selector: unescape('defaultCommitPathSt%3A'),
-fn: function (aString) {
+selector: unescape('seconds%3A'),
+fn: function (aNumber) {
     var self = this;
-    self['@defaultCommitPathSt'] = aString;
+    self.setSeconds(aNumber);
     return self;
 }
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_resetCommitPaths'),
+unescape('_time'),
 smalltalk.method({
-selector: unescape('resetCommitPaths'),
+selector: unescape('time'),
 fn: function () {
     var self = this;
-    self['@defaultCommitPathJs'] = nil;
-    self['@defaultCommitPathSt'] = nil;
+    return self.getTime();
     return self;
 }
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_fetch_prefix_'),
+unescape('_time_'),
 smalltalk.method({
-selector: unescape('fetch%3Aprefix%3A'),
-fn: function (aPackageName, aPrefix) {
+selector: unescape('time%3A'),
+fn: function (aNumber) {
     var self = this;
-    smalltalk.send(typeof jQuery == "undefined" ? nil : jQuery, "_getScript_onSuccess_", [smalltalk.send(smalltalk.send(aPrefix, "__comma", [aPackageName]), "__comma", [".js"]), function () {return smalltalk.send(smalltalk.Package || Package, "_init_", [aPackageName]);}]);
+    self.setTime(aNumber);
     return self;
 }
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_fetch_'),
+unescape('_year'),
 smalltalk.method({
-selector: unescape('fetch%3A'),
-fn: function (aPackageName) {
+selector: unescape('year'),
+fn: function () {
     var self = this;
-    smalltalk.send(self, "_fetch_prefix_", [aPackageName, smalltalk.send(smalltalk.send(self, "_defaultCommitPathJs", []), "__comma", [unescape("/")])]);
+    return self.getFullYear();
     return self;
 }
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_commitToLocalStorage_'),
+unescape('_year_'),
 smalltalk.method({
-selector: unescape('commitToLocalStorage%3A'),
-fn: function (aPackageName) {
+selector: unescape('year%3A'),
+fn: function (aNumber) {
     var self = this;
-    var key = nil;
-    var sourceCode = nil;
-    key = smalltalk.send("smalltalk.packages.", "__comma", [aPackageName]);
-    sourceCode = smalltalk.send(smalltalk.send(smalltalk.Exporter || Exporter, "_new", []), "_exportPackage_", [aPackageName]);
-    localStorage[key] = escape(sourceCode);
+    self.setFullYear(aNumber);
     return self;
 }
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
+
 
 smalltalk.addMethod(
-unescape('_init_'),
+unescape('_fromMilliseconds_'),
 smalltalk.method({
-selector: unescape('init%3A'),
-fn: function (aPackageName) {
+selector: unescape('fromMilliseconds%3A'),
+fn: function (aNumber) {
     var self = this;
-    (function ($rec) {smalltalk.send($rec, "_do_", [function (each) {return smalltalk.init(each);}]);return smalltalk.send($rec, "_do_", [function (each) {return smalltalk.send(each, "_initialize", []);}]);}(smalltalk.send(smalltalk.send(typeof smalltalk == "undefined" ? nil : smalltalk, "_classes", []), "_select_", [function (each) {return each.pkg.pkgName == aPackageName;}])));
+    return smalltalk.send(self, "_new_", [aNumber]);
     return self;
 }
 }),
-smalltalk.Package.klass);
-
+smalltalk.Date.klass);
 
-smalltalk.addClass('Number', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_fromSeconds_'),
 smalltalk.method({
-selector: unescape('%3D'),
+selector: unescape('fromSeconds%3A'),
 fn: function (aNumber) {
     var self = this;
-    try {
-        ($receiver = smalltalk.send(aNumber, "_isNumber", [])).klass === smalltalk.Boolean ? !$receiver ? function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}]);
-        return Number(self) == aNumber;
-        return self;
-    } catch (e) {
-        if (e.name === "stReturn" && e.selector === "__eq") {
-            return e.fn();
-        }
-        throw e;
-    }
+    return smalltalk.send(self, "_fromMilliseconds_", [($receiver = aNumber).klass === smalltalk.Number ? $receiver * 1000 : smalltalk.send($receiver, "__star", [1000])]);
+    return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('__gt'),
+unescape('_fromString_'),
 smalltalk.method({
-selector: unescape('%3E'),
-fn: function (aNumber) {
+selector: unescape('fromString%3A'),
+fn: function (aString) {
     var self = this;
-    return self > aNumber;
+    return smalltalk.send(self, "_new_", [aString]);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('__lt'),
+unescape('_millisecondsToRun_'),
 smalltalk.method({
-selector: unescape('%3C'),
-fn: function (aNumber) {
+selector: unescape('millisecondsToRun%3A'),
+fn: function (aBlock) {
     var self = this;
-    return self < aNumber;
+    var t = nil;
+    t = smalltalk.send(smalltalk.Date || Date, "_now", []);
+    smalltalk.send(aBlock, "_value", []);
+    return ($receiver = smalltalk.send(smalltalk.Date || Date, "_now", [])).klass === smalltalk.Number ? $receiver - t : smalltalk.send($receiver, "__minus", [t]);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('__gt_eq'),
+unescape('_new_'),
 smalltalk.method({
-selector: unescape('%3E%3D'),
-fn: function (aNumber) {
+selector: unescape('new%3A'),
+fn: function (anObject) {
     var self = this;
-    return self >= aNumber;
+    return new Date(anObject);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('__lt_eq'),
+unescape('_now'),
 smalltalk.method({
-selector: unescape('%3C%3D'),
-fn: function (aNumber) {
+selector: unescape('now'),
+fn: function () {
     var self = this;
-    return self <= aNumber;
+    return smalltalk.send(self, "_today", []);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('__plus'),
+unescape('_today'),
 smalltalk.method({
-selector: unescape('+'),
-fn: function (aNumber) {
+selector: unescape('today'),
+fn: function () {
     var self = this;
-    return self + aNumber;
+    return smalltalk.send(self, "_new", []);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
+
 
+smalltalk.addClass('Date', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('__minus'),
+unescape('__plus'),
 smalltalk.method({
-selector: unescape('-'),
-fn: function (aNumber) {
+selector: unescape('+'),
+fn: function (aDate) {
     var self = this;
-    return self - aNumber;
+    return self + aDate;
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('__star'),
+unescape('__minus'),
 smalltalk.method({
-selector: unescape('*'),
-fn: function (aNumber) {
+selector: unescape('-'),
+fn: function (aDate) {
     var self = this;
-    return self * aNumber;
+    return self - aDate;
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('__slash'),
+unescape('__lt'),
 smalltalk.method({
-selector: unescape('/'),
-fn: function (aNumber) {
+selector: unescape('%3C'),
+fn: function (aDate) {
     var self = this;
-    return self / aNumber;
+    return self < aDate;
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_max_'),
+unescape('__lt_eq'),
 smalltalk.method({
-selector: unescape('max%3A'),
-fn: function (aNumber) {
+selector: unescape('%3C%3D'),
+fn: function (aDate) {
     var self = this;
-    return Math.max(self, aNumber);
+    return self <= aDate;
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_min_'),
+unescape('__gt'),
 smalltalk.method({
-selector: unescape('min%3A'),
-fn: function (aNumber) {
+selector: unescape('%3E'),
+fn: function (aDate) {
     var self = this;
-    return Math.min(self, aNumber);
+    return self > aDate;
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_rounded'),
+unescape('__gt_eq'),
 smalltalk.method({
-selector: unescape('rounded'),
-fn: function () {
+selector: unescape('%3E%3D'),
+fn: function (aDate) {
     var self = this;
-    return Math.round(self);
+    return self >= aDate;
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_truncated'),
+unescape('_asDateString'),
 smalltalk.method({
-selector: unescape('truncated'),
+selector: unescape('asDateString'),
 fn: function () {
     var self = this;
-    var result = nil;
-    ($receiver = self >= 0).klass === smalltalk.Boolean ? $receiver ? function () {return result = Math.floor(self);}() : function () {return result = Math.floor(self * -1) * -1;}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return result = Math.floor(self);}, function () {return result = Math.floor(self * -1) * -1;}]);
-    return result;
+    return self.toDateString();
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_to_'),
+unescape('_asLocaleString'),
 smalltalk.method({
-selector: unescape('to%3A'),
-fn: function (aNumber) {
+selector: unescape('asLocaleString'),
+fn: function () {
     var self = this;
-    var array = nil;
-    var first = nil;
-    var last = nil;
-    var count = nil;
-    first = smalltalk.send(self, "_truncated", []);
-    last = ($receiver = smalltalk.send(aNumber, "_truncated", [])).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);
-    count = 1;
-    array = smalltalk.send(smalltalk.Array || Array, "_new", []);
-    smalltalk.send(($receiver = last).klass === smalltalk.Number ? $receiver - first : smalltalk.send($receiver, "__minus", [first]), "_timesRepeat_", [function () {smalltalk.send(array, "_at_put_", [count, first]);count = ($receiver = count).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return first = ($receiver = first).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}]);
-    return array;
+    return self.toLocaleString();
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_timesRepeat_'),
+unescape('_asMilliseconds'),
 smalltalk.method({
-selector: unescape('timesRepeat%3A'),
-fn: function (aBlock) {
+selector: unescape('asMilliseconds'),
+fn: function () {
     var self = this;
-    var integer = nil;
-    var count = nil;
-    integer = smalltalk.send(self, "_truncated", []);
-    count = 1;
-    (function () {while (!function () {return ($receiver = count).klass === smalltalk.Number ? $receiver > self : smalltalk.send($receiver, "__gt", [self]);}()) {(function () {smalltalk.send(aBlock, "_value", []);return count = ($receiver = count).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}());}}());
+    return smalltalk.send(self, "_time", []);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_to_do_'),
+unescape('_asNumber'),
 smalltalk.method({
-selector: unescape('to%3Ado%3A'),
-fn: function (stop, aBlock) {
+selector: unescape('asNumber'),
+fn: function () {
     var self = this;
-    var nextValue = nil;
-    nextValue = self;
-    (function () {while (function () {return ($receiver = nextValue).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [nextValue]);return nextValue = ($receiver = nextValue).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}());}}());
+    return smalltalk.send(self, "_asMilliseconds", []);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
 unescape('_asString'),
@@ -1526,456 +1475,459 @@ smalltalk.method({
 selector: unescape('asString'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_printString", []);
+    return self.toString();
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_asTimeString'),
 smalltalk.method({
-selector: unescape('asJavascript'),
+selector: unescape('asTimeString'),
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(unescape("%28"), "__comma", [smalltalk.send(self, "_printString", [])]), "__comma", [unescape("%29")]);
+    return self.toTimeString();
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_day'),
 smalltalk.method({
-selector: unescape('printString'),
+selector: unescape('day'),
 fn: function () {
     var self = this;
-    return String(self);
+    return smalltalk.send(self, "_dayOfWeek", []);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_isNumber'),
+unescape('_day_'),
 smalltalk.method({
-selector: unescape('isNumber'),
-fn: function () {
+selector: unescape('day%3A'),
+fn: function (aNumber) {
     var self = this;
-    return true;
+    smalltalk.send(self, "_day_", [aNumber]);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_atRandom'),
+unescape('_dayOfMonth'),
 smalltalk.method({
-selector: unescape('atRandom'),
+selector: unescape('dayOfMonth'),
 fn: function () {
     var self = this;
-    return ($receiver = smalltalk.send(($receiver = smalltalk.send(smalltalk.send(smalltalk.Random || Random, "_new", []), "_next", [])).klass === smalltalk.Number ? $receiver * self : smalltalk.send($receiver, "__star", [self]), "_truncated", [])).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);
+    return self.getDate();
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('__at'),
+unescape('_dayOfMonth_'),
 smalltalk.method({
-selector: unescape('@'),
+selector: unescape('dayOfMonth%3A'),
 fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [self, aNumber]);
+    self.setDate(aNumber);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_asPoint'),
+unescape('_dayOfWeek'),
 smalltalk.method({
-selector: unescape('asPoint'),
+selector: unescape('dayOfWeek'),
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [self, self]);
+    return self.getDay() + 1;
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_clearInterval'),
+unescape('_dayOfWeek_'),
 smalltalk.method({
-selector: unescape('clearInterval'),
-fn: function () {
+selector: unescape('dayOfWeek%3A'),
+fn: function (aNumber) {
     var self = this;
-    clearInterval(Number(self));
+    return self.setDay(aNumber - 1);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_clearTimeout'),
+unescape('_hours'),
 smalltalk.method({
-selector: unescape('clearTimeout'),
+selector: unescape('hours'),
 fn: function () {
     var self = this;
-    clearTimeout(Number(self));
+    return self.getHours();
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_even'),
+unescape('_hours_'),
 smalltalk.method({
-selector: unescape('even'),
-fn: function () {
+selector: unescape('hours%3A'),
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(0, "__eq", [smalltalk.send(self, "_\\\\", [2])]);
+    self.setHours(aNumber);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_odd'),
+unescape('_milliseconds'),
 smalltalk.method({
-selector: unescape('odd'),
+selector: unescape('milliseconds'),
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_even", []), "_not", []);
+    return self.getMilliseconds();
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_negated'),
+unescape('_milliseconds_'),
 smalltalk.method({
-selector: unescape('negated'),
-fn: function () {
+selector: unescape('milliseconds%3A'),
+fn: function (aNumber) {
     var self = this;
-    return 0 - self;
+    self.setMilliseconds(aNumber);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_printShowingDecimalPlaces_'),
+unescape('_minutes'),
 smalltalk.method({
-selector: unescape('printShowingDecimalPlaces%3A'),
-fn: function (placesDesired) {
+selector: unescape('minutes'),
+fn: function () {
     var self = this;
-    return self.toFixed(placesDesired);
+    return self.getMinutes();
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_to_by_'),
+unescape('_minutes_'),
 smalltalk.method({
-selector: unescape('to%3Aby%3A'),
-fn: function (stop, step) {
+selector: unescape('minutes%3A'),
+fn: function (aNumber) {
     var self = this;
-    var array = nil;
-    var value = nil;
-    var pos = nil;
-    value = self;
-    array = smalltalk.send(smalltalk.Array || Array, "_new", []);
-    pos = 1;
-    ($receiver = smalltalk.send(step, "__eq", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}]);
-    ($receiver = ($receiver = step).klass === smalltalk.Number ? $receiver < 0 : smalltalk.send($receiver, "__lt", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}, function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}]);
-    return array;
+    self.setMinutes(aNumber);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_to_by_do_'),
+unescape('_month'),
 smalltalk.method({
-selector: unescape('to%3Aby%3Ado%3A'),
-fn: function (stop, step, aBlock) {
+selector: unescape('month'),
+fn: function () {
     var self = this;
-    var value = nil;
-    value = self;
-    ($receiver = smalltalk.send(step, "__eq", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}]);
-    ($receiver = ($receiver = step).klass === smalltalk.Number ? $receiver < 0 : smalltalk.send($receiver, "__lt", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}, function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}]);
+    return self.getMonth() + 1;
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_month_'),
 smalltalk.method({
-selector: unescape('deepCopy'),
-fn: function () {
+selector: unescape('month%3A'),
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(self, "_copy", []);
+    self.setMonth(aNumber - 1);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_copy'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('copy'),
+selector: unescape('printString'),
 fn: function () {
     var self = this;
-    return self;
+    return smalltalk.send(self, "_asString", []);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_%5C%5C'),
+unescape('_seconds'),
 smalltalk.method({
-selector: unescape('%5C%5C'),
-fn: function (aNumber) {
+selector: unescape('seconds'),
+fn: function () {
     var self = this;
-    return self % aNumber;
+    return self.getSeconds();
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_sqrt'),
+unescape('_seconds_'),
 smalltalk.method({
-selector: unescape('sqrt'),
-fn: function () {
+selector: unescape('seconds%3A'),
+fn: function (aNumber) {
     var self = this;
-    return Math.sqrt(self);
+    self.setSeconds(aNumber);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_squared'),
+unescape('_time'),
 smalltalk.method({
-selector: unescape('squared'),
+selector: unescape('time'),
 fn: function () {
     var self = this;
-    return self * self;
+    return self.getTime();
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_identityHash'),
+unescape('_time_'),
 smalltalk.method({
-selector: unescape('identityHash'),
-fn: function () {
+selector: unescape('time%3A'),
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_asString", []), "__comma", ["n"]);
+    self.setTime(aNumber);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_negative'),
+unescape('_year'),
 smalltalk.method({
-selector: unescape('negative'),
+selector: unescape('year'),
 fn: function () {
     var self = this;
-    return self < 0;
+    return self.getFullYear();
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_positive'),
+unescape('_year_'),
 smalltalk.method({
-selector: unescape('positive'),
-fn: function () {
+selector: unescape('year%3A'),
+fn: function (aNumber) {
     var self = this;
-    return self >= 0;
+    self.setFullYear(aNumber);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date);
+
 
 smalltalk.addMethod(
-unescape('_isZero'),
+unescape('_fromMilliseconds_'),
 smalltalk.method({
-selector: unescape('isZero'),
-fn: function () {
+selector: unescape('fromMilliseconds%3A'),
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(self, "__eq", [0]);
+    return smalltalk.send(self, "_new_", [aNumber]);
     return self;
 }
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_fromSeconds_'),
 smalltalk.method({
-selector: unescape('asJSON'),
-fn: function (){
-var self=this;
-return self;
-return self;}
+selector: unescape('fromSeconds%3A'),
+fn: function (aNumber) {
+    var self = this;
+    return smalltalk.send(self, "_fromMilliseconds_", [($receiver = aNumber).klass === smalltalk.Number ? $receiver * 1000 : smalltalk.send($receiver, "__star", [1000])]);
+    return self;
+}
 }),
-smalltalk.Number);
-
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_pi'),
+unescape('_fromString_'),
 smalltalk.method({
-selector: unescape('pi'),
-fn: function () {
+selector: unescape('fromString%3A'),
+fn: function (aString) {
     var self = this;
-    return Math.PI;
+    return smalltalk.send(self, "_new_", [aString]);
     return self;
 }
 }),
-smalltalk.Number.klass);
-
+smalltalk.Date.klass);
 
-smalltalk.addClass('Boolean', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_millisecondsToRun_'),
 smalltalk.method({
-selector: unescape('%3D'),
-fn: function (aBoolean) {
+selector: unescape('millisecondsToRun%3A'),
+fn: function (aBlock) {
     var self = this;
-    try {
-        ($receiver = smalltalk.send(smalltalk.send(aBoolean, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean ? !$receiver ? function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}]);
-        return Boolean(self == true) == aBoolean;
-        return self;
-    } catch (e) {
-        if (e.name === "stReturn" && e.selector === "__eq") {
-            return e.fn();
-        }
-        throw e;
-    }
+    var t = nil;
+    t = smalltalk.send(smalltalk.Date || Date, "_now", []);
+    smalltalk.send(aBlock, "_value", []);
+    return ($receiver = smalltalk.send(smalltalk.Date || Date, "_now", [])).klass === smalltalk.Number ? $receiver - t : smalltalk.send($receiver, "__minus", [t]);
+    return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_new_'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
-fn: function () {
+selector: unescape('new%3A'),
+fn: function (anObject) {
     var self = this;
-    return self;
+    return new Date(anObject);
     return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_now'),
 smalltalk.method({
-selector: unescape('deepCopy'),
+selector: unescape('now'),
 fn: function () {
     var self = this;
-    return self;
+    return smalltalk.send(self, "_today", []);
     return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_ifTrue_'),
+unescape('_today'),
 smalltalk.method({
-selector: unescape('ifTrue%3A'),
-fn: function (aBlock) {
+selector: unescape('today'),
+fn: function () {
     var self = this;
-    return smalltalk.send(self, "_ifTrue_ifFalse_", [aBlock, function () {return nil;}]);
+    return smalltalk.send(self, "_new", []);
     return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.Date.klass);
+
 
+smalltalk.addClass('JSObjectProxy', smalltalk.Object, ['jsObject'], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_ifFalse_'),
+unescape('_at_'),
 smalltalk.method({
-selector: unescape('ifFalse%3A'),
-fn: function (aBlock) {
+selector: unescape('at%3A'),
+fn: function (aSymbol) {
     var self = this;
-    return smalltalk.send(self, "_ifTrue_ifFalse_", [function () {return nil;}, aBlock]);
+    var attr = nil;
+    attr = smalltalk.send(aSymbol, "_asString", []);
+    return self['@jsObject'][attr];
     return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-unescape('_ifFalse_ifTrue_'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('ifFalse%3AifTrue%3A'),
-fn: function (aBlock, anotherBlock) {
+selector: unescape('at%3Aput%3A'),
+fn: function (aSymbol, anObject) {
     var self = this;
-    return smalltalk.send(self, "_ifTrue_ifFalse_", [anotherBlock, aBlock]);
+    var attr = nil;
+    attr = smalltalk.send(aSymbol, "_asString", []);
+    self['@jsObject'][attr] = anObject;
     return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-unescape('_ifTrue_ifFalse_'),
+unescape('_doesNotUnderstand_'),
 smalltalk.method({
-selector: unescape('ifTrue%3AifFalse%3A'),
-fn: function (aBlock, anotherBlock) {
+selector: unescape('doesNotUnderstand%3A'),
+fn: function (aMessage) {
     var self = this;
-    if (self == true) {
-        return aBlock();
-    } else {
-        return anotherBlock();
+    var obj = nil;
+    var selector = nil;
+    var jsSelector = nil;
+    var arguments = nil;
+    obj = smalltalk.send(self, "_jsObject", []);
+    selector = smalltalk.send(aMessage, "_selector", []);
+    jsSelector = smalltalk.send(selector, "_asJavaScriptSelector", []);
+    arguments = smalltalk.send(aMessage, "_arguments", []);
+    if (obj[jsSelector] != undefined) {
+        return smalltalk.send(obj, jsSelector, arguments);
     }
+    smalltalk.send(self, "_doesNotUnderstand_", [aMessage], smalltalk.Object);
     return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-unescape('_and_'),
+unescape('_inspectOn_'),
 smalltalk.method({
-selector: unescape('and%3A'),
-fn: function (aBlock) {
+selector: unescape('inspectOn%3A'),
+fn: function (anInspector) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "__eq", [true]), "_ifTrue_ifFalse_", [aBlock, function () {return false;}]);
+    var variables = nil;
+    variables = smalltalk.send(smalltalk.Dictionary || Dictionary, "_new", []);
+    smalltalk.send(variables, "_at_put_", [unescape("%23self"), smalltalk.send(self, "_jsObject", [])]);
+    smalltalk.send(anInspector, "_setLabel_", [smalltalk.send(self, "_printString", [])]);
+    for (var i in self['@jsObject']) {
+        variables._at_put_(i, self['@jsObject'][i]);
+    }
+    smalltalk.send(anInspector, "_setVariables_", [variables]);
     return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-unescape('_or_'),
+unescape('_jsObject'),
 smalltalk.method({
-selector: unescape('or%3A'),
-fn: function (aBlock) {
+selector: unescape('jsObject'),
+fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "__eq", [true]), "_ifTrue_ifFalse_", [function () {return true;}, aBlock]);
+    return self['@jsObject'];
     return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-unescape('_not'),
+unescape('_jsObject_'),
 smalltalk.method({
-selector: unescape('not'),
-fn: function () {
+selector: unescape('jsObject%3A'),
+fn: function (aJSObject) {
     var self = this;
-    return smalltalk.send(self, "__eq", [false]);
+    self['@jsObject'] = aJSObject;
     return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
 unescape('_printString'),
@@ -1983,1441 +1935,1499 @@ smalltalk.method({
 selector: unescape('printString'),
 fn: function () {
     var self = this;
-    return self.toString();
+    return smalltalk.send(smalltalk.send(self, "_jsObject", []), "_toString", []);
     return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.JSObjectProxy);
+
 
 smalltalk.addMethod(
-unescape('_%26'),
+unescape('_on_'),
 smalltalk.method({
-selector: unescape('%26'),
-fn: function (aBoolean) {
+selector: unescape('on%3A'),
+fn: function (aJSObject) {
     var self = this;
-    if (self == true) {
-        return aBoolean;
-    } else {
-        return false;
-    }
+    return function ($rec) {smalltalk.send($rec, "_jsObject_", [aJSObject]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
     return self;
 }
 }),
-smalltalk.Boolean);
+smalltalk.JSObjectProxy.klass);
 
+
+smalltalk.addClass('Number', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_%7C'),
+unescape('__star'),
 smalltalk.method({
-selector: unescape('%7C'),
-fn: function (aBoolean) {
+selector: unescape('*'),
+fn: function (aNumber) {
     var self = this;
-    if (self == true) {
-        return true;
-    } else {
-        return aBoolean;
-    }
+    return self * aNumber;
     return self;
 }
 }),
-smalltalk.Boolean);
-
-smalltalk.addMethod(
-unescape('_asJSON'),
-smalltalk.method({
-selector: unescape('asJSON'),
-fn: function (){
-var self=this;
-return self;
-return self;}
-}),
-smalltalk.Boolean);
-
-
+smalltalk.Number);
 
-smalltalk.addClass('Date', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_year'),
+unescape('__plus'),
 smalltalk.method({
-selector: unescape('year'),
-fn: function () {
+selector: unescape('+'),
+fn: function (aNumber) {
     var self = this;
-    return self.getFullYear();
+    return self + aNumber;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_month'),
+unescape('__minus'),
 smalltalk.method({
-selector: unescape('month'),
-fn: function () {
+selector: unescape('-'),
+fn: function (aNumber) {
     var self = this;
-    return self.getMonth() + 1;
+    return self - aNumber;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_month_'),
+unescape('__slash'),
 smalltalk.method({
-selector: unescape('month%3A'),
+selector: unescape('/'),
 fn: function (aNumber) {
     var self = this;
-    self.setMonth(aNumber - 1);
+    return self / aNumber;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_day'),
+unescape('__lt'),
 smalltalk.method({
-selector: unescape('day'),
-fn: function () {
+selector: unescape('%3C'),
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(self, "_dayOfWeek", []);
+    return self < aNumber;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_dayOfWeek'),
+unescape('__lt_eq'),
 smalltalk.method({
-selector: unescape('dayOfWeek'),
-fn: function () {
+selector: unescape('%3C%3D'),
+fn: function (aNumber) {
     var self = this;
-    return self.getDay() + 1;
+    return self <= aNumber;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_dayOfWeek_'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('dayOfWeek%3A'),
+selector: unescape('%3D'),
 fn: function (aNumber) {
     var self = this;
-    return self.setDay(aNumber - 1);
-    return self;
+    try {
+        ($receiver = smalltalk.send(aNumber, "_isNumber", [])).klass === smalltalk.Boolean ? !$receiver ? function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}]);
+        return Number(self) == aNumber;
+        return self;
+    } catch (e) {
+        if (e.name === "stReturn" && e.selector === "__eq") {
+            return e.fn();
+        }
+        throw e;
+    }
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_day_'),
+unescape('__gt'),
 smalltalk.method({
-selector: unescape('day%3A'),
+selector: unescape('%3E'),
 fn: function (aNumber) {
     var self = this;
-    smalltalk.send(self, "_day_", [aNumber]);
+    return self > aNumber;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_year_'),
+unescape('__gt_eq'),
 smalltalk.method({
-selector: unescape('year%3A'),
+selector: unescape('%3E%3D'),
 fn: function (aNumber) {
     var self = this;
-    self.setFullYear(aNumber);
+    return self >= aNumber;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_dayOfMonth'),
+unescape('__at'),
 smalltalk.method({
-selector: unescape('dayOfMonth'),
-fn: function () {
+selector: unescape('@'),
+fn: function (aNumber) {
     var self = this;
-    return self.getDate();
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [self, aNumber]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_dayOfMonth_'),
+unescape('_%5C%5C'),
 smalltalk.method({
-selector: unescape('dayOfMonth%3A'),
+selector: unescape('%5C%5C'),
 fn: function (aNumber) {
     var self = this;
-    self.setDate(aNumber);
+    return self % aNumber;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('asString'),
-fn: function () {
-    var self = this;
-    return self.toString();
-    return self;
-}
+selector: unescape('asJSON'),
+fn: function (){
+var self=this;
+return self;
+return self;}
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_asJavascript'),
 smalltalk.method({
-selector: unescape('printString'),
+selector: unescape('asJavascript'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_asString", []);
+    return smalltalk.send(smalltalk.send(unescape("%28"), "__comma", [smalltalk.send(self, "_printString", [])]), "__comma", [unescape("%29")]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asMilliseconds'),
+unescape('_asPoint'),
 smalltalk.method({
-selector: unescape('asMilliseconds'),
+selector: unescape('asPoint'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_time", []);
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [self, self]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_time'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('time'),
+selector: unescape('asString'),
 fn: function () {
     var self = this;
-    return self.getTime();
+    return smalltalk.send(self, "_printString", []);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_time_'),
+unescape('_atRandom'),
 smalltalk.method({
-selector: unescape('time%3A'),
-fn: function (aNumber) {
+selector: unescape('atRandom'),
+fn: function () {
     var self = this;
-    self.setTime(aNumber);
+    return ($receiver = smalltalk.send(($receiver = smalltalk.send(smalltalk.send(smalltalk.Random || Random, "_new", []), "_next", [])).klass === smalltalk.Number ? $receiver * self : smalltalk.send($receiver, "__star", [self]), "_truncated", [])).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asDateString'),
+unescape('_clearInterval'),
 smalltalk.method({
-selector: unescape('asDateString'),
+selector: unescape('clearInterval'),
 fn: function () {
     var self = this;
-    return self.toDateString();
+    clearInterval(Number(self));
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asTimeString'),
+unescape('_clearTimeout'),
 smalltalk.method({
-selector: unescape('asTimeString'),
+selector: unescape('clearTimeout'),
 fn: function () {
     var self = this;
-    return self.toTimeString();
+    clearTimeout(Number(self));
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asLocaleString'),
+unescape('_copy'),
 smalltalk.method({
-selector: unescape('asLocaleString'),
+selector: unescape('copy'),
 fn: function () {
     var self = this;
-    return self.toLocaleString();
+    return self;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asNumber'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('asNumber'),
+selector: unescape('deepCopy'),
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_asMilliseconds", []);
+    return smalltalk.send(self, "_copy", []);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_hours_'),
+unescape('_even'),
 smalltalk.method({
-selector: unescape('hours%3A'),
-fn: function (aNumber) {
+selector: unescape('even'),
+fn: function () {
     var self = this;
-    self.setHours(aNumber);
+    return smalltalk.send(0, "__eq", [smalltalk.send(self, "_\\\\", [2])]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_minutes_'),
+unescape('_identityHash'),
 smalltalk.method({
-selector: unescape('minutes%3A'),
-fn: function (aNumber) {
+selector: unescape('identityHash'),
+fn: function () {
     var self = this;
-    self.setMinutes(aNumber);
+    return smalltalk.send(smalltalk.send(self, "_asString", []), "__comma", ["n"]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_seconds_'),
+unescape('_isNumber'),
 smalltalk.method({
-selector: unescape('seconds%3A'),
-fn: function (aNumber) {
+selector: unescape('isNumber'),
+fn: function () {
     var self = this;
-    self.setSeconds(aNumber);
+    return true;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_milliseconds_'),
+unescape('_isZero'),
 smalltalk.method({
-selector: unescape('milliseconds%3A'),
-fn: function (aNumber) {
+selector: unescape('isZero'),
+fn: function () {
     var self = this;
-    self.setMilliseconds(aNumber);
+    return smalltalk.send(self, "__eq", [0]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_hours'),
+unescape('_max_'),
 smalltalk.method({
-selector: unescape('hours'),
-fn: function () {
+selector: unescape('max%3A'),
+fn: function (aNumber) {
     var self = this;
-    return self.getHours();
+    return Math.max(self, aNumber);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_minutes'),
+unescape('_min_'),
 smalltalk.method({
-selector: unescape('minutes'),
-fn: function () {
+selector: unescape('min%3A'),
+fn: function (aNumber) {
     var self = this;
-    return self.getMinutes();
+    return Math.min(self, aNumber);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_seconds'),
+unescape('_negated'),
 smalltalk.method({
-selector: unescape('seconds'),
+selector: unescape('negated'),
 fn: function () {
     var self = this;
-    return self.getSeconds();
+    return 0 - self;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_milliseconds'),
+unescape('_negative'),
 smalltalk.method({
-selector: unescape('milliseconds'),
+selector: unescape('negative'),
 fn: function () {
     var self = this;
-    return self.getMilliseconds();
+    return self < 0;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('__lt'),
+unescape('_odd'),
 smalltalk.method({
-selector: unescape('%3C'),
-fn: function (aDate) {
+selector: unescape('odd'),
+fn: function () {
     var self = this;
-    return self < aDate;
+    return smalltalk.send(smalltalk.send(self, "_even", []), "_not", []);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('__gt'),
+unescape('_positive'),
 smalltalk.method({
-selector: unescape('%3E'),
-fn: function (aDate) {
+selector: unescape('positive'),
+fn: function () {
     var self = this;
-    return self > aDate;
+    return self >= 0;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('__lt_eq'),
+unescape('_printShowingDecimalPlaces_'),
 smalltalk.method({
-selector: unescape('%3C%3D'),
-fn: function (aDate) {
+selector: unescape('printShowingDecimalPlaces%3A'),
+fn: function (placesDesired) {
     var self = this;
-    return self <= aDate;
+    return self.toFixed(placesDesired);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('__gt_eq'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('%3E%3D'),
-fn: function (aDate) {
+selector: unescape('printString'),
+fn: function () {
     var self = this;
-    return self >= aDate;
+    return String(self);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('__minus'),
+unescape('_rounded'),
 smalltalk.method({
-selector: unescape('-'),
-fn: function (aDate) {
+selector: unescape('rounded'),
+fn: function () {
     var self = this;
-    return self - aDate;
+    return Math.round(self);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('__plus'),
+unescape('_sqrt'),
 smalltalk.method({
-selector: unescape('+'),
-fn: function (aDate) {
+selector: unescape('sqrt'),
+fn: function () {
     var self = this;
-    return self + aDate;
+    return Math.sqrt(self);
     return self;
 }
 }),
-smalltalk.Date);
-
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_new_'),
+unescape('_squared'),
 smalltalk.method({
-selector: unescape('new%3A'),
-fn: function (anObject) {
+selector: unescape('squared'),
+fn: function () {
     var self = this;
-    return new Date(anObject);
+    return self * self;
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_fromString_'),
+unescape('_timesRepeat_'),
 smalltalk.method({
-selector: unescape('fromString%3A'),
-fn: function (aString) {
+selector: unescape('timesRepeat%3A'),
+fn: function (aBlock) {
     var self = this;
-    return smalltalk.send(self, "_new_", [aString]);
+    var integer = nil;
+    var count = nil;
+    integer = smalltalk.send(self, "_truncated", []);
+    count = 1;
+    (function () {while (!function () {return ($receiver = count).klass === smalltalk.Number ? $receiver > self : smalltalk.send($receiver, "__gt", [self]);}()) {(function () {smalltalk.send(aBlock, "_value", []);return count = ($receiver = count).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}());}}());
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_fromSeconds_'),
+unescape('_to_'),
 smalltalk.method({
-selector: unescape('fromSeconds%3A'),
+selector: unescape('to%3A'),
 fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(self, "_fromMilliseconds_", [($receiver = aNumber).klass === smalltalk.Number ? $receiver * 1000 : smalltalk.send($receiver, "__star", [1000])]);
+    var array = nil;
+    var first = nil;
+    var last = nil;
+    var count = nil;
+    first = smalltalk.send(self, "_truncated", []);
+    last = ($receiver = smalltalk.send(aNumber, "_truncated", [])).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);
+    count = 1;
+    array = smalltalk.send(smalltalk.Array || Array, "_new", []);
+    smalltalk.send(($receiver = last).klass === smalltalk.Number ? $receiver - first : smalltalk.send($receiver, "__minus", [first]), "_timesRepeat_", [function () {smalltalk.send(array, "_at_put_", [count, first]);count = ($receiver = count).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return first = ($receiver = first).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}]);
+    return array;
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_fromMilliseconds_'),
+unescape('_to_by_'),
 smalltalk.method({
-selector: unescape('fromMilliseconds%3A'),
-fn: function (aNumber) {
+selector: unescape('to%3Aby%3A'),
+fn: function (stop, step) {
     var self = this;
-    return smalltalk.send(self, "_new_", [aNumber]);
+    var array = nil;
+    var value = nil;
+    var pos = nil;
+    value = self;
+    array = smalltalk.send(smalltalk.Array || Array, "_new", []);
+    pos = 1;
+    ($receiver = smalltalk.send(step, "__eq", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}]);
+    ($receiver = ($receiver = step).klass === smalltalk.Number ? $receiver < 0 : smalltalk.send($receiver, "__lt", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}, function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}]);
+    return array;
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_today'),
+unescape('_to_by_do_'),
 smalltalk.method({
-selector: unescape('today'),
-fn: function () {
+selector: unescape('to%3Aby%3Ado%3A'),
+fn: function (stop, step, aBlock) {
     var self = this;
-    return smalltalk.send(self, "_new", []);
+    var value = nil;
+    value = self;
+    ($receiver = smalltalk.send(step, "__eq", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}]);
+    ($receiver = ($receiver = step).klass === smalltalk.Number ? $receiver < 0 : smalltalk.send($receiver, "__lt", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}, function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}]);
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_now'),
+unescape('_to_do_'),
 smalltalk.method({
-selector: unescape('now'),
-fn: function () {
+selector: unescape('to%3Ado%3A'),
+fn: function (stop, aBlock) {
     var self = this;
-    return smalltalk.send(self, "_today", []);
+    var nextValue = nil;
+    nextValue = self;
+    (function () {while (function () {return ($receiver = nextValue).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [nextValue]);return nextValue = ($receiver = nextValue).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}());}}());
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_millisecondsToRun_'),
+unescape('_truncated'),
 smalltalk.method({
-selector: unescape('millisecondsToRun%3A'),
-fn: function (aBlock) {
+selector: unescape('truncated'),
+fn: function () {
     var self = this;
-    var t = nil;
-    t = smalltalk.send(smalltalk.Date || Date, "_now", []);
-    smalltalk.send(aBlock, "_value", []);
-    return ($receiver = smalltalk.send(smalltalk.Date || Date, "_now", [])).klass === smalltalk.Number ? $receiver - t : smalltalk.send($receiver, "__minus", [t]);
+    var result = nil;
+    ($receiver = self >= 0).klass === smalltalk.Boolean ? $receiver ? function () {return result = Math.floor(self);}() : function () {return result = Math.floor(self * -1) * -1;}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return result = Math.floor(self);}, function () {return result = Math.floor(self * -1) * -1;}]);
+    return result;
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Number);
 
 
-smalltalk.addClass('UndefinedObject', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_'),
+unescape('_pi'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3A'),
-fn: function (aString, anotherString) {
+selector: unescape('pi'),
+fn: function () {
     var self = this;
-    return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, anotherString, nil]);
+    return Math.PI;
     return self;
 }
 }),
-smalltalk.UndefinedObject);
+smalltalk.Number.klass);
 
+
+smalltalk.addClass('Package', smalltalk.Object, ['commitPathJs', 'commitPathSt'], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_category_'),
+unescape('_classes'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3Acategory%3A'),
-fn: function (aString, aString2, aString3) {
+selector: unescape('classes'),
+fn: function () {
     var self = this;
-    smalltalk.send(self, "_deprecatedAPI", []);
-    return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
+    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_classes", []), "_select_", [function (c) {return smalltalk.send(smalltalk.send(c, "_package", []), "__eq_eq", [self]);}]);
     return self;
 }
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_commitPathJs'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
+selector: unescape('commitPathJs'),
 fn: function () {
     var self = this;
-    return self;
+    return ($receiver = self['@commitPathJs']) == nil ||
+        $receiver == undefined ? function () {return smalltalk.send(smalltalk.send(self, "_class", []), "_defaultCommitPathJs", []);}() : $receiver;
     return self;
 }
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_commitPathJs_'),
 smalltalk.method({
-selector: unescape('deepCopy'),
-fn: function () {
+selector: unescape('commitPathJs%3A'),
+fn: function (aString) {
     var self = this;
-    return self;
+    self['@commitPathJs'] = aString;
     return self;
 }
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_ifNil_'),
+unescape('_commitPathSt'),
 smalltalk.method({
-selector: unescape('ifNil%3A'),
-fn: function (aBlock) {
+selector: unescape('commitPathSt'),
+fn: function () {
     var self = this;
-    return smalltalk.send(self, "_ifNil_ifNotNil_", [aBlock, function () {return nil;}]);
+    return ($receiver = self['@commitPathSt']) == nil ||
+        $receiver == undefined ? function () {return smalltalk.send(smalltalk.send(self, "_class", []), "_defaultCommitPathSt", []);}() : $receiver;
     return self;
 }
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_ifNotNil_'),
+unescape('_commitPathSt_'),
 smalltalk.method({
-selector: unescape('ifNotNil%3A'),
-fn: function (aBlock) {
+selector: unescape('commitPathSt%3A'),
+fn: function (aString) {
     var self = this;
-    return self;
+    self['@commitPathSt'] = aString;
     return self;
 }
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_ifNil_ifNotNil_'),
+unescape('_dependencies'),
 smalltalk.method({
-selector: unescape('ifNil%3AifNotNil%3A'),
-fn: function (aBlock, anotherBlock) {
+selector: unescape('dependencies'),
+fn: function () {
     var self = this;
-    return smalltalk.send(aBlock, "_value", []);
+    return smalltalk.send(self, "_propertyAt_ifAbsent_", ["dependencies", function () {return [];}]);
     return self;
 }
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_ifNotNil_ifNil_'),
+unescape('_dependencies_'),
 smalltalk.method({
-selector: unescape('ifNotNil%3AifNil%3A'),
-fn: function (aBlock, anotherBlock) {
+selector: unescape('dependencies%3A'),
+fn: function (anArray) {
     var self = this;
-    return smalltalk.send(anotherBlock, "_value", []);
+    return smalltalk.send(self, "_propertyAt_put_", ["dependencies", anArray]);
     return self;
 }
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_isNil'),
+unescape('_jsProperties'),
 smalltalk.method({
-selector: unescape('isNil'),
+selector: unescape('jsProperties'),
 fn: function () {
     var self = this;
-    return true;
+    return self.properties;
     return self;
 }
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_notNil'),
+unescape('_jsProperties_'),
 smalltalk.method({
-selector: unescape('notNil'),
-fn: function () {
+selector: unescape('jsProperties%3A'),
+fn: function (aJSObject) {
     var self = this;
-    return false;
+    return self.properties = aJSObject;
     return self;
 }
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_name'),
 smalltalk.method({
-selector: unescape('printString'),
+selector: unescape('name'),
 fn: function () {
     var self = this;
-    return "nil";
+    return self.pkgName;
     return self;
 }
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_package_'),
+unescape('_name_'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3Apackage%3A'),
-fn: function (aString, aString2, aString3) {
+selector: unescape('name%3A'),
+fn: function (aString) {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.ClassBuilder || ClassBuilder, "_new", []), "_superclass_subclass_instanceVariableNames_package_", [self, aString, aString2, aString3]);
+    self.pkgName = aString;
     return self;
 }
 }),
-smalltalk.UndefinedObject);
-
-smalltalk.addMethod(
-unescape('_asJSON'),
-smalltalk.method({
-selector: unescape('asJSON'),
-fn: function (){
-var self=this;
-return (typeof null == 'undefined' ? nil : null);
-return self;}
-}),
-smalltalk.UndefinedObject);
-
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_new'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('new'),
+selector: unescape('printString'),
 fn: function () {
     var self = this;
-    smalltalk.send(self, "_error_", ["You cannot create new instances of UndefinedObject. Use nil"]);
+    return smalltalk.send(self, "_name", []);
     return self;
 }
 }),
-smalltalk.UndefinedObject.klass);
-
+smalltalk.Package);
 
-smalltalk.addClass('Date', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_year'),
+unescape('_properties'),
 smalltalk.method({
-selector: unescape('year'),
+selector: unescape('properties'),
 fn: function () {
     var self = this;
-    return self.getFullYear();
+    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_readJSObject_", [smalltalk.send(self, "_basicAt_", ["properties"])]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_month'),
+unescape('_properties_'),
 smalltalk.method({
-selector: unescape('month'),
-fn: function () {
+selector: unescape('properties%3A'),
+fn: function (aDict) {
     var self = this;
-    return self.getMonth() + 1;
+    var object = nil;
+    object = {};
+    smalltalk.send(aDict, "_keysAndValuesDo_", [function (key, value) {return object[key] = value;}]);
+    return self.properties = object;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_month_'),
+unescape('_propertiesAsJSON'),
 smalltalk.method({
-selector: unescape('month%3A'),
-fn: function (aNumber) {
+selector: unescape('propertiesAsJSON'),
+fn: function () {
     var self = this;
-    self.setMonth(aNumber - 1);
+    return JSON.stringify(self.properties);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_day'),
+unescape('_propertyAt_'),
 smalltalk.method({
-selector: unescape('day'),
-fn: function () {
+selector: unescape('propertyAt%3A'),
+fn: function (key) {
     var self = this;
-    return smalltalk.send(self, "_dayOfWeek", []);
+    return self.properties[key];
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_dayOfWeek'),
+unescape('_propertyAt_ifAbsent_'),
 smalltalk.method({
-selector: unescape('dayOfWeek'),
-fn: function () {
+selector: unescape('propertyAt%3AifAbsent%3A'),
+fn: function (key, block) {
     var self = this;
-    return self.getDay() + 1;
+    return ($receiver = smalltalk.send(self, "_propertyAt_", [key])) == nil ||
+        $receiver == undefined ? function () {return smalltalk.send(block, "_value", []);}() : $receiver;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_dayOfWeek_'),
+unescape('_propertyAt_put_'),
 smalltalk.method({
-selector: unescape('dayOfWeek%3A'),
-fn: function (aNumber) {
+selector: unescape('propertyAt%3Aput%3A'),
+fn: function (key, value) {
     var self = this;
-    return self.setDay(aNumber - 1);
+    return self.properties[key] = value;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_day_'),
+unescape('_sortedClasses'),
 smalltalk.method({
-selector: unescape('day%3A'),
-fn: function (aNumber) {
-    var self = this;
-    smalltalk.send(self, "_day_", [aNumber]);
-    return self;
-}
+selector: unescape('sortedClasses'),
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_class", []), "_sortedClasses_", [smalltalk.send(self, "_classes", [])]);
+return self;}
 }),
-smalltalk.Date);
+smalltalk.Package);
+
 
+smalltalk.Package.klass.iVarNames = ['defaultCommitPathJs','defaultCommitPathSt'];
 smalltalk.addMethod(
-unescape('_year_'),
+unescape('_commitToLocalStorage_'),
 smalltalk.method({
-selector: unescape('year%3A'),
-fn: function (aNumber) {
+selector: unescape('commitToLocalStorage%3A'),
+fn: function (aPackageName) {
     var self = this;
-    self.setFullYear(aNumber);
+    var key = nil;
+    var sourceCode = nil;
+    key = smalltalk.send("smalltalk.packages.", "__comma", [aPackageName]);
+    sourceCode = smalltalk.send(smalltalk.send(smalltalk.Exporter || Exporter, "_new", []), "_exportPackage_", [aPackageName]);
+    localStorage[key] = escape(sourceCode);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_dayOfMonth'),
+unescape('_defaultCommitPathJs'),
 smalltalk.method({
-selector: unescape('dayOfMonth'),
+selector: unescape('defaultCommitPathJs'),
 fn: function () {
     var self = this;
-    return self.getDate();
+    return ($receiver = self['@defaultCommitPathJs']) == nil ||
+        $receiver == undefined ? function () {return self['@defaultCommitPathJs'] = "js";}() : $receiver;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_dayOfMonth_'),
+unescape('_defaultCommitPathJs_'),
 smalltalk.method({
-selector: unescape('dayOfMonth%3A'),
-fn: function (aNumber) {
+selector: unescape('defaultCommitPathJs%3A'),
+fn: function (aString) {
     var self = this;
-    self.setDate(aNumber);
+    self['@defaultCommitPathJs'] = aString;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_defaultCommitPathSt'),
 smalltalk.method({
-selector: unescape('asString'),
+selector: unescape('defaultCommitPathSt'),
 fn: function () {
     var self = this;
-    return self.toString();
+    return ($receiver = self['@defaultCommitPathSt']) == nil ||
+        $receiver == undefined ? function () {return self['@defaultCommitPathSt'] = "st";}() : $receiver;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_defaultCommitPathSt_'),
 smalltalk.method({
-selector: unescape('printString'),
-fn: function () {
+selector: unescape('defaultCommitPathSt%3A'),
+fn: function (aString) {
     var self = this;
-    return smalltalk.send(self, "_asString", []);
+    self['@defaultCommitPathSt'] = aString;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_asMilliseconds'),
+unescape('_fetch_'),
 smalltalk.method({
-selector: unescape('asMilliseconds'),
-fn: function () {
+selector: unescape('fetch%3A'),
+fn: function (aPackageName) {
     var self = this;
-    return smalltalk.send(self, "_time", []);
+    smalltalk.send(self, "_fetch_prefix_", [aPackageName, smalltalk.send(smalltalk.send(self, "_defaultCommitPathJs", []), "__comma", [unescape("/")])]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_time'),
+unescape('_fetch_prefix_'),
 smalltalk.method({
-selector: unescape('time'),
-fn: function () {
+selector: unescape('fetch%3Aprefix%3A'),
+fn: function (aPackageName, aPrefix) {
     var self = this;
-    return self.getTime();
+    smalltalk.send(typeof jQuery == "undefined" ? nil : jQuery, "_getScript_onSuccess_", [smalltalk.send(smalltalk.send(aPrefix, "__comma", [aPackageName]), "__comma", [".js"]), function () {return smalltalk.send(smalltalk.Package || Package, "_init_", [aPackageName]);}]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_time_'),
+unescape('_init_'),
 smalltalk.method({
-selector: unescape('time%3A'),
-fn: function (aNumber) {
+selector: unescape('init%3A'),
+fn: function (aPackageName) {
     var self = this;
-    self.setTime(aNumber);
+    (function ($rec) {smalltalk.send($rec, "_do_", [function (each) {return smalltalk.init(each);}]);return smalltalk.send($rec, "_do_", [function (each) {return smalltalk.send(each, "_initialize", []);}]);}(smalltalk.send(smalltalk.send(typeof smalltalk == "undefined" ? nil : smalltalk, "_classes", []), "_select_", [function (each) {return each.pkg.pkgName == aPackageName;}])));
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_asDateString'),
+unescape('_named_'),
 smalltalk.method({
-selector: unescape('asDateString'),
-fn: function () {
+selector: unescape('named%3A'),
+fn: function (aPackageName) {
     var self = this;
-    return self.toDateString();
+    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_packageAt_", [aPackageName]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_asTimeString'),
+unescape('_named_ifAbsent_'),
 smalltalk.method({
-selector: unescape('asTimeString'),
-fn: function () {
+selector: unescape('named%3AifAbsent%3A'),
+fn: function (aPackageName, aBlock) {
     var self = this;
-    return self.toTimeString();
+    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_packageAt_ifAbsent_", [aPackageName, aBlock]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_asLocaleString'),
+unescape('_resetCommitPaths'),
 smalltalk.method({
-selector: unescape('asLocaleString'),
+selector: unescape('resetCommitPaths'),
 fn: function () {
     var self = this;
-    return self.toLocaleString();
+    self['@defaultCommitPathJs'] = nil;
+    self['@defaultCommitPathSt'] = nil;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_asNumber'),
+unescape('_sortedClasses_'),
 smalltalk.method({
-selector: unescape('asNumber'),
-fn: function () {
-    var self = this;
-    return smalltalk.send(self, "_asMilliseconds", []);
-    return self;
-}
+selector: unescape('sortedClasses%3A'),
+fn: function (classes){
+var self=this;
+var children=nil;
+var others=nil;
+var nodes=nil;
+var expandedClasses=nil;
+(children=[]);
+(others=[]);
+smalltalk.send(classes, "_do_", [(function(each){return ((($receiver = smalltalk.send(classes, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
+(nodes=smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassSorterNode || ClassSorterNode), "_on_classes_level_", [each, others, (0)]);})]));
+(nodes=smalltalk.send(nodes, "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(smalltalk.send(a, "_theClass", []), "_name", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", [])]));})]));
+(expandedClasses=smalltalk.send((smalltalk.Array || Array), "_new", []));
+smalltalk.send(nodes, "_do_", [(function(aNode){return smalltalk.send(aNode, "_traverseClassesWith_", [expandedClasses]);})]);
+return expandedClasses;
+return self;}
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
+
 
+smalltalk.addClass('Point', smalltalk.Object, ['x', 'y'], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_hours_'),
+unescape('__star'),
 smalltalk.method({
-selector: unescape('hours%3A'),
-fn: function (aNumber) {
+selector: unescape('*'),
+fn: function (aPoint) {
     var self = this;
-    self.setHours(aNumber);
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver * smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__star", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver * smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__star", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_minutes_'),
+unescape('__plus'),
 smalltalk.method({
-selector: unescape('minutes%3A'),
-fn: function (aNumber) {
+selector: unescape('+'),
+fn: function (aPoint) {
     var self = this;
-    self.setMinutes(aNumber);
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver + smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver + smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_seconds_'),
+unescape('__minus'),
 smalltalk.method({
-selector: unescape('seconds%3A'),
-fn: function (aNumber) {
+selector: unescape('-'),
+fn: function (aPoint) {
     var self = this;
-    self.setSeconds(aNumber);
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver - smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver - smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_milliseconds_'),
+unescape('__slash'),
 smalltalk.method({
-selector: unescape('milliseconds%3A'),
-fn: function (aNumber) {
+selector: unescape('/'),
+fn: function (aPoint) {
     var self = this;
-    self.setMilliseconds(aNumber);
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver / smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver / smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_hours'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('hours'),
-fn: function () {
+selector: unescape('%3D'),
+fn: function (aPoint) {
     var self = this;
-    return self.getHours();
+    return smalltalk.send(smalltalk.send(smalltalk.send(aPoint, "_class", []), "__eq", [smalltalk.send(self, "_class", [])]), "_and_", [function () {return smalltalk.send(smalltalk.send(smalltalk.send(aPoint, "_x", []), "__eq", [smalltalk.send(self, "_x", [])]), "_&", [smalltalk.send(smalltalk.send(aPoint, "_y", []), "__eq", [smalltalk.send(self, "_y", [])])]);}]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_minutes'),
+unescape('_asPoint'),
 smalltalk.method({
-selector: unescape('minutes'),
+selector: unescape('asPoint'),
 fn: function () {
     var self = this;
-    return self.getMinutes();
+    return self;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_seconds'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('seconds'),
+selector: unescape('printString'),
 fn: function () {
     var self = this;
-    return self.getSeconds();
+    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (stream) {smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@x'], "_printString", []), "__comma", [unescape("@")])]);($receiver = smalltalk.send(smalltalk.send(self['@y'], "_notNil", []), "_and_", [function () {return smalltalk.send(self['@y'], "_negative", []);}])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(stream, "_space", []);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(stream, "_space", []);}]);return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self['@y'], "_printString", [])]);}]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_milliseconds'),
+unescape('_translateBy_'),
 smalltalk.method({
-selector: unescape('milliseconds'),
+selector: unescape('translateBy%3A'),
+fn: function (delta){
+var self=this;
+return smalltalk.send(((($receiver = smalltalk.send(delta, "_x", [])).klass === smalltalk.Number) ? $receiver +self['@x'] : smalltalk.send($receiver, "__plus", [self['@x']])), "__at", [((($receiver = smalltalk.send(delta, "_y", [])).klass === smalltalk.Number) ? $receiver +self['@y'] : smalltalk.send($receiver, "__plus", [self['@y']]))]);
+return self;}
+}),
+smalltalk.Point);
+
+smalltalk.addMethod(
+unescape('_x'),
+smalltalk.method({
+selector: unescape('x'),
 fn: function () {
     var self = this;
-    return self.getMilliseconds();
+    return self['@x'];
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('__lt'),
+unescape('_x_'),
 smalltalk.method({
-selector: unescape('%3C'),
-fn: function (aDate) {
+selector: unescape('x%3A'),
+fn: function (aNumber) {
     var self = this;
-    return self < aDate;
+    self['@x'] = aNumber;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('__gt'),
+unescape('_y'),
 smalltalk.method({
-selector: unescape('%3E'),
-fn: function (aDate) {
+selector: unescape('y'),
+fn: function () {
     var self = this;
-    return self > aDate;
+    return self['@y'];
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('__lt_eq'),
+unescape('_y_'),
 smalltalk.method({
-selector: unescape('%3C%3D'),
-fn: function (aDate) {
+selector: unescape('y%3A'),
+fn: function (aNumber) {
     var self = this;
-    return self <= aDate;
+    self['@y'] = aNumber;
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point);
+
 
 smalltalk.addMethod(
-unescape('__gt_eq'),
+unescape('_x_y_'),
 smalltalk.method({
-selector: unescape('%3E%3D'),
-fn: function (aDate) {
+selector: unescape('x%3Ay%3A'),
+fn: function (aNumber, anotherNumber) {
     var self = this;
-    return self >= aDate;
+    return function ($rec) {smalltalk.send($rec, "_x_", [aNumber]);smalltalk.send($rec, "_y_", [anotherNumber]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Point.klass);
+
 
+smalltalk.addClass('Random', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('__minus'),
+unescape('_next'),
 smalltalk.method({
-selector: unescape('-'),
-fn: function (aDate) {
+selector: unescape('next'),
+fn: function () {
     var self = this;
-    return self - aDate;
+    return Math.random();
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Random);
 
 smalltalk.addMethod(
-unescape('__plus'),
+unescape('_next_'),
 smalltalk.method({
-selector: unescape('+'),
-fn: function (aDate) {
+selector: unescape('next%3A'),
+fn: function (anInteger) {
     var self = this;
-    return self + aDate;
+    return smalltalk.send(smalltalk.send(1, "_to_", [anInteger]), "_collect_", [function (each) {return smalltalk.send(self, "_next", []);}]);
     return self;
 }
 }),
-smalltalk.Date);
+smalltalk.Random);
+
 
 
+smalltalk.addClass('Smalltalk', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_new_'),
+unescape('_at_'),
 smalltalk.method({
-selector: unescape('new%3A'),
-fn: function (anObject) {
+selector: unescape('at%3A'),
+fn: function (aString) {
     var self = this;
-    return new Date(anObject);
+    return self[aString];
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_fromString_'),
+unescape('_basicParse_'),
 smalltalk.method({
-selector: unescape('fromString%3A'),
+selector: unescape('basicParse%3A'),
 fn: function (aString) {
     var self = this;
-    return smalltalk.send(self, "_new_", [aString]);
+    return smalltalk.parser.parse(aString);
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_fromSeconds_'),
+unescape('_classes'),
 smalltalk.method({
-selector: unescape('fromSeconds%3A'),
-fn: function (aNumber) {
+selector: unescape('classes'),
+fn: function () {
     var self = this;
-    return smalltalk.send(self, "_fromMilliseconds_", [($receiver = aNumber).klass === smalltalk.Number ? $receiver * 1000 : smalltalk.send($receiver, "__star", [1000])]);
+    return self.classes();
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_fromMilliseconds_'),
+unescape('_createPackage_'),
 smalltalk.method({
-selector: unescape('fromMilliseconds%3A'),
-fn: function (aNumber) {
+selector: unescape('createPackage%3A'),
+fn: function (packageName) {
     var self = this;
-    return smalltalk.send(self, "_new_", [aNumber]);
+    return smalltalk.addPackage(packageName, nil);
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_today'),
+unescape('_createPackage_properties_'),
 smalltalk.method({
-selector: unescape('today'),
-fn: function () {
+selector: unescape('createPackage%3Aproperties%3A'),
+fn: function (packageName, aDict) {
     var self = this;
-    return smalltalk.send(self, "_new", []);
+    var object = nil;
+    object = {};
+    smalltalk.send(aDict, "_keysAndValuesDo_", [function (key, value) {return object[key] = value;}]);
+    return smalltalk.addPackage(packageName, object);
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_now'),
+unescape('_deletePackage_'),
 smalltalk.method({
-selector: unescape('now'),
-fn: function () {
+selector: unescape('deletePackage%3A'),
+fn: function (packageName) {
     var self = this;
-    return smalltalk.send(self, "_today", []);
+    delete smalltalk.packages[packageName];
     return self;
 }
 }),
-smalltalk.Date.klass);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_millisecondsToRun_'),
+unescape('_packageAt_'),
 smalltalk.method({
-selector: unescape('millisecondsToRun%3A'),
-fn: function (aBlock) {
+selector: unescape('packageAt%3A'),
+fn: function (packageName) {
     var self = this;
-    var t = nil;
-    t = smalltalk.send(smalltalk.Date || Date, "_now", []);
-    smalltalk.send(aBlock, "_value", []);
-    return ($receiver = smalltalk.send(smalltalk.Date || Date, "_now", [])).klass === smalltalk.Number ? $receiver - t : smalltalk.send($receiver, "__minus", [t]);
+    return self.packages[packageName];
     return self;
 }
 }),
-smalltalk.Date.klass);
-
+smalltalk.Smalltalk);
 
-smalltalk.addClass('JSObjectProxy', smalltalk.Object, ['jsObject'], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_jsObject_'),
+unescape('_packageAt_ifAbsent_'),
 smalltalk.method({
-selector: unescape('jsObject%3A'),
-fn: function (aJSObject) {
+selector: unescape('packageAt%3AifAbsent%3A'),
+fn: function (packageName, aBlock) {
     var self = this;
-    self['@jsObject'] = aJSObject;
+    return smalltalk.send(smalltalk.send(self, "_packageAt_", [packageName]), "_ifNil_", [aBlock]);
     return self;
 }
 }),
-smalltalk.JSObjectProxy);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_jsObject'),
+unescape('_packages'),
 smalltalk.method({
-selector: unescape('jsObject'),
+selector: unescape('packages'),
 fn: function () {
     var self = this;
-    return self['@jsObject'];
+    return self.packages.all();
     return self;
 }
 }),
-smalltalk.JSObjectProxy);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_parse_'),
 smalltalk.method({
-selector: unescape('printString'),
-fn: function () {
+selector: unescape('parse%3A'),
+fn: function (aString) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_jsObject", []), "_toString", []);
+    var result = nil;
+    smalltalk.send(self, "_try_catch_", [function () {return result = smalltalk.send(self, "_basicParse_", [aString]);}, function (ex) {return smalltalk.send(smalltalk.send(self, "_parseError_parsing_", [ex, aString]), "_signal", []);}]);
+    return result;
     return self;
 }
 }),
-smalltalk.JSObjectProxy);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_inspectOn_'),
+unescape('_parseError_parsing_'),
 smalltalk.method({
-selector: unescape('inspectOn%3A'),
-fn: function (anInspector) {
+selector: unescape('parseError%3Aparsing%3A'),
+fn: function (anException, aString) {
     var self = this;
-    var variables = nil;
-    variables = smalltalk.send(smalltalk.Dictionary || Dictionary, "_new", []);
-    smalltalk.send(variables, "_at_put_", [unescape("%23self"), smalltalk.send(self, "_jsObject", [])]);
-    smalltalk.send(anInspector, "_setLabel_", [smalltalk.send(self, "_printString", [])]);
-    for (var i in self['@jsObject']) {
-        variables._at_put_(i, self['@jsObject'][i]);
-    }
-    smalltalk.send(anInspector, "_setVariables_", [variables]);
+    var row = nil;
+    var col = nil;
+    var message = nil;
+    var lines = nil;
+    var badLine = nil;
+    var code = nil;
+    row = anException.line;
+    col = anException.column;
+    message = anException.message;
+    lines = smalltalk.send(aString, "_lines", []);
+    badLine = smalltalk.send(lines, "_at_", [row]);
+    badLine = smalltalk.send(smalltalk.send(smalltalk.send(badLine, "_copyFrom_to_", [1, ($receiver = col).klass === smalltalk.Number ? $receiver - 1 : smalltalk.send($receiver, "__minus", [1])]), "__comma", [unescape("%20%3D%3D%3D%3E")]), "__comma", [smalltalk.send(badLine, "_copyFrom_to_", [col, smalltalk.send(badLine, "_size", [])])]);
+    smalltalk.send(lines, "_at_put_", [row, badLine]);
+    code = smalltalk.send(smalltalk.String || String, "_streamContents_", [function (s) {return smalltalk.send(lines, "_withIndexDo_", [function (l, i) {return smalltalk.send(s, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(i, "_asString", []), "__comma", [": "]), "__comma", [l]), "__comma", [smalltalk.send(smalltalk.String || String, "_lf", [])])]);}]);}]);
+    return smalltalk.send(smalltalk.send(smalltalk.Error || Error, "_new", []), "_messageText_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send("Parse error on line ", "__comma", [row]), "__comma", [" column "]), "__comma", [col]), "__comma", [" : "]), "__comma", [message]), "__comma", [unescape("%20Below%20is%20code%20with%20line%20numbers%20and%20%3D%3D%3D%3E%20marker%20inserted%3A")]), "__comma", [smalltalk.send(smalltalk.String || String, "_lf", [])]), "__comma", [code])]);
     return self;
 }
 }),
-smalltalk.JSObjectProxy);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_doesNotUnderstand_'),
+unescape('_readJSObject_'),
 smalltalk.method({
-selector: unescape('doesNotUnderstand%3A'),
-fn: function (aMessage) {
+selector: unescape('readJSObject%3A'),
+fn: function (anObject) {
     var self = this;
-    var obj = nil;
-    var selector = nil;
-    var jsSelector = nil;
-    var arguments = nil;
-    obj = smalltalk.send(self, "_jsObject", []);
-    selector = smalltalk.send(aMessage, "_selector", []);
-    jsSelector = smalltalk.send(selector, "_asJavaScriptSelector", []);
-    arguments = smalltalk.send(aMessage, "_arguments", []);
-    if (obj[jsSelector] != undefined) {
-        return smalltalk.send(obj, jsSelector, arguments);
-    }
-    smalltalk.send(self, "_doesNotUnderstand_", [aMessage], smalltalk.Object);
+    return self.readJSObject(anObject);
     return self;
 }
 }),
-smalltalk.JSObjectProxy);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_at_'),
+unescape('_removeClass_'),
 smalltalk.method({
-selector: unescape('at%3A'),
-fn: function (aSymbol) {
+selector: unescape('removeClass%3A'),
+fn: function (aClass) {
     var self = this;
-    var attr = nil;
-    attr = smalltalk.send(aSymbol, "_asString", []);
-    return self['@jsObject'][attr];
+    ($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_asString", []), "__comma", [unescape("%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21")])]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_asString", []), "__comma", [unescape("%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21")])]);}]);
+    smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_do_", [function (each) {return smalltalk.send(aClass, "_removeCompiledMethod_", [each]);}]);
+    smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_methodDictionary", []), "_values", []), "_do_", [function (each) {return smalltalk.send(smalltalk.send(aClass, "_class", []), "_removeCompiledMethod_", [each]);}]);
+    smalltalk.send(self, "_basicDelete_", [smalltalk.send(aClass, "_name", [])]);
     return self;
 }
 }),
-smalltalk.JSObjectProxy);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_removePackage_'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
-fn: function (aSymbol, anObject) {
+selector: unescape('removePackage%3A'),
+fn: function (packageName) {
     var self = this;
-    var attr = nil;
-    attr = smalltalk.send(aSymbol, "_asString", []);
-    self['@jsObject'][attr] = anObject;
+    var pkg = nil;
+    pkg = smalltalk.send(self, "_packageAt_ifAbsent_", [packageName, function () {return smalltalk.send(self, "_error_", [smalltalk.send("Missing package: ", "__comma", [packageName])]);}]);
+    smalltalk.send(smalltalk.send(pkg, "_classes", []), "_do_", [function (each) {return smalltalk.send(self, "_removeClass_", [each]);}]);
+    smalltalk.send(self, "_deletePackage_", [packageName]);
     return self;
 }
 }),
-smalltalk.JSObjectProxy);
-
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_on_'),
+unescape('_renamePackage_to_'),
 smalltalk.method({
-selector: unescape('on%3A'),
-fn: function (aJSObject) {
+selector: unescape('renamePackage%3Ato%3A'),
+fn: function (packageName, newName) {
     var self = this;
-    return function ($rec) {smalltalk.send($rec, "_jsObject_", [aJSObject]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
+    var pkg = nil;
+    pkg = smalltalk.send(self, "_packageAt_ifAbsent_", [packageName, function () {return smalltalk.send(self, "_error_", [smalltalk.send("Missing package: ", "__comma", [packageName])]);}]);
+    ($receiver = smalltalk.send(self, "_packageAt_", [newName])) != nil &&
+        $receiver != undefined ? function () {return smalltalk.send(self, "_error_", [smalltalk.send("Already exists a package called: ", "__comma", [newName])]);}() : nil;
+    smalltalk.packages[newName] = smalltalk.packages[packageName];
+    smalltalk.send(pkg, "_name_", [newName]);
+    smalltalk.send(self, "_deletePackage_", [packageName]);
     return self;
 }
 }),
-smalltalk.JSObjectProxy.klass);
-
+smalltalk.Smalltalk);
 
-smalltalk.addClass('Point', smalltalk.Object, ['x', 'y'], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_x'),
+unescape('_reservedWords'),
 smalltalk.method({
-selector: unescape('x'),
+selector: unescape('reservedWords'),
 fn: function () {
     var self = this;
-    return self['@x'];
+    return self.reservedWords;
     return self;
 }
 }),
-smalltalk.Point);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_y'),
+unescape('_send_to_arguments_'),
 smalltalk.method({
-selector: unescape('y'),
-fn: function () {
+selector: unescape('send%3Ato%3Aarguments%3A'),
+fn: function (aSelector, anObject, aCollection) {
     var self = this;
-    return self['@y'];
+    var selector = nil;
+    selector = smalltalk.send(smalltalk.send(aSelector, "_asString", []), "_asSelector", []);
+    self.send(anObject, selector, aCollection);
     return self;
 }
 }),
-smalltalk.Point);
+smalltalk.Smalltalk);
+
 
+smalltalk.Smalltalk.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_y_'),
+unescape('_current'),
 smalltalk.method({
-selector: unescape('y%3A'),
-fn: function (aNumber) {
+selector: unescape('current'),
+fn: function () {
     var self = this;
-    self['@y'] = aNumber;
+    return smalltalk;
     return self;
 }
 }),
-smalltalk.Point);
+smalltalk.Smalltalk.klass);
+
 
+smalltalk.addClass('UndefinedObject', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_x_'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('x%3A'),
-fn: function (aNumber) {
+selector: unescape('asJSON'),
+fn: function (){
+var self=this;
+return (typeof null == 'undefined' ? nil : null);
+return self;}
+}),
+smalltalk.UndefinedObject);
+
+smalltalk.addMethod(
+unescape('_deepCopy'),
+smalltalk.method({
+selector: unescape('deepCopy'),
+fn: function () {
     var self = this;
-    self['@x'] = aNumber;
+    return self;
     return self;
 }
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('__star'),
+unescape('_ifNil_'),
 smalltalk.method({
-selector: unescape('*'),
-fn: function (aPoint) {
+selector: unescape('ifNil%3A'),
+fn: function (aBlock) {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver * smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__star", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver * smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__star", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
+    return smalltalk.send(self, "_ifNil_ifNotNil_", [aBlock, function () {return nil;}]);
     return self;
 }
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('__plus'),
+unescape('_ifNil_ifNotNil_'),
 smalltalk.method({
-selector: unescape('+'),
-fn: function (aPoint) {
+selector: unescape('ifNil%3AifNotNil%3A'),
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver + smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver + smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
+    return smalltalk.send(aBlock, "_value", []);
     return self;
 }
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('__minus'),
+unescape('_ifNotNil_'),
 smalltalk.method({
-selector: unescape('-'),
-fn: function (aPoint) {
+selector: unescape('ifNotNil%3A'),
+fn: function (aBlock) {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver - smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver - smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
+    return self;
     return self;
 }
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('__slash'),
+unescape('_ifNotNil_ifNil_'),
 smalltalk.method({
-selector: unescape('/'),
-fn: function (aPoint) {
+selector: unescape('ifNotNil%3AifNil%3A'),
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver / smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver / smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
+    return smalltalk.send(anotherBlock, "_value", []);
     return self;
 }
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('_asPoint'),
+unescape('_isNil'),
 smalltalk.method({
-selector: unescape('asPoint'),
+selector: unescape('isNil'),
 fn: function () {
     var self = this;
-    return self;
+    return true;
     return self;
 }
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_notNil'),
 smalltalk.method({
-selector: unescape('%3D'),
-fn: function (aPoint) {
+selector: unescape('notNil'),
+fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.send(aPoint, "_class", []), "__eq", [smalltalk.send(self, "_class", [])]), "_and_", [function () {return smalltalk.send(smalltalk.send(smalltalk.send(aPoint, "_x", []), "__eq", [smalltalk.send(self, "_x", [])]), "_&", [smalltalk.send(smalltalk.send(aPoint, "_y", []), "__eq", [smalltalk.send(self, "_y", [])])]);}]);
+    return false;
     return self;
 }
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
 unescape('_printString'),
@@ -3425,61 +3435,72 @@ smalltalk.method({
 selector: unescape('printString'),
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (stream) {smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@x'], "_printString", []), "__comma", [unescape("@")])]);($receiver = smalltalk.send(smalltalk.send(self['@y'], "_notNil", []), "_and_", [function () {return smalltalk.send(self['@y'], "_negative", []);}])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(stream, "_space", []);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(stream, "_space", []);}]);return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self['@y'], "_printString", [])]);}]);
+    return "nil";
     return self;
 }
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('_translateBy_'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('translateBy%3A'),
-fn: function (delta){
-var self=this;
-return smalltalk.send(((($receiver = smalltalk.send(delta, "_x", [])).klass === smalltalk.Number) ? $receiver +self['@x'] : smalltalk.send($receiver, "__plus", [self['@x']])), "__at", [((($receiver = smalltalk.send(delta, "_y", [])).klass === smalltalk.Number) ? $receiver +self['@y'] : smalltalk.send($receiver, "__plus", [self['@y']]))]);
-return self;}
+selector: unescape('shallowCopy'),
+fn: function () {
+    var self = this;
+    return self;
+    return self;
+}
 }),
-smalltalk.Point);
-
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('_x_y_'),
+unescape('_subclass_instanceVariableNames_'),
 smalltalk.method({
-selector: unescape('x%3Ay%3A'),
-fn: function (aNumber, anotherNumber) {
+selector: unescape('subclass%3AinstanceVariableNames%3A'),
+fn: function (aString, anotherString) {
     var self = this;
-    return function ($rec) {smalltalk.send($rec, "_x_", [aNumber]);smalltalk.send($rec, "_y_", [anotherNumber]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
+    return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, anotherString, nil]);
     return self;
 }
 }),
-smalltalk.Point.klass);
-
+smalltalk.UndefinedObject);
 
-smalltalk.addClass('Random', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.addMethod(
-unescape('_next'),
+unescape('_subclass_instanceVariableNames_category_'),
 smalltalk.method({
-selector: unescape('next'),
-fn: function () {
+selector: unescape('subclass%3AinstanceVariableNames%3Acategory%3A'),
+fn: function (aString, aString2, aString3) {
     var self = this;
-    return Math.random();
+    smalltalk.send(self, "_deprecatedAPI", []);
+    return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
     return self;
 }
 }),
-smalltalk.Random);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('_next_'),
+unescape('_subclass_instanceVariableNames_package_'),
 smalltalk.method({
-selector: unescape('next%3A'),
-fn: function (anInteger) {
+selector: unescape('subclass%3AinstanceVariableNames%3Apackage%3A'),
+fn: function (aString, aString2, aString3) {
     var self = this;
-    return smalltalk.send(smalltalk.send(1, "_to_", [anInteger]), "_collect_", [function (each) {return smalltalk.send(self, "_next", []);}]);
+    return smalltalk.send(smalltalk.send(smalltalk.ClassBuilder || ClassBuilder, "_new", []), "_superclass_subclass_instanceVariableNames_package_", [self, aString, aString2, aString3]);
     return self;
 }
 }),
-smalltalk.Random);
+smalltalk.UndefinedObject);
+
 
+smalltalk.addMethod(
+unescape('_new'),
+smalltalk.method({
+selector: unescape('new'),
+fn: function () {
+    var self = this;
+    smalltalk.send(self, "_error_", ["You cannot create new instances of UndefinedObject. Use nil"]);
+    return self;
+}
+}),
+smalltalk.UndefinedObject.klass);
 
 
diff --git a/amber/src/js/Kernel-Objects.js b/amber/src/js/Kernel-Objects.js
index 3d5cc22ed86..cefa23ddca0 100644
--- a/amber/src/js/Kernel-Objects.js
+++ b/amber/src/js/Kernel-Objects.js
@@ -1,6 +1,23 @@
 smalltalk.addPackage('Kernel-Objects', {});
 smalltalk.addClass('Object', smalltalk.nil, [], 'Kernel-Objects');
 smalltalk.Object.comment=unescape('*Object%20is%20the%20root%20of%20the%20Smalltalk%20class%20system*.%20All%20classes%20in%20the%20system%20are%20subclasses%20of%20Object.%0A%0AObject%20provides%20default%20behavior%20common%20to%20all%20normal%20objects%2C%20such%20as%3A%20%0A%0A-%20access%0A-%20copying%0A-%20comparison%0A-%20error%20handling%0A-%20message%20sending%0A-%20reflection%0A%0AAlso%20utility%20messages%20that%20all%20objects%20should%20respond%20to%20are%20defined%20here.%0A%0AObject%20has%20no%20instance%20variable.%0A%0A%23%23Access%0A%0AInstance%20variables%20can%20be%20accessed%20with%20%60%23instVarAt%3A%60%20and%20%60%23instVarAt%3Aput%3A%60.%20%60Object%20%3E%3E%20instanceVariableNames%60%20answers%20a%20collection%20of%20all%20instance%20variable%20names.%0AAccessing%20JavaScript%20properties%20of%20an%20object%20is%20done%20through%20%60%23basicAt%3A%60%2C%20%60%23basicAt%3Aput%3A%60%20and%20%60basicDelete%3A%60.%0A%0A%23%23Copying%0A%0ACopying%20an%20object%20is%20handled%20by%20%60%23copy%60%20and%20%60%23deepCopy%60.%20The%20first%20one%20performs%20a%20shallow%20copy%20of%20the%20receiver%2C%20while%20the%20second%20one%20performs%20a%20deep%20copy.%0AThe%20hook%20method%20%60%23postCopy%60%20can%20be%20overriden%20in%20subclasses%20to%20copy%20fields%20as%20necessary%20to%20complete%20the%20full%20copy.%20It%20will%20be%20sent%20by%20the%20copy%20of%20the%20receiver.%0A%0A%23%23Comparison%0A%0AObjects%20understand%20equality%20%20%60%23%3D%60%20and%20identity%20%60%23%3D%3D%60%20comparison.%0A%0A%23%23Error%20handling%0A%0A-%20%60%23halt%60%20is%20the%20typical%20message%20to%20use%20for%20inserting%20breakpoints%20during%20debugging.%0A-%20%60%23error%3A%60%20throws%20a%20generic%20error%20exception%0A-%20%60%23doesNotUnderstand%3A%60%20handles%20the%20fact%20that%20there%20was%20an%20attempt%20to%20send%20the%20given%20message%20to%20the%20receiver%20but%20the%20receiver%20does%20not%20understand%20this%20message.%0A%20%20Overriding%20this%20message%20can%20be%20useful%20to%20implement%20proxies%20for%20example.')
+smalltalk.addMethod(
+unescape('__minus_gt'),
+smalltalk.method({
+selector: unescape('-%3E'),
+category: 'converting',
+fn: function (anObject) {
+    var self = this;
+    return smalltalk.send(smalltalk.Association || Association, "_key_value_", [self, anObject]);
+    return self;
+},
+args: ["anObject"],
+source: unescape('-%3E%20anObject%0A%09%5EAssociation%20key%3A%20self%20value%3A%20anObject'),
+messageSends: ["key:value:"],
+referencedClasses: ["Association"]
+}),
+smalltalk.Object);
+
 smalltalk.addMethod(
 unescape('__eq'),
 smalltalk.method({
@@ -19,125 +36,207 @@ referencedClasses: []
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_%7E_eq'),
+unescape('__eq_eq'),
 smalltalk.method({
-selector: unescape('%7E%3D'),
+selector: unescape('%3D%3D'),
 category: 'comparing',
 fn: function (anObject) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "__eq", [anObject]), "__eq", [false]);
+    return smalltalk.send(smalltalk.send(self, "_identityHash", []), "__eq", [smalltalk.send(anObject, "_identityHash", [])]);
     return self;
 },
 args: ["anObject"],
-source: unescape('%7E%3D%20anObject%0A%09%5E%28self%20%3D%20anObject%29%20%3D%20false'),
-messageSends: [unescape("%3D")],
+source: unescape('%3D%3D%20anObject%0A%09%5Eself%20identityHash%20%3D%20anObject%20identityHash'),
+messageSends: [unescape("%3D"), "identityHash"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
+selector: unescape('asJSON'),
+category: 'converting',
+fn: function (){
+var self=this;
+var variables=nil;
+(variables=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_allInstanceVariableNames", []), "_do_", [(function(each){return smalltalk.send(variables, "_at_put_", [each, smalltalk.send(smalltalk.send(self, "_instVarAt_", [each]), "_asJSON", [])]);})]);
+return variables;
+return self;},
+args: [],
+source: unescape('asJSON%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20HashedCollection%20new.%0A%09self%20class%20allInstanceVariableNames%20do%3A%20%5B%3Aeach%20%7C%0A%09%09variables%20at%3A%20each%20put%3A%20%28self%20instVarAt%3A%20each%29%20asJSON%5D.%0A%09%5Evariables'),
+messageSends: ["new", "do:", "allInstanceVariableNames", "class", "at:put:", "asJSON", "instVarAt:"],
+referencedClasses: ["HashedCollection"]
+}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+unescape('_asJSONString'),
+smalltalk.method({
+selector: unescape('asJSONString'),
+category: 'converting',
+fn: function (){
+var self=this;
+return smalltalk.send((smalltalk.JSON || JSON), "_stringify_", [smalltalk.send(self, "_asJSON", [])]);
+return self;},
+args: [],
+source: unescape('asJSONString%0A%09%5EJSON%20stringify%3A%20self%20asJSON'),
+messageSends: ["stringify:", "asJSON"],
+referencedClasses: ["JSON"]
+}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+unescape('_asJavascript'),
+smalltalk.method({
+selector: unescape('asJavascript'),
+category: 'converting',
 fn: function () {
     var self = this;
+    return smalltalk.send(self, "_asString", []);
     return self;
 },
 args: [],
-source: unescape('initialize'),
-messageSends: [],
+source: unescape('asJavascript%0A%09%5Eself%20asString'),
+messageSends: ["asString"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_yourself'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('yourself'),
-category: 'accessing',
+selector: unescape('asString'),
+category: 'converting',
 fn: function () {
     var self = this;
-    return self;
+    return smalltalk.send(self, "_printString", []);
     return self;
 },
 args: [],
-source: unescape('yourself%0A%09%5Eself'),
+source: unescape('asString%0A%09%5Eself%20printString'),
+messageSends: ["printString"],
+referencedClasses: []
+}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+unescape('_basicAt_'),
+smalltalk.method({
+selector: unescape('basicAt%3A'),
+category: 'accessing',
+fn: function (aString) {
+    var self = this;
+    return self[aString];
+    return self;
+},
+args: ["aString"],
+source: unescape('basicAt%3A%20aString%0A%09%3Creturn%20self%5BaString%5D%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_class'),
+unescape('_basicAt_put_'),
 smalltalk.method({
-selector: unescape('class'),
+selector: unescape('basicAt%3Aput%3A'),
 category: 'accessing',
-fn: function () {
+fn: function (aString, anObject) {
     var self = this;
-    return self.klass;
+    return self[aString] = anObject;
     return self;
 },
-args: [],
-source: unescape('class%0A%09%3Creturn%20self.klass%3E'),
+args: ["aString", "anObject"],
+source: unescape('basicAt%3A%20aString%20put%3A%20anObject%0A%09%3Creturn%20self%5BaString%5D%20%3D%20anObject%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_size'),
+unescape('_basicDelete_'),
 smalltalk.method({
-selector: unescape('size'),
+selector: unescape('basicDelete%3A'),
 category: 'accessing',
-fn: function () {
+fn: function (aString) {
     var self = this;
-    smalltalk.send(self, "_error_", ["Object not indexable"]);
+    delete self[aString];
+    return aString;
     return self;
 },
-args: [],
-source: unescape('size%0A%09self%20error%3A%20%27Object%20not%20indexable%27'),
-messageSends: ["error:"],
+args: ["aString"],
+source: unescape('basicDelete%3A%20aString%0A%20%20%20%20%3Cdelete%20self%5BaString%5D%3B%20return%20aString%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_copy'),
+unescape('_basicPerform_'),
 smalltalk.method({
-selector: unescape('copy'),
-category: 'copying',
+selector: unescape('basicPerform%3A'),
+category: 'message handling',
+fn: function (aSymbol) {
+    var self = this;
+    return smalltalk.send(self, "_basicPerform_withArguments_", [aSymbol, []]);
+    return self;
+},
+args: ["aSymbol"],
+source: unescape('basicPerform%3A%20aSymbol%20%0A%09%5Eself%20basicPerform%3A%20aSymbol%20withArguments%3A%20%23%28%29'),
+messageSends: ["basicPerform:withArguments:"],
+referencedClasses: []
+}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+unescape('_basicPerform_withArguments_'),
+smalltalk.method({
+selector: unescape('basicPerform%3AwithArguments%3A'),
+category: 'message handling',
+fn: function (aSymbol, aCollection) {
+    var self = this;
+    return self[aSymbol].apply(self, aCollection);
+    return self;
+},
+args: ["aSymbol", "aCollection"],
+source: unescape('basicPerform%3A%20aSymbol%20withArguments%3A%20aCollection%0A%09%3Creturn%20self%5BaSymbol%5D.apply%28self%2C%20aCollection%29%3B%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+unescape('_class'),
+smalltalk.method({
+selector: unescape('class'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_shallowCopy", []), "_postCopy", []);
+    return self.klass;
     return self;
 },
 args: [],
-source: unescape('copy%0A%09%5Eself%20shallowCopy%20postCopy'),
-messageSends: ["postCopy", "shallowCopy"],
+source: unescape('class%0A%09%3Creturn%20self.klass%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_copy'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
+selector: unescape('copy'),
 category: 'copying',
 fn: function () {
     var self = this;
-    var copy = self.klass._new();
-    for (var i in self) {
-        if (/^@.+/.test(i)) {
-            copy[i] = self[i];
-        }
-    }
-    return copy;
+    return smalltalk.send(smalltalk.send(self, "_shallowCopy", []), "_postCopy", []);
     return self;
 },
 args: [],
-source: unescape('shallowCopy%0A%09%3C%0A%09%20%20%20%20var%20copy%20%3D%20self.klass._new%28%29%3B%0A%09%20%20%20%20for%28var%20i%20in%20self%29%20%7B%0A%09%09if%28/%5E@.+/.test%28i%29%29%20%7B%0A%09%09%20%20%20%20copy%5Bi%5D%20%3D%20self%5Bi%5D%3B%0A%09%09%7D%0A%09%20%20%20%20%7D%0A%09%20%20%20%20return%20copy%3B%0A%09%3E'),
-messageSends: [],
+source: unescape('copy%0A%09%5Eself%20shallowCopy%20postCopy'),
+messageSends: ["postCopy", "shallowCopy"],
 referencedClasses: []
 }),
 smalltalk.Object);
@@ -166,280 +265,224 @@ referencedClasses: []
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_postCopy'),
+unescape('_deprecatedAPI'),
 smalltalk.method({
-selector: unescape('postCopy'),
-category: 'copying',
+selector: unescape('deprecatedAPI'),
+category: 'error handling',
 fn: function () {
     var self = this;
+    smalltalk.send(typeof console == "undefined" ? nil : console, "_warn_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.getThisContext(), "_home", []), "_asString", []), "__comma", [unescape("%20is%20deprecated%21%20%28in%20")]), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.getThisContext(), "_home", []), "_home", []), "_asString", [])]), "__comma", [unescape("%29")])]);
     return self;
 },
 args: [],
-source: unescape('postCopy'),
-messageSends: [],
+source: unescape('deprecatedAPI%0A%09%22Just%20a%20simple%20way%20to%20deprecate%20methods.%0A%09%23deprecatedAPI%20is%20in%20the%20%27error%20handling%27%20protocol%20even%20if%20it%20doesn%27t%20throw%20an%20error%2C%0A%09but%20it%20could%20in%20the%20future.%22%0A%09console%20warn%3A%20thisContext%20home%20asString%2C%20%27%20is%20deprecated%21%20%28in%20%27%2C%20thisContext%20home%20home%20asString%2C%20%27%29%27'),
+messageSends: ["warn:", unescape("%2C"), "asString", "home"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('__minus_gt'),
+unescape('_doesNotUnderstand_'),
 smalltalk.method({
-selector: unescape('-%3E'),
-category: 'converting',
-fn: function (anObject) {
+selector: unescape('doesNotUnderstand%3A'),
+category: 'error handling',
+fn: function (aMessage) {
     var self = this;
-    return smalltalk.send(smalltalk.Association || Association, "_key_value_", [self, anObject]);
+    (function ($rec) {smalltalk.send($rec, "_receiver_", [self]);smalltalk.send($rec, "_message_", [aMessage]);return smalltalk.send($rec, "_signal", []);}(smalltalk.send(smalltalk.MessageNotUnderstood || MessageNotUnderstood, "_new", [])));
     return self;
 },
-args: ["anObject"],
-source: unescape('-%3E%20anObject%0A%09%5EAssociation%20key%3A%20self%20value%3A%20anObject'),
-messageSends: ["key:value:"],
-referencedClasses: ["Association"]
+args: ["aMessage"],
+source: unescape('doesNotUnderstand%3A%20aMessage%0A%09MessageNotUnderstood%20new%0A%09%09receiver%3A%20self%3B%0A%09%09message%3A%20aMessage%3B%0A%09%09signal'),
+messageSends: ["receiver:", "message:", "signal", "new"],
+referencedClasses: ["MessageNotUnderstood"]
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_error_'),
 smalltalk.method({
-selector: unescape('asString'),
-category: 'converting',
-fn: function () {
+selector: unescape('error%3A'),
+category: 'error handling',
+fn: function (aString) {
     var self = this;
-    return smalltalk.send(self, "_printString", []);
+    smalltalk.send(smalltalk.Error || Error, "_signal_", [aString]);
     return self;
 },
-args: [],
-source: unescape('asString%0A%09%5Eself%20printString'),
-messageSends: ["printString"],
-referencedClasses: []
+args: ["aString"],
+source: unescape('error%3A%20aString%0A%09Error%20signal%3A%20aString'),
+messageSends: ["signal:"],
+referencedClasses: ["Error"]
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_halt'),
 smalltalk.method({
-selector: unescape('asJavascript'),
-category: 'converting',
+selector: unescape('halt'),
+category: 'error handling',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_asString", []);
+    smalltalk.send(self, "_error_", ["Halt encountered"]);
     return self;
 },
 args: [],
-source: unescape('asJavascript%0A%09%5Eself%20asString'),
-messageSends: ["asString"],
+source: unescape('halt%0A%09self%20error%3A%20%27Halt%20encountered%27'),
+messageSends: ["error:"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_perform_'),
+unescape('_identityHash'),
 smalltalk.method({
-selector: unescape('perform%3A'),
-category: 'message handling',
-fn: function (aSymbol) {
+selector: unescape('identityHash'),
+category: 'accessing',
+fn: function () {
     var self = this;
-    return smalltalk.send(self, "_perform_withArguments_", [aSymbol, []]);
-    return self;
-},
-args: ["aSymbol"],
-source: unescape('perform%3A%20aSymbol%0A%09%5Eself%20perform%3A%20aSymbol%20withArguments%3A%20%23%28%29'),
-messageSends: ["perform:withArguments:"],
-referencedClasses: []
-}),
-smalltalk.Object);
-
-smalltalk.addMethod(
-unescape('_perform_withArguments_'),
-smalltalk.method({
-selector: unescape('perform%3AwithArguments%3A'),
-category: 'message handling',
-fn: function (aSymbol, aCollection) {
-    var self = this;
-    return smalltalk.send(self, "_basicPerform_withArguments_", [smalltalk.send(aSymbol, "_asSelector", []), aCollection]);
-    return self;
-},
-args: ["aSymbol", "aCollection"],
-source: unescape('perform%3A%20aSymbol%20withArguments%3A%20aCollection%0A%09%5Eself%20basicPerform%3A%20aSymbol%20asSelector%20withArguments%3A%20aCollection'),
-messageSends: ["basicPerform:withArguments:", "asSelector"],
-referencedClasses: []
-}),
-smalltalk.Object);
-
-smalltalk.addMethod(
-unescape('_instVarAt_'),
-smalltalk.method({
-selector: unescape('instVarAt%3A'),
-category: 'accessing',
-fn: function (aSymbol) {
-    var self = this;
-    var varname = nil;
-    varname = smalltalk.send(aSymbol, "_asString", []);
-    return self["@" + varname];
+    return self.identityHash || (self.identityHash = smalltalk.nextId());
     return self;
 },
-args: ["aSymbol"],
-source: unescape('instVarAt%3A%20aSymbol%0A%09%7C%20varname%20%7C%0A%09varname%20%3A%3D%20aSymbol%20asString.%0A%09%3Creturn%20self%5B%27@%27+varname%5D%3E'),
-messageSends: ["asString"],
+args: [],
+source: unescape('identityHash%0A%09%3Creturn%20self.identityHash%20%7C%7C%20%28self.identityHash%20%3D%20smalltalk.nextId%28%29%29%3B%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_instVarAt_put_'),
+unescape('_ifNil_'),
 smalltalk.method({
-selector: unescape('instVarAt%3Aput%3A'),
-category: 'accessing',
-fn: function (aSymbol, anObject) {
+selector: unescape('ifNil%3A'),
+category: 'testing',
+fn: function (aBlock) {
     var self = this;
-    var varname = nil;
-    varname = smalltalk.send(aSymbol, "_asString", []);
-    self["@" + varname] = anObject;
     return self;
-},
-args: ["aSymbol", "anObject"],
-source: unescape('instVarAt%3A%20aSymbol%20put%3A%20anObject%0A%09%7C%20varname%20%7C%0A%09varname%20%3A%3D%20aSymbol%20asString.%0A%09%3Cself%5B%27@%27%20+%20varname%5D%20%3D%20anObject%3E'),
-messageSends: ["asString"],
-referencedClasses: []
-}),
-smalltalk.Object);
-
-smalltalk.addMethod(
-unescape('_basicAt_'),
-smalltalk.method({
-selector: unescape('basicAt%3A'),
-category: 'accessing',
-fn: function (aString) {
-    var self = this;
-    return self[aString];
     return self;
 },
-args: ["aString"],
-source: unescape('basicAt%3A%20aString%0A%09%3Creturn%20self%5BaString%5D%3E'),
+args: ["aBlock"],
+source: unescape('ifNil%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_basicAt_put_'),
+unescape('_ifNil_ifNotNil_'),
 smalltalk.method({
-selector: unescape('basicAt%3Aput%3A'),
-category: 'accessing',
-fn: function (aString, anObject) {
+selector: unescape('ifNil%3AifNotNil%3A'),
+category: 'testing',
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    return self[aString] = anObject;
+    return smalltalk.send(anotherBlock, "_value", []);
     return self;
 },
-args: ["aString", "anObject"],
-source: unescape('basicAt%3A%20aString%20put%3A%20anObject%0A%09%3Creturn%20self%5BaString%5D%20%3D%20anObject%3E'),
-messageSends: [],
+args: ["aBlock", "anotherBlock"],
+source: unescape('ifNil%3A%20aBlock%20ifNotNil%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5EanotherBlock%20value'),
+messageSends: ["value"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_error_'),
+unescape('_ifNotNil_'),
 smalltalk.method({
-selector: unescape('error%3A'),
-category: 'error handling',
-fn: function (aString) {
+selector: unescape('ifNotNil%3A'),
+category: 'testing',
+fn: function (aBlock) {
     var self = this;
-    smalltalk.send(smalltalk.Error || Error, "_signal_", [aString]);
+    return smalltalk.send(aBlock, "_value", []);
     return self;
 },
-args: ["aString"],
-source: unescape('error%3A%20aString%0A%09Error%20signal%3A%20aString'),
-messageSends: ["signal:"],
-referencedClasses: ["Error"]
+args: ["aBlock"],
+source: unescape('ifNotNil%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5EaBlock%20value'),
+messageSends: ["value"],
+referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_subclassResponsibility'),
+unescape('_ifNotNil_ifNil_'),
 smalltalk.method({
-selector: unescape('subclassResponsibility'),
-category: 'error handling',
-fn: function () {
+selector: unescape('ifNotNil%3AifNil%3A'),
+category: 'testing',
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    smalltalk.send(self, "_error_", ["This method is a responsibility of a subclass"]);
+    return smalltalk.send(aBlock, "_value", []);
     return self;
 },
-args: [],
-source: unescape('subclassResponsibility%0A%09self%20error%3A%20%27This%20method%20is%20a%20responsibility%20of%20a%20subclass%27'),
-messageSends: ["error:"],
+args: ["aBlock", "anotherBlock"],
+source: unescape('ifNotNil%3A%20aBlock%20ifNil%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5EaBlock%20value'),
+messageSends: ["value"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_shouldNotImplement'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('shouldNotImplement'),
-category: 'error handling',
+selector: unescape('initialize'),
+category: 'initialization',
 fn: function () {
     var self = this;
-    smalltalk.send(self, "_error_", [smalltalk.send("This method should not be implemented in ", "__comma", [smalltalk.send(smalltalk.send(self, "_class", []), "_name", [])])]);
     return self;
 },
 args: [],
-source: unescape('shouldNotImplement%0A%09self%20error%3A%20%27This%20method%20should%20not%20be%20implemented%20in%20%27%2C%20self%20class%20name'),
-messageSends: ["error:", unescape("%2C"), "name", "class"],
+source: unescape('initialize'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_try_catch_'),
+unescape('_instVarAt_'),
 smalltalk.method({
-selector: unescape('try%3Acatch%3A'),
-category: 'error handling',
-fn: function (aBlock, anotherBlock) {
+selector: unescape('instVarAt%3A'),
+category: 'accessing',
+fn: function (aSymbol) {
     var self = this;
-    try {
-        result = aBlock();
-    } catch (e) {
-        result = anotherBlock(e);
-    }
-    return result;
+    var varname = nil;
+    varname = smalltalk.send(aSymbol, "_asString", []);
+    return self["@" + varname];
     return self;
 },
-args: ["aBlock", "anotherBlock"],
-source: unescape('try%3A%20aBlock%20catch%3A%20anotherBlock%0A%09%3Ctry%7Bresult%20%3D%20aBlock%28%29%7D%20catch%28e%29%20%7Bresult%20%3D%20anotherBlock%28e%29%7D%3B%0A%09return%20result%3B%3E'),
-messageSends: [],
+args: ["aSymbol"],
+source: unescape('instVarAt%3A%20aSymbol%0A%09%7C%20varname%20%7C%0A%09varname%20%3A%3D%20aSymbol%20asString.%0A%09%3Creturn%20self%5B%27@%27+varname%5D%3E'),
+messageSends: ["asString"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_instVarAt_put_'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
-fn: function () {
+selector: unescape('instVarAt%3Aput%3A'),
+category: 'accessing',
+fn: function (aSymbol, anObject) {
     var self = this;
-    return smalltalk.send("a ", "__comma", [smalltalk.send(smalltalk.send(self, "_class", []), "_name", [])]);
+    var varname = nil;
+    varname = smalltalk.send(aSymbol, "_asString", []);
+    self["@" + varname] = anObject;
     return self;
 },
-args: [],
-source: unescape('printString%0A%09%5E%27a%20%27%2C%20self%20class%20name'),
-messageSends: [unescape("%2C"), "name", "class"],
+args: ["aSymbol", "anObject"],
+source: unescape('instVarAt%3A%20aSymbol%20put%3A%20anObject%0A%09%7C%20varname%20%7C%0A%09varname%20%3A%3D%20aSymbol%20asString.%0A%09%3Cself%5B%27@%27%20+%20varname%5D%20%3D%20anObject%3E'),
+messageSends: ["asString"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_printNl'),
+unescape('_isClass'),
 smalltalk.method({
-selector: unescape('printNl'),
-category: 'printing',
+selector: unescape('isClass'),
+category: 'testing',
 fn: function () {
     var self = this;
-    console.log(self);
+    return false;
     return self;
 },
 args: [],
-source: unescape('printNl%0A%09%3Cconsole.log%28self%29%3E'),
+source: unescape('isClass%0A%09%5Efalse'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -480,77 +523,77 @@ referencedClasses: []
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_ifNil_'),
+unescape('_isMetaclass'),
 smalltalk.method({
-selector: unescape('ifNil%3A'),
+selector: unescape('isMetaclass'),
 category: 'testing',
-fn: function (aBlock) {
+fn: function () {
     var self = this;
-    return self;
+    return false;
     return self;
 },
-args: ["aBlock"],
-source: unescape('ifNil%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself'),
+args: [],
+source: unescape('isMetaclass%0A%09%5Efalse'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_ifNil_ifNotNil_'),
+unescape('_isNil'),
 smalltalk.method({
-selector: unescape('ifNil%3AifNotNil%3A'),
+selector: unescape('isNil'),
 category: 'testing',
-fn: function (aBlock, anotherBlock) {
+fn: function () {
     var self = this;
-    return smalltalk.send(anotherBlock, "_value", []);
+    return false;
     return self;
 },
-args: ["aBlock", "anotherBlock"],
-source: unescape('ifNil%3A%20aBlock%20ifNotNil%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5EanotherBlock%20value'),
-messageSends: ["value"],
+args: [],
+source: unescape('isNil%0A%09%5Efalse'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_ifNotNil_'),
+unescape('_isNumber'),
 smalltalk.method({
-selector: unescape('ifNotNil%3A'),
+selector: unescape('isNumber'),
 category: 'testing',
-fn: function (aBlock) {
+fn: function () {
     var self = this;
-    return smalltalk.send(aBlock, "_value", []);
+    return false;
     return self;
 },
-args: ["aBlock"],
-source: unescape('ifNotNil%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5EaBlock%20value'),
-messageSends: ["value"],
+args: [],
+source: unescape('isNumber%0A%09%5Efalse'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_ifNotNil_ifNil_'),
+unescape('_isParseFailure'),
 smalltalk.method({
-selector: unescape('ifNotNil%3AifNil%3A'),
+selector: unescape('isParseFailure'),
 category: 'testing',
-fn: function (aBlock, anotherBlock) {
+fn: function () {
     var self = this;
-    return smalltalk.send(aBlock, "_value", []);
+    return false;
     return self;
 },
-args: ["aBlock", "anotherBlock"],
-source: unescape('ifNotNil%3A%20aBlock%20ifNil%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5EaBlock%20value'),
-messageSends: ["value"],
+args: [],
+source: unescape('isParseFailure%0A%09%5Efalse'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isNil'),
+unescape('_isString'),
 smalltalk.method({
-selector: unescape('isNil'),
+selector: unescape('isString'),
 category: 'testing',
 fn: function () {
     var self = this;
@@ -558,251 +601,309 @@ fn: function () {
     return self;
 },
 args: [],
-source: unescape('isNil%0A%09%5Efalse'),
+source: unescape('isString%0A%09%5Efalse'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_notNil'),
+unescape('_isSymbol'),
 smalltalk.method({
-selector: unescape('notNil'),
+selector: unescape('isSymbol'),
 category: 'testing',
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_isNil", []), "_not", []);
+    return false;
     return self;
 },
 args: [],
-source: unescape('notNil%0A%09%5Eself%20isNil%20not'),
-messageSends: ["not", "isNil"],
-referencedClasses: []
+source: unescape('isSymbol%0A%09%5Efalse'),
+messageSends: [],
+referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isClass'),
+unescape('_log_block_'),
 smalltalk.method({
-selector: unescape('isClass'),
+selector: unescape('log%3Ablock%3A'),
+category: 'printing',
+fn: function (aString, aBlock) {
+    var self = this;
+    var result = nil;
+    smalltalk.send(typeof console == "undefined" ? nil : console, "_log_", [smalltalk.send(smalltalk.send(aString, "__comma", [" time: "]), "__comma", [smalltalk.send(smalltalk.send(smalltalk.Date || Date, "_millisecondsToRun_", [function () {return result = smalltalk.send(aBlock, "_value", []);}]), "_printString", [])])]);
+    return result;
+    return self;
+},
+args: ["aString", "aBlock"],
+source: unescape('log%3A%20aString%20block%3A%20aBlock%0A%0A%09%7C%20result%20%7C%0A%09console%20log%3A%20%20aString%2C%20%20%27%20time%3A%20%27%2C%20%28Date%20millisecondsToRun%3A%20%5Bresult%20%3A%3D%20aBlock%20value%5D%29%20printString.%0A%09%5Eresult'),
+messageSends: ["log:", unescape("%2C"), "printString", "millisecondsToRun:", "value"],
+referencedClasses: ["Date"]
+}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+unescape('_notNil'),
+smalltalk.method({
+selector: unescape('notNil'),
 category: 'testing',
 fn: function () {
     var self = this;
-    return false;
+    return smalltalk.send(smalltalk.send(self, "_isNil", []), "_not", []);
     return self;
 },
 args: [],
-source: unescape('isClass%0A%09%5Efalse'),
-messageSends: [],
+source: unescape('notNil%0A%09%5Eself%20isNil%20not'),
+messageSends: ["not", "isNil"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isMetaclass'),
+unescape('_perform_'),
 smalltalk.method({
-selector: unescape('isMetaclass'),
-category: 'testing',
-fn: function () {
+selector: unescape('perform%3A'),
+category: 'message handling',
+fn: function (aSymbol) {
     var self = this;
-    return false;
+    return smalltalk.send(self, "_perform_withArguments_", [aSymbol, []]);
     return self;
 },
-args: [],
-source: unescape('isMetaclass%0A%09%5Efalse'),
-messageSends: [],
+args: ["aSymbol"],
+source: unescape('perform%3A%20aSymbol%0A%09%5Eself%20perform%3A%20aSymbol%20withArguments%3A%20%23%28%29'),
+messageSends: ["perform:withArguments:"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isNumber'),
+unescape('_perform_withArguments_'),
 smalltalk.method({
-selector: unescape('isNumber'),
-category: 'testing',
+selector: unescape('perform%3AwithArguments%3A'),
+category: 'message handling',
+fn: function (aSymbol, aCollection) {
+    var self = this;
+    return smalltalk.send(self, "_basicPerform_withArguments_", [smalltalk.send(aSymbol, "_asSelector", []), aCollection]);
+    return self;
+},
+args: ["aSymbol", "aCollection"],
+source: unescape('perform%3A%20aSymbol%20withArguments%3A%20aCollection%0A%09%5Eself%20basicPerform%3A%20aSymbol%20asSelector%20withArguments%3A%20aCollection'),
+messageSends: ["basicPerform:withArguments:", "asSelector"],
+referencedClasses: []
+}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+unescape('_postCopy'),
+smalltalk.method({
+selector: unescape('postCopy'),
+category: 'copying',
 fn: function () {
     var self = this;
-    return false;
     return self;
 },
 args: [],
-source: unescape('isNumber%0A%09%5Efalse'),
+source: unescape('postCopy'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isString'),
+unescape('_printNl'),
 smalltalk.method({
-selector: unescape('isString'),
-category: 'testing',
+selector: unescape('printNl'),
+category: 'printing',
 fn: function () {
     var self = this;
-    return false;
+    console.log(self);
     return self;
 },
 args: [],
-source: unescape('isString%0A%09%5Efalse'),
+source: unescape('printNl%0A%09%3Cconsole.log%28self%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_isParseFailure'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('isParseFailure'),
-category: 'testing',
+selector: unescape('printString'),
+category: 'printing',
 fn: function () {
     var self = this;
-    return false;
+    return smalltalk.send("a ", "__comma", [smalltalk.send(smalltalk.send(self, "_class", []), "_name", [])]);
     return self;
 },
 args: [],
-source: unescape('isParseFailure%0A%09%5Efalse'),
-messageSends: [],
+source: unescape('printString%0A%09%5E%27a%20%27%2C%20self%20class%20name'),
+messageSends: [unescape("%2C"), "name", "class"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_basicPerform_'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('basicPerform%3A'),
-category: 'message handling',
-fn: function (aSymbol) {
+selector: unescape('shallowCopy'),
+category: 'copying',
+fn: function () {
     var self = this;
-    return smalltalk.send(self, "_basicPerform_withArguments_", [aSymbol, []]);
+    var copy = self.klass._new();
+    for (var i in self) {
+        if (/^@.+/.test(i)) {
+            copy[i] = self[i];
+        }
+    }
+    return copy;
     return self;
 },
-args: ["aSymbol"],
-source: unescape('basicPerform%3A%20aSymbol%20%0A%09%5Eself%20basicPerform%3A%20aSymbol%20withArguments%3A%20%23%28%29'),
-messageSends: ["basicPerform:withArguments:"],
+args: [],
+source: unescape('shallowCopy%0A%09%3C%0A%09%20%20%20%20var%20copy%20%3D%20self.klass._new%28%29%3B%0A%09%20%20%20%20for%28var%20i%20in%20self%29%20%7B%0A%09%09if%28/%5E@.+/.test%28i%29%29%20%7B%0A%09%09%20%20%20%20copy%5Bi%5D%20%3D%20self%5Bi%5D%3B%0A%09%09%7D%0A%09%20%20%20%20%7D%0A%09%20%20%20%20return%20copy%3B%0A%09%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_basicPerform_withArguments_'),
+unescape('_shouldNotImplement'),
 smalltalk.method({
-selector: unescape('basicPerform%3AwithArguments%3A'),
-category: 'message handling',
-fn: function (aSymbol, aCollection) {
+selector: unescape('shouldNotImplement'),
+category: 'error handling',
+fn: function () {
     var self = this;
-    return self[aSymbol].apply(self, aCollection);
+    smalltalk.send(self, "_error_", [smalltalk.send("This method should not be implemented in ", "__comma", [smalltalk.send(smalltalk.send(self, "_class", []), "_name", [])])]);
     return self;
 },
-args: ["aSymbol", "aCollection"],
-source: unescape('basicPerform%3A%20aSymbol%20withArguments%3A%20aCollection%0A%09%3Creturn%20self%5BaSymbol%5D.apply%28self%2C%20aCollection%29%3B%3E'),
-messageSends: [],
+args: [],
+source: unescape('shouldNotImplement%0A%09self%20error%3A%20%27This%20method%20should%20not%20be%20implemented%20in%20%27%2C%20self%20class%20name'),
+messageSends: ["error:", unescape("%2C"), "name", "class"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_basicDelete_'),
+unescape('_size'),
 smalltalk.method({
-selector: unescape('basicDelete%3A'),
+selector: unescape('size'),
 category: 'accessing',
-fn: function (aString) {
+fn: function () {
     var self = this;
-    delete self[aString];
-    return aString;
+    smalltalk.send(self, "_error_", ["Object not indexable"]);
     return self;
 },
-args: ["aString"],
-source: unescape('basicDelete%3A%20aString%0A%20%20%20%20%3Cdelete%20self%5BaString%5D%3B%20return%20aString%3E'),
-messageSends: [],
+args: [],
+source: unescape('size%0A%09self%20error%3A%20%27Object%20not%20indexable%27'),
+messageSends: ["error:"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_doesNotUnderstand_'),
+unescape('_storeOn_'),
 smalltalk.method({
-selector: unescape('doesNotUnderstand%3A'),
-category: 'error handling',
-fn: function (aMessage) {
+selector: unescape('storeOn%3A'),
+category: 'printing',
+fn: function (aStream) {
     var self = this;
-    (function ($rec) {smalltalk.send($rec, "_receiver_", [self]);smalltalk.send($rec, "_message_", [aMessage]);return smalltalk.send($rec, "_signal", []);}(smalltalk.send(smalltalk.MessageNotUnderstood || MessageNotUnderstood, "_new", [])));
+    smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(self, "_printString", [])]);
     return self;
 },
-args: ["aMessage"],
-source: unescape('doesNotUnderstand%3A%20aMessage%0A%09MessageNotUnderstood%20new%0A%09%09receiver%3A%20self%3B%0A%09%09message%3A%20aMessage%3B%0A%09%09signal'),
-messageSends: ["receiver:", "message:", "signal", "new"],
-referencedClasses: ["MessageNotUnderstood"]
+args: ["aStream"],
+source: unescape('storeOn%3A%20aStream%0A%09aStream%20nextPutAll%3A%20self%20printString'),
+messageSends: ["nextPutAll:", "printString"],
+referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_storeString'),
 smalltalk.method({
-selector: unescape('asJSON'),
-category: 'converting',
-fn: function (){
-var self=this;
-var variables=nil;
-(variables=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_allInstanceVariableNames", []), "_do_", [(function(each){return smalltalk.send(variables, "_at_put_", [each, smalltalk.send(smalltalk.send(self, "_instVarAt_", [each]), "_asJSON", [])]);})]);
-return variables;
-return self;},
+selector: unescape('storeString'),
+category: 'printing',
+fn: function () {
+    var self = this;
+    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (s) {return smalltalk.send(self, "_storeOn_", [s]);}]);
+    return self;
+},
 args: [],
-source: unescape('asJSON%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20HashedCollection%20new.%0A%09self%20class%20allInstanceVariableNames%20do%3A%20%5B%3Aeach%20%7C%0A%09%09variables%20at%3A%20each%20put%3A%20%28self%20instVarAt%3A%20each%29%20asJSON%5D.%0A%09%5Evariables'),
-messageSends: ["new", "do:", "allInstanceVariableNames", "class", "at:put:", "asJSON", "instVarAt:"],
-referencedClasses: ["HashedCollection"]
+source: unescape('storeString%0A%09%22Answer%20a%20String%20representation%20of%20the%20receiver%20from%20which%20the%20receiver%20%0A%09can%20be%20reconstructed.%22%0A%0A%09%5E%20String%20streamContents%3A%20%5B%3As%20%7C%20self%20storeOn%3A%20s%5D'),
+messageSends: ["streamContents:", "storeOn:"],
+referencedClasses: ["String"]
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_halt'),
+unescape('_subclassResponsibility'),
 smalltalk.method({
-selector: unescape('halt'),
+selector: unescape('subclassResponsibility'),
 category: 'error handling',
 fn: function () {
     var self = this;
-    smalltalk.send(self, "_error_", ["Halt encountered"]);
+    smalltalk.send(self, "_error_", ["This method is a responsibility of a subclass"]);
     return self;
 },
 args: [],
-source: unescape('halt%0A%09self%20error%3A%20%27Halt%20encountered%27'),
+source: unescape('subclassResponsibility%0A%09self%20error%3A%20%27This%20method%20is%20a%20responsibility%20of%20a%20subclass%27'),
 messageSends: ["error:"],
 referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('_log_block_'),
+unescape('_try_catch_'),
 smalltalk.method({
-selector: unescape('log%3Ablock%3A'),
-category: 'printing',
-fn: function (aString, aBlock) {
+selector: unescape('try%3Acatch%3A'),
+category: 'error handling',
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    var result = nil;
-    smalltalk.send(typeof console == "undefined" ? nil : console, "_log_", [smalltalk.send(smalltalk.send(aString, "__comma", [" time: "]), "__comma", [smalltalk.send(smalltalk.send(smalltalk.Date || Date, "_millisecondsToRun_", [function () {return result = smalltalk.send(aBlock, "_value", []);}]), "_printString", [])])]);
+    try {
+        result = aBlock();
+    } catch (e) {
+        result = anotherBlock(e);
+    }
     return result;
     return self;
 },
-args: ["aString", "aBlock"],
-source: unescape('log%3A%20aString%20block%3A%20aBlock%0A%0A%09%7C%20result%20%7C%0A%09console%20log%3A%20%20aString%2C%20%20%27%20time%3A%20%27%2C%20%28Date%20millisecondsToRun%3A%20%5Bresult%20%3A%3D%20aBlock%20value%5D%29%20printString.%0A%09%5Eresult'),
-messageSends: ["log:", unescape("%2C"), "printString", "millisecondsToRun:", "value"],
-referencedClasses: ["Date"]
+args: ["aBlock", "anotherBlock"],
+source: unescape('try%3A%20aBlock%20catch%3A%20anotherBlock%0A%09%3Ctry%7Bresult%20%3D%20aBlock%28%29%7D%20catch%28e%29%20%7Bresult%20%3D%20anotherBlock%28e%29%7D%3B%0A%09return%20result%3B%3E'),
+messageSends: [],
+referencedClasses: []
 }),
 smalltalk.Object);
 
 smalltalk.addMethod(
-unescape('__eq_eq'),
+unescape('_yourself'),
 smalltalk.method({
-selector: unescape('%3D%3D'),
+selector: unescape('yourself'),
+category: 'accessing',
+fn: function () {
+    var self = this;
+    return self;
+    return self;
+},
+args: [],
+source: unescape('yourself%0A%09%5Eself'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+unescape('_%7E_eq'),
+smalltalk.method({
+selector: unescape('%7E%3D'),
 category: 'comparing',
 fn: function (anObject) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_identityHash", []), "__eq", [smalltalk.send(anObject, "_identityHash", [])]);
+    return smalltalk.send(smalltalk.send(self, "__eq", [anObject]), "__eq", [false]);
     return self;
 },
 args: ["anObject"],
-source: unescape('%3D%3D%20anObject%0A%09%5Eself%20identityHash%20%3D%20anObject%20identityHash'),
-messageSends: [unescape("%3D"), "identityHash"],
+source: unescape('%7E%3D%20anObject%0A%09%5E%28self%20%3D%20anObject%29%20%3D%20false'),
+messageSends: [unescape("%3D")],
 referencedClasses: []
 }),
 smalltalk.Object);
@@ -824,1995 +925,2020 @@ referencedClasses: []
 }),
 smalltalk.Object);
 
+
 smalltalk.addMethod(
-unescape('_deprecatedAPI'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('deprecatedAPI'),
-category: 'error handling',
+selector: unescape('initialize'),
+category: 'initialization',
 fn: function () {
     var self = this;
-    smalltalk.send(typeof console == "undefined" ? nil : console, "_warn_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.getThisContext(), "_home", []), "_asString", []), "__comma", [unescape("%20is%20deprecated%21%20%28in%20")]), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.getThisContext(), "_home", []), "_home", []), "_asString", [])]), "__comma", [unescape("%29")])]);
     return self;
 },
 args: [],
-source: unescape('deprecatedAPI%0A%09%22Just%20a%20simple%20way%20to%20deprecate%20methods.%0A%09%23deprecatedAPI%20is%20in%20the%20%27error%20handling%27%20protocol%20even%20if%20it%20doesn%27t%20throw%20an%20error%2C%0A%09but%20it%20could%20in%20the%20future.%22%0A%09console%20warn%3A%20thisContext%20home%20asString%2C%20%27%20is%20deprecated%21%20%28in%20%27%2C%20thisContext%20home%20home%20asString%2C%20%27%29%27'),
-messageSends: ["warn:", unescape("%2C"), "asString", "home"],
+source: unescape('initialize%0A%09%22no%20op%22'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Object);
+smalltalk.Object.klass);
+
 
+smalltalk.addClass('Boolean', smalltalk.Object, [], 'Kernel-Objects');
+smalltalk.Boolean.comment=unescape('Boolean%20wraps%20the%20JavaScript%20%60Boolean%28%29%60%20constructor.%20The%20%60true%60%20and%20%60false%60%20objects%20are%20the%20JavaScript%20boolean%20objects.%0A%0ABoolean%20defines%20the%20protocol%20for%20logic%20testing%20operations%20and%20conditional%20control%20structures%20for%20the%20logical%20values.%0ABoolean%20instances%20are%20weither%20%60true%60%20or%20%60false%60.')
 smalltalk.addMethod(
-unescape('_storeString'),
+unescape('_%26'),
 smalltalk.method({
-selector: unescape('storeString'),
-category: 'printing',
-fn: function () {
+selector: unescape('%26'),
+category: 'controlling',
+fn: function (aBoolean) {
     var self = this;
-    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (s) {return smalltalk.send(self, "_storeOn_", [s]);}]);
+    if (self == true) {
+        return aBoolean;
+    } else {
+        return false;
+    }
     return self;
 },
-args: [],
-source: unescape('storeString%0A%09%22Answer%20a%20String%20representation%20of%20the%20receiver%20from%20which%20the%20receiver%20%0A%09can%20be%20reconstructed.%22%0A%0A%09%5E%20String%20streamContents%3A%20%5B%3As%20%7C%20self%20storeOn%3A%20s%5D'),
-messageSends: ["streamContents:", "storeOn:"],
-referencedClasses: ["String"]
+args: ["aBoolean"],
+source: unescape('%26%20aBoolean%0A%09%3C%0A%09%20%20%20%20if%28self%20%3D%3D%20true%29%20%7B%0A%09%09return%20aBoolean%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20false%3B%0A%09%20%20%20%20%7D%0A%09%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Object);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_storeOn_'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('storeOn%3A'),
-category: 'printing',
-fn: function (aStream) {
+selector: unescape('%3D'),
+category: 'comparing',
+fn: function (aBoolean) {
     var self = this;
-    smalltalk.send(aStream, "_nextPutAll_", [smalltalk.send(self, "_printString", [])]);
+    try {
+        ($receiver = smalltalk.send(smalltalk.send(aBoolean, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean ? !$receiver ? function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}]);
+        return Boolean(self == true) == aBoolean;
+        return self;
+    } catch (e) {
+        if (e.name === "stReturn" && e.selector === "__eq") {
+            return e.fn();
+        }
+        throw e;
+    }
+},
+args: ["aBoolean"],
+source: unescape('%3D%20aBoolean%0A%09aBoolean%20class%20%3D%20self%20class%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09%3Creturn%20Boolean%28self%20%3D%3D%20true%29%20%3D%3D%20aBoolean%3E'),
+messageSends: ["ifFalse:", unescape("%3D"), "class"],
+referencedClasses: []
+}),
+smalltalk.Boolean);
+
+smalltalk.addMethod(
+unescape('_and_'),
+smalltalk.method({
+selector: unescape('and%3A'),
+category: 'controlling',
+fn: function (aBlock) {
+    var self = this;
+    return smalltalk.send(smalltalk.send(self, "__eq", [true]), "_ifTrue_ifFalse_", [aBlock, function () {return false;}]);
     return self;
 },
-args: ["aStream"],
-source: unescape('storeOn%3A%20aStream%0A%09aStream%20nextPutAll%3A%20self%20printString'),
-messageSends: ["nextPutAll:", "printString"],
+args: ["aBlock"],
+source: unescape('and%3A%20aBlock%0A%09%5Eself%20%3D%20true%0A%09%20%20%20%20ifTrue%3A%20aBlock%0A%09%20%20%20%20ifFalse%3A%20%5Bfalse%5D'),
+messageSends: ["ifTrue:ifFalse:", unescape("%3D")],
 referencedClasses: []
 }),
-smalltalk.Object);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_asJSONString'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('asJSONString'),
+selector: unescape('asJSON'),
 category: 'converting',
 fn: function (){
 var self=this;
-return smalltalk.send((smalltalk.JSON || JSON), "_stringify_", [smalltalk.send(self, "_asJSON", [])]);
+return self;
 return self;},
 args: [],
-source: unescape('asJSONString%0A%09%5EJSON%20stringify%3A%20self%20asJSON'),
-messageSends: ["stringify:", "asJSON"],
-referencedClasses: ["JSON"]
+source: unescape('asJSON%0A%09%5Eself'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Object);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_identityHash'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('identityHash'),
-category: 'accessing',
+selector: unescape('deepCopy'),
+category: 'copying',
 fn: function () {
     var self = this;
-    return self.identityHash || (self.identityHash = smalltalk.nextId());
+    return self;
     return self;
 },
 args: [],
-source: unescape('identityHash%0A%09%3Creturn%20self.identityHash%20%7C%7C%20%28self.identityHash%20%3D%20smalltalk.nextId%28%29%29%3B%3E'),
+source: unescape('deepCopy%0A%09%5Eself'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Object);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_isSymbol'),
+unescape('_ifFalse_'),
 smalltalk.method({
-selector: unescape('isSymbol'),
-category: 'testing',
-fn: function () {
+selector: unescape('ifFalse%3A'),
+category: 'controlling',
+fn: function (aBlock) {
     var self = this;
-    return false;
+    return smalltalk.send(self, "_ifTrue_ifFalse_", [function () {return nil;}, aBlock]);
     return self;
 },
-args: [],
-source: unescape('isSymbol%0A%09%5Efalse'),
-messageSends: [],
+args: ["aBlock"],
+source: unescape('ifFalse%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself%20ifTrue%3A%20%5B%5D%20ifFalse%3A%20aBlock'),
+messageSends: ["ifTrue:ifFalse:"],
 referencedClasses: []
 }),
-smalltalk.Object);
-
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_ifFalse_ifTrue_'),
 smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
-fn: function () {
+selector: unescape('ifFalse%3AifTrue%3A'),
+category: 'controlling',
+fn: function (aBlock, anotherBlock) {
     var self = this;
+    return smalltalk.send(self, "_ifTrue_ifFalse_", [anotherBlock, aBlock]);
     return self;
 },
-args: [],
-source: unescape('initialize%0A%09%22no%20op%22'),
-messageSends: [],
+args: ["aBlock", "anotherBlock"],
+source: unescape('ifFalse%3A%20aBlock%20ifTrue%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself%20ifTrue%3A%20anotherBlock%20ifFalse%3A%20aBlock'),
+messageSends: ["ifTrue:ifFalse:"],
 referencedClasses: []
 }),
-smalltalk.Object.klass);
+smalltalk.Boolean);
 
+smalltalk.addMethod(
+unescape('_ifTrue_'),
+smalltalk.method({
+selector: unescape('ifTrue%3A'),
+category: 'controlling',
+fn: function (aBlock) {
+    var self = this;
+    return smalltalk.send(self, "_ifTrue_ifFalse_", [aBlock, function () {return nil;}]);
+    return self;
+},
+args: ["aBlock"],
+source: unescape('ifTrue%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself%20ifTrue%3A%20aBlock%20ifFalse%3A%20%5B%5D'),
+messageSends: ["ifTrue:ifFalse:"],
+referencedClasses: []
+}),
+smalltalk.Boolean);
 
-smalltalk.addClass('Smalltalk', smalltalk.Object, [], 'Kernel-Objects');
-smalltalk.Smalltalk.comment=unescape('Smalltalk%20has%20only%20one%20instance%2C%20accessed%20with%20%60Smalltalk%20current%60.%20%0AIt%20represents%20the%20global%20JavaScript%20variable%20%60smalltalk%60%20declared%20in%20%60js/boot.js%60.%0A%0AThe%20%60smalltalk%60%20object%20holds%20all%20class%20and%20packages%20defined%20in%20the%20system.%0A%0A%23%23%20Classes%0A%0AClasses%20can%20be%20accessed%20using%20the%20following%20methods%3A%0A%0A-%20%60%23classes%60%20answers%20the%20full%20list%20of%20Smalltalk%20classes%20in%20the%20system%0A-%20%60%23at%3A%60%20answers%20a%20specific%20class%20of%20%60nil%60%0A%0A%23%23%20Packages%0A%0APackages%20can%20be%20accessed%20using%20the%20following%20methods%3A%0A%0A-%20%60%23packages%60%20answers%20the%20full%20list%20of%20packages%0A-%20%60%23packageAt%3A%60%20answers%20a%20specific%20class%20of%20%60nil%60%0A%0A__note%3A__%20classes%20and%20packages%20are%20accessed%20using%20strings%2C%20not%20symbols%0A%0A%23%23%20Parsing%0A%0AThe%20%60%23parse%3A%60%20method%20is%20used%20to%20parse%20Smalltalk%20source%20code.%20%0AIt%20requires%20the%20%60Compiler%60%20package%20and%20the%20%60js/parser.js%60%20parser%20file%20in%20order%20to%20work')
 smalltalk.addMethod(
-unescape('_classes'),
+unescape('_ifTrue_ifFalse_'),
 smalltalk.method({
-selector: unescape('classes'),
-category: 'accessing',
-fn: function () {
+selector: unescape('ifTrue%3AifFalse%3A'),
+category: 'controlling',
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    return self.classes();
+    if (self == true) {
+        return aBlock();
+    } else {
+        return anotherBlock();
+    }
     return self;
 },
-args: [],
-source: unescape('classes%0A%09%3Creturn%20self.classes%28%29%3E'),
+args: ["aBlock", "anotherBlock"],
+source: unescape('ifTrue%3A%20aBlock%20ifFalse%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3C%0A%09%20%20%20%20if%28self%20%3D%3D%20true%29%20%7B%0A%09%09return%20aBlock%28%29%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20anotherBlock%28%29%3B%0A%09%20%20%20%20%7D%0A%09%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_at_'),
+unescape('_not'),
 smalltalk.method({
-selector: unescape('at%3A'),
-category: 'accessing',
-fn: function (aString) {
+selector: unescape('not'),
+category: 'controlling',
+fn: function () {
     var self = this;
-    return self[aString];
+    return smalltalk.send(self, "__eq", [false]);
     return self;
 },
-args: ["aString"],
-source: unescape('at%3A%20aString%0A%09%3Creturn%20self%5BaString%5D%3E'),
-messageSends: [],
+args: [],
+source: unescape('not%0A%09%5Eself%20%3D%20false'),
+messageSends: [unescape("%3D")],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_removeClass_'),
+unescape('_or_'),
 smalltalk.method({
-selector: unescape('removeClass%3A'),
-category: 'classes',
-fn: function (aClass) {
+selector: unescape('or%3A'),
+category: 'controlling',
+fn: function (aBlock) {
     var self = this;
-    ($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_asString", []), "__comma", [unescape("%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21")])]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_asString", []), "__comma", [unescape("%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21")])]);}]);
-    smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_do_", [function (each) {return smalltalk.send(aClass, "_removeCompiledMethod_", [each]);}]);
-    smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_methodDictionary", []), "_values", []), "_do_", [function (each) {return smalltalk.send(smalltalk.send(aClass, "_class", []), "_removeCompiledMethod_", [each]);}]);
-    smalltalk.send(self, "_basicDelete_", [smalltalk.send(aClass, "_name", [])]);
+    return smalltalk.send(smalltalk.send(self, "__eq", [true]), "_ifTrue_ifFalse_", [function () {return true;}, aBlock]);
     return self;
 },
-args: ["aClass"],
-source: unescape('removeClass%3A%20aClass%0A%09aClass%20isMetaclass%20ifTrue%3A%20%5Bself%20error%3A%20aClass%20asString%2C%20%27%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21%27%5D.%0A%09aClass%20methodDictionary%20values%20do%3A%20%5B%3Aeach%20%7C%0A%09%09aClass%20removeCompiledMethod%3A%20each%5D.%0A%09aClass%20class%20methodDictionary%20values%20do%3A%20%5B%3Aeach%20%7C%0A%09%09aClass%20class%20removeCompiledMethod%3A%20each%5D.%0A%09self%20basicDelete%3A%20aClass%20name'),
-messageSends: ["ifTrue:", "isMetaclass", "error:", unescape("%2C"), "asString", "do:", "values", "methodDictionary", "removeCompiledMethod:", "class", "basicDelete:", "name"],
+args: ["aBlock"],
+source: unescape('or%3A%20aBlock%0A%09%5Eself%20%3D%20true%0A%09%20%20%20%20ifTrue%3A%20%5Btrue%5D%0A%09%20%20%20%20ifFalse%3A%20aBlock'),
+messageSends: ["ifTrue:ifFalse:", unescape("%3D")],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_basicParse_'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('basicParse%3A'),
-category: 'accessing',
-fn: function (aString) {
+selector: unescape('printString'),
+category: 'printing',
+fn: function () {
     var self = this;
-    return smalltalk.parser.parse(aString);
+    return self.toString();
     return self;
 },
-args: ["aString"],
-source: unescape('basicParse%3A%20aString%0A%09%3Creturn%20smalltalk.parser.parse%28aString%29%3E'),
+args: [],
+source: unescape('printString%0A%09%3Creturn%20self.toString%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_parse_'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('parse%3A'),
-category: 'accessing',
-fn: function (aString) {
+selector: unescape('shallowCopy'),
+category: 'copying',
+fn: function () {
     var self = this;
-    var result = nil;
-    smalltalk.send(self, "_try_catch_", [function () {return result = smalltalk.send(self, "_basicParse_", [aString]);}, function (ex) {return smalltalk.send(smalltalk.send(self, "_parseError_parsing_", [ex, aString]), "_signal", []);}]);
-    return result;
+    return self;
     return self;
 },
-args: ["aString"],
-source: unescape('parse%3A%20aString%0A%09%7C%20result%20%7C%20%0A%09self%20try%3A%20%5Bresult%20%3A%3D%20self%20basicParse%3A%20aString%5D%20catch%3A%20%5B%3Aex%20%7C%20%28self%20parseError%3A%20ex%20parsing%3A%20aString%29%20signal%5D.%0A%09%5Eresult'),
-messageSends: ["try:catch:", "basicParse:", "signal", "parseError:parsing:"],
+args: [],
+source: unescape('shallowCopy%0A%09%5Eself'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
 
 smalltalk.addMethod(
-unescape('_parseError_parsing_'),
+unescape('_%7C'),
 smalltalk.method({
-selector: unescape('parseError%3Aparsing%3A'),
-category: 'accessing',
-fn: function (anException, aString) {
+selector: unescape('%7C'),
+category: 'controlling',
+fn: function (aBoolean) {
     var self = this;
-    var row = nil;
-    var col = nil;
-    var message = nil;
-    var lines = nil;
-    var badLine = nil;
-    var code = nil;
-    row = anException.line;
-    col = anException.column;
-    message = anException.message;
-    lines = smalltalk.send(aString, "_lines", []);
-    badLine = smalltalk.send(lines, "_at_", [row]);
-    badLine = smalltalk.send(smalltalk.send(smalltalk.send(badLine, "_copyFrom_to_", [1, ($receiver = col).klass === smalltalk.Number ? $receiver - 1 : smalltalk.send($receiver, "__minus", [1])]), "__comma", [unescape("%20%3D%3D%3D%3E")]), "__comma", [smalltalk.send(badLine, "_copyFrom_to_", [col, smalltalk.send(badLine, "_size", [])])]);
-    smalltalk.send(lines, "_at_put_", [row, badLine]);
-    code = smalltalk.send(smalltalk.String || String, "_streamContents_", [function (s) {return smalltalk.send(lines, "_withIndexDo_", [function (l, i) {return smalltalk.send(s, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(i, "_asString", []), "__comma", [": "]), "__comma", [l]), "__comma", [smalltalk.send(smalltalk.String || String, "_lf", [])])]);}]);}]);
-    return smalltalk.send(smalltalk.send(smalltalk.Error || Error, "_new", []), "_messageText_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send("Parse error on line ", "__comma", [row]), "__comma", [" column "]), "__comma", [col]), "__comma", [" : "]), "__comma", [message]), "__comma", [unescape("%20Below%20is%20code%20with%20line%20numbers%20and%20%3D%3D%3D%3E%20marker%20inserted%3A")]), "__comma", [smalltalk.send(smalltalk.String || String, "_lf", [])]), "__comma", [code])]);
+    if (self == true) {
+        return true;
+    } else {
+        return aBoolean;
+    }
     return self;
 },
-args: ["anException", "aString"],
-source: unescape('parseError%3A%20anException%20parsing%3A%20aString%0A%09%7C%20row%20col%20message%20lines%20badLine%20code%20%7C%0A%09%3Crow%20%3D%20anException.line%3B%0A%09col%20%3D%20anException.column%3B%0A%09message%20%3D%20anException.message%3B%3E.%0A%09lines%20%3A%3D%20aString%20lines.%0A%09badLine%20%3A%3D%20lines%20at%3A%20row.%0A%09badLine%20%3A%3D%20%28badLine%20copyFrom%3A%201%20to%3A%20col%20-%201%29%2C%20%27%20%3D%3D%3D%3E%27%2C%20%28badLine%20copyFrom%3A%20%20col%20to%3A%20badLine%20size%29.%0A%09lines%20at%3A%20row%20put%3A%20badLine.%0A%09code%20%3A%3D%20String%20streamContents%3A%20%5B%3As%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lines%20withIndexDo%3A%20%5B%3Al%20%3Ai%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20nextPutAll%3A%20i%20asString%2C%20%27%3A%20%27%2C%20l%2C%20String%20lf%5D%5D.%0A%09%5E%20Error%20new%20messageText%3A%20%28%27Parse%20error%20on%20line%20%27%20%2C%20row%20%2C%20%27%20column%20%27%20%2C%20col%20%2C%20%27%20%3A%20%27%20%2C%20message%20%2C%20%27%20Below%20is%20code%20with%20line%20numbers%20and%20%3D%3D%3D%3E%20marker%20inserted%3A%27%20%2C%20String%20lf%2C%20code%29'),
-messageSends: ["lines", "at:", unescape("%2C"), "copyFrom:to:", unescape("-"), "size", "at:put:", "streamContents:", "withIndexDo:", "nextPutAll:", "asString", "lf", "messageText:", "new"],
-referencedClasses: ["String", "Error"]
+args: ["aBoolean"],
+source: unescape('%7C%20aBoolean%0A%09%3C%0A%09%20%20%20%20if%28self%20%3D%3D%20true%29%20%7B%0A%09%09return%20true%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20aBoolean%3B%0A%09%20%20%20%20%7D%0A%09%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Boolean);
+
+
 
+smalltalk.addClass('Date', smalltalk.Object, [], 'Kernel-Objects');
+smalltalk.Date.comment=unescape('The%20Date%20class%20is%20used%20to%20work%20with%20dates%20and%20times.%20Therefore%20%60Date%20today%60%20and%20%60Date%20now%60%20are%20both%20valid%20in%0AAmber%20and%20answer%20the%20same%20date%20object.%0A%0ADate%20wraps%20the%20%60Date%28%29%60%20JavaScript%20constructor%2C%20and%20Smalltalk%20date%20objects%20are%20JavaScript%20date%20objects.')
 smalltalk.addMethod(
-unescape('_packages'),
+unescape('__plus'),
 smalltalk.method({
-selector: unescape('packages'),
-category: 'packages',
-fn: function () {
+selector: unescape('+'),
+category: 'arithmetic',
+fn: function (aDate) {
     var self = this;
-    return self.packages.all();
+    return self + aDate;
     return self;
 },
-args: [],
-source: unescape('packages%0A%09%22Return%20all%20Package%20instances%20in%20the%20system.%22%0A%0A%09%3Creturn%20self.packages.all%28%29%3E'),
+args: ["aDate"],
+source: unescape('+%20aDate%0A%09%3Creturn%20self%20+%20aDate%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_packageAt_'),
+unescape('__minus'),
 smalltalk.method({
-selector: unescape('packageAt%3A'),
-category: 'packages',
-fn: function (packageName) {
+selector: unescape('-'),
+category: 'arithmetic',
+fn: function (aDate) {
     var self = this;
-    return self.packages[packageName];
+    return self - aDate;
     return self;
 },
-args: ["packageName"],
-source: unescape('packageAt%3A%20packageName%0A%20%20%20%20%20%20%20%3Creturn%20self.packages%5BpackageName%5D%3E'),
+args: ["aDate"],
+source: unescape('-%20aDate%0A%09%3Creturn%20self%20-%20aDate%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_packageAt_ifAbsent_'),
+unescape('__lt'),
 smalltalk.method({
-selector: unescape('packageAt%3AifAbsent%3A'),
-category: 'packages',
-fn: function (packageName, aBlock) {
+selector: unescape('%3C'),
+category: 'comparing',
+fn: function (aDate) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_packageAt_", [packageName]), "_ifNil_", [aBlock]);
+    return self < aDate;
     return self;
 },
-args: ["packageName", "aBlock"],
-source: unescape('packageAt%3A%20packageName%20ifAbsent%3A%20aBlock%0A%20%20%20%20%20%20%20%5E%28self%20packageAt%3A%20packageName%29%20ifNil%3A%20aBlock'),
-messageSends: ["ifNil:", "packageAt:"],
+args: ["aDate"],
+source: unescape('%3C%20aDate%0A%09%3Creturn%20self%20%3C%20aDate%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_createPackage_'),
+unescape('__lt_eq'),
 smalltalk.method({
-selector: unescape('createPackage%3A'),
-category: 'private',
-fn: function (packageName) {
+selector: unescape('%3C%3D'),
+category: 'comparing',
+fn: function (aDate) {
     var self = this;
-    return smalltalk.addPackage(packageName, nil);
+    return self <= aDate;
     return self;
 },
-args: ["packageName"],
-source: unescape('createPackage%3A%20packageName%0A%09%22Create%20and%20bind%20a%20new%20package%20with%20given%20name%20and%20return%20it.%22%0A%0A%20%20%20%20%20%20%3Creturn%20smalltalk.addPackage%28packageName%2C%20nil%29%3E'),
+args: ["aDate"],
+source: unescape('%3C%3D%20aDate%0A%09%3Creturn%20self%20%3C%3D%20aDate%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_deletePackage_'),
+unescape('__gt'),
 smalltalk.method({
-selector: unescape('deletePackage%3A'),
-category: 'private',
-fn: function (packageName) {
+selector: unescape('%3E'),
+category: 'comparing',
+fn: function (aDate) {
     var self = this;
-    delete smalltalk.packages[packageName];
+    return self > aDate;
     return self;
 },
-args: ["packageName"],
-source: unescape('deletePackage%3A%20packageName%0A%09%22Deletes%20a%20package%20by%20deleting%20its%20binding%2C%20but%20does%20not%20check%20if%20it%20contains%20classes%20etc.%0A%09To%20remove%20a%20package%2C%20use%20%23removePackage%20instead.%22%0A%0A%20%20%20%20%20%20%20%3Cdelete%20smalltalk.packages%5BpackageName%5D%3E'),
+args: ["aDate"],
+source: unescape('%3E%20aDate%0A%09%3Creturn%20self%20%3E%3E%20aDate%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_removePackage_'),
+unescape('__gt_eq'),
 smalltalk.method({
-selector: unescape('removePackage%3A'),
-category: 'packages',
-fn: function (packageName) {
+selector: unescape('%3E%3D'),
+category: 'comparing',
+fn: function (aDate) {
     var self = this;
-    var pkg = nil;
-    pkg = smalltalk.send(self, "_packageAt_ifAbsent_", [packageName, function () {return smalltalk.send(self, "_error_", [smalltalk.send("Missing package: ", "__comma", [packageName])]);}]);
-    smalltalk.send(smalltalk.send(pkg, "_classes", []), "_do_", [function (each) {return smalltalk.send(self, "_removeClass_", [each]);}]);
-    smalltalk.send(self, "_deletePackage_", [packageName]);
+    return self >= aDate;
     return self;
 },
-args: ["packageName"],
-source: unescape('removePackage%3A%20packageName%0A%09%22Removes%20a%20package%20and%20all%20its%20classes.%22%0A%0A%09%7C%20pkg%20%7C%0A%09pkg%20%3A%3D%20self%20packageAt%3A%20packageName%20ifAbsent%3A%20%5Bself%20error%3A%20%27Missing%20package%3A%20%27%2C%20packageName%5D.%0A%09pkg%20classes%20do%3A%20%5B%3Aeach%20%7C%0A%20%20%20%20%20%20%20%20%09self%20removeClass%3A%20each%5D.%0A%09self%20deletePackage%3A%20packageName'),
-messageSends: ["packageAt:ifAbsent:", "error:", unescape("%2C"), "do:", "classes", "removeClass:", "deletePackage:"],
+args: ["aDate"],
+source: unescape('%3E%3D%20aDate%0A%09%3Creturn%20self%20%3E%3E%3D%20aDate%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_renamePackage_to_'),
+unescape('_asDateString'),
 smalltalk.method({
-selector: unescape('renamePackage%3Ato%3A'),
-category: 'packages',
-fn: function (packageName, newName) {
+selector: unescape('asDateString'),
+category: 'converting',
+fn: function () {
     var self = this;
-    var pkg = nil;
-    pkg = smalltalk.send(self, "_packageAt_ifAbsent_", [packageName, function () {return smalltalk.send(self, "_error_", [smalltalk.send("Missing package: ", "__comma", [packageName])]);}]);
-    ($receiver = smalltalk.send(self, "_packageAt_", [newName])) != nil &&
-        $receiver != undefined ? function () {return smalltalk.send(self, "_error_", [smalltalk.send("Already exists a package called: ", "__comma", [newName])]);}() : nil;
-    smalltalk.packages[newName] = smalltalk.packages[packageName];
-    smalltalk.send(pkg, "_name_", [newName]);
-    smalltalk.send(self, "_deletePackage_", [packageName]);
+    return self.toDateString();
     return self;
 },
-args: ["packageName", "newName"],
-source: unescape('renamePackage%3A%20packageName%20to%3A%20newName%0A%09%22Rename%20a%20package.%22%0A%0A%09%7C%20pkg%20%7C%0A%09pkg%20%3A%3D%20self%20packageAt%3A%20packageName%20ifAbsent%3A%20%5Bself%20error%3A%20%27Missing%20package%3A%20%27%2C%20packageName%5D.%0A%09%28self%20packageAt%3A%20newName%29%20ifNotNil%3A%20%5Bself%20error%3A%20%27Already%20exists%20a%20package%20called%3A%20%27%2C%20newName%5D.%0A%09%3Csmalltalk.packages%5BnewName%5D%20%3D%20smalltalk.packages%5BpackageName%5D%3E.%0A%09pkg%20name%3A%20newName.%0A%09self%20deletePackage%3A%20packageName.'),
-messageSends: ["packageAt:ifAbsent:", "error:", unescape("%2C"), "ifNotNil:", "packageAt:", "name:", "deletePackage:"],
+args: [],
+source: unescape('asDateString%0A%09%3Creturn%20self.toDateString%28%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_reservedWords'),
+unescape('_asLocaleString'),
 smalltalk.method({
-selector: unescape('reservedWords'),
-category: 'accessing',
+selector: unescape('asLocaleString'),
+category: 'converting',
 fn: function () {
     var self = this;
-    return self.reservedWords;
+    return self.toLocaleString();
     return self;
 },
 args: [],
-source: unescape('reservedWords%0A%09%22JavaScript%20reserved%20words%22%0A%09%3Creturn%20self.reservedWords%3E'),
+source: unescape('asLocaleString%0A%09%3Creturn%20self.toLocaleString%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_createPackage_properties_'),
+unescape('_asMilliseconds'),
 smalltalk.method({
-selector: unescape('createPackage%3Aproperties%3A'),
-category: 'private',
-fn: function (packageName, aDict) {
+selector: unescape('asMilliseconds'),
+category: 'converting',
+fn: function () {
     var self = this;
-    var object = nil;
-    object = {};
-    smalltalk.send(aDict, "_keysAndValuesDo_", [function (key, value) {return object[key] = value;}]);
-    return smalltalk.addPackage(packageName, object);
+    return smalltalk.send(self, "_time", []);
     return self;
 },
-args: ["packageName", "aDict"],
-source: unescape('createPackage%3A%20packageName%20properties%3A%20aDict%0A%09%22Create%20and%20bind%20a%20new%20package%20with%20given%20name%20and%20return%20it.%22%0A%0A%09%7C%20object%20%7C%0A%09%3Cobject%20%3D%20%7B%7D%3B%3E.%0A%09aDict%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%09%3Cobject%5Bkey%5D%20%3D%20value%3E.%0A%09%5D.%0A%20%20%20%20%20%20%20%3Creturn%20smalltalk.addPackage%28packageName%2C%20object%29%3E'),
-messageSends: ["keysAndValuesDo:"],
+args: [],
+source: unescape('asMilliseconds%0A%09%5Eself%20time'),
+messageSends: ["time"],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_readJSObject_'),
+unescape('_asNumber'),
 smalltalk.method({
-selector: unescape('readJSObject%3A'),
-category: 'accessing',
-fn: function (anObject) {
+selector: unescape('asNumber'),
+category: 'converting',
+fn: function () {
     var self = this;
-    return self.readJSObject(anObject);
+    return smalltalk.send(self, "_asMilliseconds", []);
     return self;
 },
-args: ["anObject"],
-source: unescape('readJSObject%3A%20anObject%0A%09%3Creturn%20self.readJSObject%28anObject%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('asNumber%0A%09%5Eself%20asMilliseconds'),
+messageSends: ["asMilliseconds"],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_send_to_arguments_'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('send%3Ato%3Aarguments%3A'),
-category: 'accessing',
-fn: function (aSelector, anObject, aCollection) {
+selector: unescape('asString'),
+category: 'converting',
+fn: function () {
     var self = this;
-    var selector = nil;
-    selector = smalltalk.send(smalltalk.send(aSelector, "_asString", []), "_asSelector", []);
-    self.send(anObject, selector, aCollection);
+    return self.toString();
     return self;
 },
-args: ["aSelector", "anObject", "aCollection"],
-source: unescape('send%3A%20aSelector%20to%3A%20anObject%20arguments%3A%20aCollection%0A%09%7C%20selector%20%7C%0A%09selector%20%3A%3D%20aSelector%20asString%20asSelector.%0A%09%3Cself.send%28anObject%2C%20selector%2C%20aCollection%29%3E'),
-messageSends: ["asSelector", "asString"],
+args: [],
+source: unescape('asString%0A%09%3Creturn%20self.toString%28%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk);
-
+smalltalk.Date);
 
-smalltalk.Smalltalk.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_current'),
+unescape('_asTimeString'),
 smalltalk.method({
-selector: unescape('current'),
-category: 'accessing',
+selector: unescape('asTimeString'),
+category: 'converting',
 fn: function () {
     var self = this;
-    return smalltalk;
+    return self.toTimeString();
     return self;
 },
 args: [],
-source: unescape('current%0A%09%3Creturn%20smalltalk%3E'),
+source: unescape('asTimeString%0A%09%3Creturn%20self.toTimeString%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Smalltalk.klass);
-
+smalltalk.Date);
 
-smalltalk.addClass('Package', smalltalk.Object, ['commitPathJs', 'commitPathSt'], 'Kernel-Objects');
-smalltalk.Package.comment=unescape('A%20Package%20is%20similar%20to%20a%20%22class%20category%22%20typically%20found%20in%20other%20Smalltalks%20like%20Pharo%20or%20Squeak.%20Amber%20does%20not%20have%20class%20categories%20anymore%2C%20it%20had%20in%20the%20beginning%20but%20now%20each%20class%20in%20the%20system%20knows%20which%20package%20it%20belongs%20to.%0A%0AA%20Package%20has%20a%20name%2C%20an%20Array%20of%20%22requires%22%2C%20a%20comment%20and%20a%20Dictionary%20with%20other%20optional%20key%20value%20attributes.%20A%20Package%20can%20also%20be%20queried%20for%20its%20classes%2C%20but%20it%20will%20then%20resort%20to%20a%20reverse%20scan%20of%20all%20classes%20to%20find%20them.%0APackages%20are%20manipulated%20through%20%22Smalltalk%20current%22%2C%20like%20for%20example%20finding%20one%20based%20on%20a%20name%3A%0A%0A%09Smalltalk%20current%20packageAt%3A%20%27Kernel%27%0A%0A...but%20you%20can%20also%20use%3A%0A%0A%09Package%20named%3A%20%27Kernel%27%0A%0AA%20Package%20differs%20slightly%20from%20a%20Monticello%20package%20which%20can%20span%20multiple%20class%20categories%20using%20a%20naming%20convention%20based%20on%20hyphenation.%20But%20just%20as%20in%20Monticello%20a%20Package%20supports%20%22class%20extensions%22%20so%20a%20Package%0Acan%20define%20behaviors%20in%20foreign%20classes%20using%20a%20naming%20convention%20for%20method%20categories%20where%20the%20category%20starts%20with%20an%20asterisk%20and%20then%20the%20name%20of%20the%20owning%20package%20follows.%20This%20can%20easily%20be%20seen%20in%20for%20example%20class%0AString%20where%20the%20method%20category%20%22*IDE%22%20defines%20%23inspectOn%3A%20which%20thus%20is%20a%20method%20belonging%20to%20the%20IDE%20package.%0A%0AYou%20can%20fetch%20a%20package%20from%20the%20server%3A%0A%0A%09Package%20fetch%3A%20%27Additional-Examples%27')
 smalltalk.addMethod(
-unescape('_name'),
+unescape('_day'),
 smalltalk.method({
-selector: unescape('name'),
+selector: unescape('day'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return self.pkgName;
+    return smalltalk.send(self, "_dayOfWeek", []);
     return self;
 },
 args: [],
-source: unescape('name%0A%09%3Creturn%20self.pkgName%3E'),
-messageSends: [],
+source: unescape('day%0A%09%5Eself%20dayOfWeek'),
+messageSends: ["dayOfWeek"],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_name_'),
+unescape('_day_'),
 smalltalk.method({
-selector: unescape('name%3A'),
+selector: unescape('day%3A'),
 category: 'accessing',
-fn: function (aString) {
+fn: function (aNumber) {
     var self = this;
-    self.pkgName = aString;
+    smalltalk.send(self, "_day_", [aNumber]);
     return self;
 },
-args: ["aString"],
-source: unescape('name%3A%20aString%0A%09%3Cself.pkgName%20%3D%20aString%3E'),
-messageSends: [],
+args: ["aNumber"],
+source: unescape('day%3A%20aNumber%0A%09self%20day%3A%20aNumber'),
+messageSends: ["day:"],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_classes'),
+unescape('_dayOfMonth'),
 smalltalk.method({
-selector: unescape('classes'),
-category: 'classes',
+selector: unescape('dayOfMonth'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_classes", []), "_select_", [function (c) {return smalltalk.send(smalltalk.send(c, "_package", []), "__eq_eq", [self]);}]);
+    return self.getDate();
     return self;
 },
 args: [],
-source: unescape('classes%0A%09%22We%20need%20to%20do%20a%20reverse%20scan.%22%0A%09%5ESmalltalk%20current%20classes%20select%3A%20%5B%3Ac%20%7C%20c%20package%20%3D%3D%20self%5D'),
-messageSends: ["select:", "classes", "current", unescape("%3D%3D"), "package"],
-referencedClasses: ["Smalltalk"]
+source: unescape('dayOfMonth%0A%09%3Creturn%20self.getDate%28%29%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_dayOfMonth_'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
-fn: function () {
+selector: unescape('dayOfMonth%3A'),
+category: 'accessing',
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(self, "_name", []);
+    self.setDate(aNumber);
     return self;
 },
-args: [],
-source: unescape('printString%0A%09%5Eself%20name'),
-messageSends: ["name"],
+args: ["aNumber"],
+source: unescape('dayOfMonth%3A%20aNumber%0A%09%3Cself.setDate%28aNumber%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_dependencies'),
+unescape('_dayOfWeek'),
 smalltalk.method({
-selector: unescape('dependencies'),
+selector: unescape('dayOfWeek'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_propertyAt_ifAbsent_", ["dependencies", function () {return [];}]);
+    return self.getDay() + 1;
     return self;
 },
 args: [],
-source: unescape('dependencies%0A%09%5Eself%20propertyAt%3A%20%27dependencies%27%20ifAbsent%3A%20%5B%23%28%29%5D'),
-messageSends: ["propertyAt:ifAbsent:"],
+source: unescape('dayOfWeek%0A%09%3Creturn%20self.getDay%28%29%20+%201%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_dependencies_'),
+unescape('_dayOfWeek_'),
 smalltalk.method({
-selector: unescape('dependencies%3A'),
+selector: unescape('dayOfWeek%3A'),
 category: 'accessing',
-fn: function (anArray) {
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(self, "_propertyAt_put_", ["dependencies", anArray]);
+    return self.setDay(aNumber - 1);
     return self;
 },
-args: ["anArray"],
-source: unescape('dependencies%3A%20anArray%0A%09%5Eself%20propertyAt%3A%20%27dependencies%27%20put%3A%20anArray'),
-messageSends: ["propertyAt:put:"],
+args: ["aNumber"],
+source: unescape('dayOfWeek%3A%20aNumber%0A%09%3Creturn%20self.setDay%28aNumber%20-%201%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_properties'),
+unescape('_hours'),
 smalltalk.method({
-selector: unescape('properties'),
+selector: unescape('hours'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_readJSObject_", [smalltalk.send(self, "_basicAt_", ["properties"])]);
+    return self.getHours();
     return self;
 },
 args: [],
-source: unescape('properties%0A%09%5ESmalltalk%20current%20readJSObject%3A%20%28self%20basicAt%3A%20%27properties%27%29'),
-messageSends: ["readJSObject:", "current", "basicAt:"],
-referencedClasses: ["Smalltalk"]
+source: unescape('hours%0A%09%3Creturn%20self.getHours%28%29%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_propertiesAsJSON'),
+unescape('_hours_'),
 smalltalk.method({
-selector: unescape('propertiesAsJSON'),
-category: 'private',
+selector: unescape('hours%3A'),
+category: 'accessing',
+fn: function (aNumber) {
+    var self = this;
+    self.setHours(aNumber);
+    return self;
+},
+args: ["aNumber"],
+source: unescape('hours%3A%20aNumber%0A%09%3Cself.setHours%28aNumber%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Date);
+
+smalltalk.addMethod(
+unescape('_milliseconds'),
+smalltalk.method({
+selector: unescape('milliseconds'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return JSON.stringify(self.properties);
+    return self.getMilliseconds();
     return self;
 },
 args: [],
-source: unescape('propertiesAsJSON%0A%09%3Creturn%20JSON.stringify%28self.properties%29%3E'),
+source: unescape('milliseconds%0A%09%3Creturn%20self.getMilliseconds%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_properties_'),
+unescape('_milliseconds_'),
 smalltalk.method({
-selector: unescape('properties%3A'),
+selector: unescape('milliseconds%3A'),
 category: 'accessing',
-fn: function (aDict) {
+fn: function (aNumber) {
     var self = this;
-    var object = nil;
-    object = {};
-    smalltalk.send(aDict, "_keysAndValuesDo_", [function (key, value) {return object[key] = value;}]);
-    return self.properties = object;
+    self.setMilliseconds(aNumber);
     return self;
 },
-args: ["aDict"],
-source: unescape('properties%3A%20aDict%0A%09%22We%20store%20it%20as%20a%20javascript%20object.%22%0A%09%0A%09%7C%20object%20%7C%0A%09%3Cobject%20%3D%20%7B%7D%3B%3E.%0A%09aDict%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%09%3Cobject%5Bkey%5D%20%3D%20value%3E.%0A%09%5D.%0A%09%3Creturn%20self.properties%20%3D%20object%3E'),
-messageSends: ["keysAndValuesDo:"],
+args: ["aNumber"],
+source: unescape('milliseconds%3A%20aNumber%0A%09%3Cself.setMilliseconds%28aNumber%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_jsProperties'),
+unescape('_minutes'),
 smalltalk.method({
-selector: unescape('jsProperties'),
-category: 'private',
+selector: unescape('minutes'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return self.properties;
+    return self.getMinutes();
     return self;
 },
 args: [],
-source: unescape('jsProperties%0A%09%3Creturn%20self.properties%3E'),
+source: unescape('minutes%0A%09%3Creturn%20self.getMinutes%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_jsProperties_'),
+unescape('_minutes_'),
 smalltalk.method({
-selector: unescape('jsProperties%3A'),
-category: 'private',
-fn: function (aJSObject) {
+selector: unescape('minutes%3A'),
+category: 'accessing',
+fn: function (aNumber) {
     var self = this;
-    return self.properties = aJSObject;
+    self.setMinutes(aNumber);
     return self;
 },
-args: ["aJSObject"],
-source: unescape('jsProperties%3A%20aJSObject%0A%09%3Creturn%20self.properties%20%3D%20aJSObject%3E'),
+args: ["aNumber"],
+source: unescape('minutes%3A%20aNumber%0A%09%3Cself.setMinutes%28aNumber%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_propertyAt_'),
+unescape('_month'),
 smalltalk.method({
-selector: unescape('propertyAt%3A'),
-category: 'properties',
-fn: function (key) {
+selector: unescape('month'),
+category: 'accessing',
+fn: function () {
     var self = this;
-    return self.properties[key];
+    return self.getMonth() + 1;
     return self;
 },
-args: ["key"],
-source: unescape('propertyAt%3A%20key%0A%0A%09%3Creturn%20self.properties%5Bkey%5D%3E'),
+args: [],
+source: unescape('month%0A%09%3Creturn%20self.getMonth%28%29%20+%201%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_propertyAt_put_'),
+unescape('_month_'),
 smalltalk.method({
-selector: unescape('propertyAt%3Aput%3A'),
-category: 'properties',
-fn: function (key, value) {
+selector: unescape('month%3A'),
+category: 'accessing',
+fn: function (aNumber) {
     var self = this;
-    return self.properties[key] = value;
+    self.setMonth(aNumber - 1);
     return self;
 },
-args: ["key", "value"],
-source: unescape('propertyAt%3A%20key%20put%3A%20value%0A%0A%09%3Creturn%20self.properties%5Bkey%5D%20%3D%20value%3E'),
+args: ["aNumber"],
+source: unescape('month%3A%20aNumber%0A%09%3Cself.setMonth%28aNumber%20-%201%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_propertyAt_ifAbsent_'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('propertyAt%3AifAbsent%3A'),
-category: 'properties',
-fn: function (key, block) {
+selector: unescape('printString'),
+category: 'printing',
+fn: function () {
     var self = this;
-    return ($receiver = smalltalk.send(self, "_propertyAt_", [key])) == nil ||
-        $receiver == undefined ? function () {return smalltalk.send(block, "_value", []);}() : $receiver;
+    return smalltalk.send(self, "_asString", []);
     return self;
 },
-args: ["key", "block"],
-source: unescape('propertyAt%3A%20key%20ifAbsent%3A%20block%0A%0A%09%5E%28self%20propertyAt%3A%20key%29%20ifNil%3A%20%5Bblock%20value%5D'),
-messageSends: ["ifNil:", "propertyAt:", "value"],
+args: [],
+source: unescape('printString%0A%09%5Eself%20asString'),
+messageSends: ["asString"],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_commitPathJs'),
+unescape('_seconds'),
 smalltalk.method({
-selector: unescape('commitPathJs'),
+selector: unescape('seconds'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return ($receiver = self['@commitPathJs']) == nil ||
-        $receiver == undefined ? function () {return smalltalk.send(smalltalk.send(self, "_class", []), "_defaultCommitPathJs", []);}() : $receiver;
+    return self.getSeconds();
     return self;
 },
 args: [],
-source: unescape('commitPathJs%0A%09%5E%20commitPathJs%20ifNil%3A%20%5Bself%20class%20defaultCommitPathJs%5D'),
-messageSends: ["ifNil:", "defaultCommitPathJs", "class"],
+source: unescape('seconds%0A%09%3Creturn%20self.getSeconds%28%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_commitPathJs_'),
+unescape('_seconds_'),
 smalltalk.method({
-selector: unescape('commitPathJs%3A'),
+selector: unescape('seconds%3A'),
 category: 'accessing',
-fn: function (aString) {
+fn: function (aNumber) {
     var self = this;
-    self['@commitPathJs'] = aString;
+    self.setSeconds(aNumber);
     return self;
 },
-args: ["aString"],
-source: unescape('commitPathJs%3A%20aString%0A%09commitPathJs%A0%3A%3D%20aString'),
+args: ["aNumber"],
+source: unescape('seconds%3A%20aNumber%0A%09%3Cself.setSeconds%28aNumber%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_commitPathSt'),
+unescape('_time'),
 smalltalk.method({
-selector: unescape('commitPathSt'),
+selector: unescape('time'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return ($receiver = self['@commitPathSt']) == nil ||
-        $receiver == undefined ? function () {return smalltalk.send(smalltalk.send(self, "_class", []), "_defaultCommitPathSt", []);}() : $receiver;
+    return self.getTime();
     return self;
 },
 args: [],
-source: unescape('commitPathSt%0A%09%5E%20commitPathSt%20ifNil%3A%20%5Bself%20class%20defaultCommitPathSt%5D'),
-messageSends: ["ifNil:", "defaultCommitPathSt", "class"],
+source: unescape('time%0A%09%3Creturn%20self.getTime%28%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_commitPathSt_'),
+unescape('_time_'),
 smalltalk.method({
-selector: unescape('commitPathSt%3A'),
+selector: unescape('time%3A'),
 category: 'accessing',
-fn: function (aString) {
+fn: function (aNumber) {
     var self = this;
-    self['@commitPathSt'] = aString;
+    self.setTime(aNumber);
     return self;
 },
-args: ["aString"],
-source: unescape('commitPathSt%3A%20aString%0A%09commitPathSt%A0%3A%3D%20aString'),
+args: ["aNumber"],
+source: unescape('time%3A%20aNumber%0A%09%3Cself.setTime%28aNumber%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_sortedClasses'),
+unescape('_year'),
 smalltalk.method({
-selector: unescape('sortedClasses'),
-category: 'classes',
+selector: unescape('year'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_classes", []), "_inject_into_", [[], function (acc, each) {return ($receiver = smalltalk.send(acc, "_isEmpty", [])).klass === smalltalk.Boolean ? $receiver ? function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}() : function () {return ($receiver = smalltalk.send(acc, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean ? $receiver ? function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}() : function () {return smalltalk.send([each], "__comma", [acc]);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}, function () {return smalltalk.send([each], "__comma", [acc]);}]);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}, function () {return ($receiver = smalltalk.send(acc, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean ? $receiver ? function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}() : function () {return smalltalk.send([each], "__comma", [acc]);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function ($rec) {smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);}(acc);}, function () {return smalltalk.send([each], "__comma", [acc]);}]);}]);}]);
+    return self.getFullYear();
     return self;
 },
 args: [],
-source: unescape('sortedClasses%0A%09%22Answer%20all%20classes%20in%20the%20receiver%2C%20sorted%20by%20superclass/subclasses%22%0A%09%0A%09%5Eself%20classes%20inject%3A%20%23%28%29%20into%3A%20%5B%3Aacc%20%3Aeach%20%7C%20%0A%09%09acc%20isEmpty%20%0A%09%09%09ifTrue%3A%20%5Bacc%20add%3A%20each%3B%20yourself%5D%0A%09%09%09ifFalse%3A%20%5B%28acc%20includes%3A%20each%20superclass%29%0A%09%09%09%09ifTrue%3A%20%5Bacc%20add%3A%20each%3B%20yourself%5D%0A%09%09%09%09ifFalse%3A%20%5B%7Beach%7D%2C%20acc%5D%5D%5D'),
-messageSends: ["inject:into:", "classes", "ifTrue:ifFalse:", "isEmpty", "add:", "yourself", "includes:", "superclass", unescape("%2C")],
+source: unescape('year%0A%09%3Creturn%20self.getFullYear%28%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package);
-
+smalltalk.Date);
 
-smalltalk.Package.klass.iVarNames = ['defaultCommitPathJs','defaultCommitPathSt'];
 smalltalk.addMethod(
-unescape('_named_'),
+unescape('_year_'),
 smalltalk.method({
-selector: unescape('named%3A'),
-category: 'not yet classified',
-fn: function (aPackageName) {
+selector: unescape('year%3A'),
+category: 'accessing',
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_packageAt_", [aPackageName]);
+    self.setFullYear(aNumber);
     return self;
 },
-args: ["aPackageName"],
-source: unescape('named%3A%20aPackageName%0A%0A%09%5ESmalltalk%20current%20packageAt%3A%20aPackageName'),
-messageSends: ["packageAt:", "current"],
-referencedClasses: ["Smalltalk"]
+args: ["aNumber"],
+source: unescape('year%3A%20aNumber%0A%09%3Cself.setFullYear%28aNumber%29%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
+
 
 smalltalk.addMethod(
-unescape('_named_ifAbsent_'),
+unescape('_fromMilliseconds_'),
 smalltalk.method({
-selector: unescape('named%3AifAbsent%3A'),
-category: 'not yet classified',
-fn: function (aPackageName, aBlock) {
+selector: unescape('fromMilliseconds%3A'),
+category: 'instance creation',
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_packageAt_ifAbsent_", [aPackageName, aBlock]);
+    return smalltalk.send(self, "_new_", [aNumber]);
     return self;
 },
-args: ["aPackageName", "aBlock"],
-source: unescape('named%3A%20aPackageName%20ifAbsent%3A%20aBlock%0A%0A%09%5ESmalltalk%20current%20packageAt%3A%20aPackageName%20ifAbsent%3A%20aBlock'),
-messageSends: ["packageAt:ifAbsent:", "current"],
-referencedClasses: ["Smalltalk"]
+args: ["aNumber"],
+source: unescape('fromMilliseconds%3A%20aNumber%0A%09%5Eself%20new%3A%20aNumber'),
+messageSends: ["new:"],
+referencedClasses: []
 }),
-smalltalk.Package.klass);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_defaultCommitPathJs'),
+unescape('_fromSeconds_'),
 smalltalk.method({
-selector: unescape('defaultCommitPathJs'),
-category: 'commit paths',
-fn: function () {
+selector: unescape('fromSeconds%3A'),
+category: 'instance creation',
+fn: function (aNumber) {
     var self = this;
-    return ($receiver = self['@defaultCommitPathJs']) == nil ||
-        $receiver == undefined ? function () {return self['@defaultCommitPathJs'] = "js";}() : $receiver;
+    return smalltalk.send(self, "_fromMilliseconds_", [($receiver = aNumber).klass === smalltalk.Number ? $receiver * 1000 : smalltalk.send($receiver, "__star", [1000])]);
     return self;
 },
-args: [],
-source: unescape('defaultCommitPathJs%0A%09%5E%20defaultCommitPathJs%20ifNil%3A%20%5B%20defaultCommitPathJs%20%3A%3D%20%27js%27%5D'),
-messageSends: ["ifNil:"],
+args: ["aNumber"],
+source: unescape('fromSeconds%3A%20aNumber%0A%09%5Eself%20fromMilliseconds%3A%20aNumber%20*%201000'),
+messageSends: ["fromMilliseconds:", unescape("*")],
 referencedClasses: []
 }),
-smalltalk.Package.klass);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_defaultCommitPathJs_'),
+unescape('_fromString_'),
 smalltalk.method({
-selector: unescape('defaultCommitPathJs%3A'),
-category: 'commit paths',
+selector: unescape('fromString%3A'),
+category: 'instance creation',
 fn: function (aString) {
     var self = this;
-    self['@defaultCommitPathJs'] = aString;
+    return smalltalk.send(self, "_new_", [aString]);
     return self;
 },
 args: ["aString"],
-source: unescape('defaultCommitPathJs%3A%20aString%0A%09defaultCommitPathJs%20%3A%3D%20aString'),
-messageSends: [],
+source: unescape('fromString%3A%20aString%0A%09%22Example%3A%20Date%20fromString%28%272011/04/15%2000%3A00%3A00%27%29%22%0A%09%5Eself%20new%3A%20aString'),
+messageSends: ["new:"],
 referencedClasses: []
 }),
-smalltalk.Package.klass);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_defaultCommitPathSt'),
+unescape('_millisecondsToRun_'),
 smalltalk.method({
-selector: unescape('defaultCommitPathSt'),
-category: 'commit paths',
-fn: function () {
+selector: unescape('millisecondsToRun%3A'),
+category: 'instance creation',
+fn: function (aBlock) {
     var self = this;
-    return ($receiver = self['@defaultCommitPathSt']) == nil ||
-        $receiver == undefined ? function () {return self['@defaultCommitPathSt'] = "st";}() : $receiver;
+    var t = nil;
+    t = smalltalk.send(smalltalk.Date || Date, "_now", []);
+    smalltalk.send(aBlock, "_value", []);
+    return ($receiver = smalltalk.send(smalltalk.Date || Date, "_now", [])).klass === smalltalk.Number ? $receiver - t : smalltalk.send($receiver, "__minus", [t]);
     return self;
 },
-args: [],
-source: unescape('defaultCommitPathSt%0A%09%5E%20defaultCommitPathSt%20ifNil%3A%20%5B%20defaultCommitPathSt%20%3A%3D%20%27st%27%5D'),
-messageSends: ["ifNil:"],
-referencedClasses: []
+args: ["aBlock"],
+source: unescape('millisecondsToRun%3A%20aBlock%0A%09%7C%20t%20%7C%0A%09t%20%3A%3D%20Date%20now.%0A%09aBlock%20value.%0A%09%5EDate%20now%20-%20t'),
+messageSends: ["now", "value", unescape("-")],
+referencedClasses: ["Date"]
 }),
-smalltalk.Package.klass);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_defaultCommitPathSt_'),
+unescape('_new_'),
 smalltalk.method({
-selector: unescape('defaultCommitPathSt%3A'),
-category: 'commit paths',
-fn: function (aString) {
+selector: unescape('new%3A'),
+category: 'instance creation',
+fn: function (anObject) {
     var self = this;
-    self['@defaultCommitPathSt'] = aString;
+    return new Date(anObject);
     return self;
 },
-args: ["aString"],
-source: unescape('defaultCommitPathSt%3A%20aString%0A%09defaultCommitPathSt%20%3A%3D%20aString'),
+args: ["anObject"],
+source: unescape('new%3A%20anObject%0A%09%3Creturn%20new%20Date%28anObject%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package.klass);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_resetCommitPaths'),
+unescape('_now'),
 smalltalk.method({
-selector: unescape('resetCommitPaths'),
-category: 'commit paths',
+selector: unescape('now'),
+category: 'instance creation',
 fn: function () {
     var self = this;
-    self['@defaultCommitPathJs'] = nil;
-    self['@defaultCommitPathSt'] = nil;
+    return smalltalk.send(self, "_today", []);
     return self;
 },
 args: [],
-source: unescape('resetCommitPaths%0A%20%20%20%20%20%20%20%20defaultCommitPathJs%20%3A%3D%20nil.%0A%20%20%20%20%20%20%20%20defaultCommitPathSt%20%3A%3D%20nil.'),
-messageSends: [],
+source: unescape('now%0A%09%5Eself%20today'),
+messageSends: ["today"],
 referencedClasses: []
 }),
-smalltalk.Package.klass);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_fetch_prefix_'),
+unescape('_today'),
 smalltalk.method({
-selector: unescape('fetch%3Aprefix%3A'),
-category: 'loading-storing',
-fn: function (aPackageName, aPrefix) {
+selector: unescape('today'),
+category: 'instance creation',
+fn: function () {
     var self = this;
-    smalltalk.send(typeof jQuery == "undefined" ? nil : jQuery, "_getScript_onSuccess_", [smalltalk.send(smalltalk.send(aPrefix, "__comma", [aPackageName]), "__comma", [".js"]), function () {return smalltalk.send(smalltalk.Package || Package, "_init_", [aPackageName]);}]);
+    return smalltalk.send(self, "_new", []);
     return self;
 },
-args: ["aPackageName", "aPrefix"],
-source: unescape('fetch%3A%20aPackageName%20prefix%3A%20aPrefix%0A%09jQuery%20getScript%3A%20%28aPrefix%20%2C%20aPackageName%20%2C%20%27.js%27%29%20onSuccess%3A%20%5B%20Package%20init%3A%20aPackageName%20%5D'),
-messageSends: ["getScript:onSuccess:", unescape("%2C"), "init:"],
-referencedClasses: ["Package"]
+args: [],
+source: unescape('today%0A%09%5Eself%20new'),
+messageSends: ["new"],
+referencedClasses: []
 }),
-smalltalk.Package.klass);
+smalltalk.Date.klass);
 
+
+smalltalk.addClass('Date', smalltalk.Object, [], 'Kernel-Objects');
+smalltalk.Date.comment=unescape('The%20Date%20class%20is%20used%20to%20work%20with%20dates%20and%20times.%20Therefore%20%60Date%20today%60%20and%20%60Date%20now%60%20are%20both%20valid%20in%0AAmber%20and%20answer%20the%20same%20date%20object.%0A%0ADate%20wraps%20the%20%60Date%28%29%60%20JavaScript%20constructor%2C%20and%20Smalltalk%20date%20objects%20are%20JavaScript%20date%20objects.')
 smalltalk.addMethod(
-unescape('_fetch_'),
+unescape('__plus'),
 smalltalk.method({
-selector: unescape('fetch%3A'),
-category: 'loading-storing',
-fn: function (aPackageName) {
+selector: unescape('+'),
+category: 'arithmetic',
+fn: function (aDate) {
     var self = this;
-    smalltalk.send(self, "_fetch_prefix_", [aPackageName, smalltalk.send(smalltalk.send(self, "_defaultCommitPathJs", []), "__comma", [unescape("/")])]);
+    return self + aDate;
     return self;
 },
-args: ["aPackageName"],
-source: unescape('fetch%3A%20aPackageName%0A%09self%20fetch%3A%20aPackageName%20prefix%3A%20self%20defaultCommitPathJs%2C%20%27/%27'),
-messageSends: ["fetch:prefix:", unescape("%2C"), "defaultCommitPathJs"],
+args: ["aDate"],
+source: unescape('+%20aDate%0A%09%3Creturn%20self%20+%20aDate%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_commitToLocalStorage_'),
+unescape('__minus'),
 smalltalk.method({
-selector: unescape('commitToLocalStorage%3A'),
-category: 'loading-storing',
-fn: function (aPackageName) {
+selector: unescape('-'),
+category: 'arithmetic',
+fn: function (aDate) {
     var self = this;
-    var key = nil;
-    var sourceCode = nil;
-    key = smalltalk.send("smalltalk.packages.", "__comma", [aPackageName]);
-    sourceCode = smalltalk.send(smalltalk.send(smalltalk.Exporter || Exporter, "_new", []), "_exportPackage_", [aPackageName]);
-    localStorage[key] = escape(sourceCode);
+    return self - aDate;
     return self;
 },
-args: ["aPackageName"],
-source: unescape('commitToLocalStorage%3A%20aPackageName%0A%09%7C%20key%20sourceCode%20%7C%0A%09key%20%3A%3D%20%27smalltalk.packages.%27%20%2C%20aPackageName.%0A%09sourceCode%20%3A%3D%20Exporter%20new%20exportPackage%3A%20aPackageName.%0A%09%3ClocalStorage%5Bkey%5D%20%3D%20escape%28sourceCode%29%3E'),
-messageSends: [unescape("%2C"), "exportPackage:", "new"],
-referencedClasses: ["Exporter"]
+args: ["aDate"],
+source: unescape('-%20aDate%0A%09%3Creturn%20self%20-%20aDate%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Package.klass);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_init_'),
+unescape('__lt'),
 smalltalk.method({
-selector: unescape('init%3A'),
-category: 'loading-storing',
-fn: function (aPackageName) {
+selector: unescape('%3C'),
+category: 'comparing',
+fn: function (aDate) {
     var self = this;
-    (function ($rec) {smalltalk.send($rec, "_do_", [function (each) {return smalltalk.init(each);}]);return smalltalk.send($rec, "_do_", [function (each) {return smalltalk.send(each, "_initialize", []);}]);}(smalltalk.send(smalltalk.send(typeof smalltalk == "undefined" ? nil : smalltalk, "_classes", []), "_select_", [function (each) {return each.pkg.pkgName == aPackageName;}])));
+    return self < aDate;
     return self;
 },
-args: ["aPackageName"],
-source: unescape('init%3A%20aPackageName%0A%09%28smalltalk%20classes%20select%3A%20%5B%20%3Aeach%20%7C%20%3Ceach.pkg.pkgName%20%3D%3D%20aPackageName%3E%20%5D%29%0A%09%09do%3A%20%5B%20%3Aeach%20%7C%20%3Csmalltalk.init%28each%29%3E%20%5D%3B%0A%09%09do%3A%20%5B%20%3Aeach%20%7C%20each%20initialize%20%5D'),
-messageSends: ["do:", "initialize", "select:", "classes"],
+args: ["aDate"],
+source: unescape('%3C%20aDate%0A%09%3Creturn%20self%20%3C%20aDate%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Package.klass);
-
+smalltalk.Date);
 
-smalltalk.addClass('Number', smalltalk.Object, [], 'Kernel-Objects');
-smalltalk.Number.comment=unescape('Number%20holds%20the%20most%20general%20methods%20for%20dealing%20with%20numbers.%20%20%0ANumber%20is%20directly%20mapped%20to%20JavaScript%20Number.%0A%0AMost%20arithmetic%20methods%20like%20%60%23+%60%20%60%23/%60%20%60%23-%60%20%60%23max%3A%60%20are%20directly%20inlined%20into%20javascript.%20%0A%0A%23%23Enumerating%0AA%20Number%20can%20be%20used%20to%20evaluate%20a%20Block%20a%20fixed%20number%20of%20times%3A%0A%0A%095%20timesRepeat%3A%20%5BTranscript%20show%3A%20%27This%20will%20be%20printed%205%20times%27%3B%20cr%5D.%0A%09%0A%091%20to%3A%205%20do%3A%20%5B%3AaNumber%7C%20Transcript%20show%3A%20aNumber%20asString%3B%20cr%5D.%0A%09%0A%091%20to%3A%2010%20by%3A%202%20do%3A%20%5B%3AaNumber%7C%20Transcript%20show%3A%20aNumber%20asString%3B%20cr%5D.')
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('__lt_eq'),
 smalltalk.method({
-selector: unescape('%3D'),
+selector: unescape('%3C%3D'),
 category: 'comparing',
-fn: function (aNumber) {
+fn: function (aDate) {
     var self = this;
-    try {
-        ($receiver = smalltalk.send(aNumber, "_isNumber", [])).klass === smalltalk.Boolean ? !$receiver ? function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}]);
-        return Number(self) == aNumber;
-        return self;
-    } catch (e) {
-        if (e.name === "stReturn" && e.selector === "__eq") {
-            return e.fn();
-        }
-        throw e;
-    }
+    return self <= aDate;
+    return self;
 },
-args: ["aNumber"],
-source: unescape('%3D%20aNumber%0A%09aNumber%20isNumber%20ifFalse%3A%20%5B%5Efalse%5D.%20%0A%09%3Creturn%20Number%28self%29%20%3D%3D%20aNumber%3E'),
-messageSends: ["ifFalse:", "isNumber"],
+args: ["aDate"],
+source: unescape('%3C%3D%20aDate%0A%09%3Creturn%20self%20%3C%3D%20aDate%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
 unescape('__gt'),
 smalltalk.method({
 selector: unescape('%3E'),
 category: 'comparing',
-fn: function (aNumber) {
+fn: function (aDate) {
     var self = this;
-    return self > aNumber;
+    return self > aDate;
     return self;
 },
-args: ["aNumber"],
-source: unescape('%3E%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20%3E%3E%20aNumber%3E'),
+args: ["aDate"],
+source: unescape('%3E%20aDate%0A%09%3Creturn%20self%20%3E%3E%20aDate%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('__lt'),
+unescape('__gt_eq'),
 smalltalk.method({
-selector: unescape('%3C'),
+selector: unescape('%3E%3D'),
 category: 'comparing',
-fn: function (aNumber) {
+fn: function (aDate) {
     var self = this;
-    return self < aNumber;
+    return self >= aDate;
     return self;
 },
-args: ["aNumber"],
-source: unescape('%3C%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20%3C%20aNumber%3E'),
+args: ["aDate"],
+source: unescape('%3E%3D%20aDate%0A%09%3Creturn%20self%20%3E%3E%3D%20aDate%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('__gt_eq'),
+unescape('_asDateString'),
 smalltalk.method({
-selector: unescape('%3E%3D'),
-category: 'comparing',
-fn: function (aNumber) {
+selector: unescape('asDateString'),
+category: 'converting',
+fn: function () {
     var self = this;
-    return self >= aNumber;
+    return self.toDateString();
     return self;
 },
-args: ["aNumber"],
-source: unescape('%3E%3D%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20%3E%3E%3D%20aNumber%3E'),
+args: [],
+source: unescape('asDateString%0A%09%3Creturn%20self.toDateString%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('__lt_eq'),
+unescape('_asLocaleString'),
 smalltalk.method({
-selector: unescape('%3C%3D'),
-category: 'comparing',
-fn: function (aNumber) {
+selector: unescape('asLocaleString'),
+category: 'converting',
+fn: function () {
     var self = this;
-    return self <= aNumber;
+    return self.toLocaleString();
     return self;
 },
-args: ["aNumber"],
-source: unescape('%3C%3D%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20%3C%3D%20aNumber%3E'),
+args: [],
+source: unescape('asLocaleString%0A%09%3Creturn%20self.toLocaleString%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('__plus'),
+unescape('_asMilliseconds'),
 smalltalk.method({
-selector: unescape('+'),
-category: 'arithmetic',
-fn: function (aNumber) {
+selector: unescape('asMilliseconds'),
+category: 'converting',
+fn: function () {
     var self = this;
-    return self + aNumber;
+    return smalltalk.send(self, "_time", []);
     return self;
 },
-args: ["aNumber"],
-source: unescape('+%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20+%20aNumber%3E'),
-messageSends: [],
+args: [],
+source: unescape('asMilliseconds%0A%09%5Eself%20time'),
+messageSends: ["time"],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('__minus'),
+unescape('_asNumber'),
 smalltalk.method({
-selector: unescape('-'),
-category: 'arithmetic',
-fn: function (aNumber) {
+selector: unescape('asNumber'),
+category: 'converting',
+fn: function () {
     var self = this;
-    return self - aNumber;
+    return smalltalk.send(self, "_asMilliseconds", []);
     return self;
 },
-args: ["aNumber"],
-source: unescape('-%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20-%20aNumber%3E'),
-messageSends: [],
+args: [],
+source: unescape('asNumber%0A%09%5Eself%20asMilliseconds'),
+messageSends: ["asMilliseconds"],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('__star'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('*'),
-category: 'arithmetic',
-fn: function (aNumber) {
+selector: unescape('asString'),
+category: 'converting',
+fn: function () {
     var self = this;
-    return self * aNumber;
+    return self.toString();
     return self;
 },
-args: ["aNumber"],
-source: unescape('*%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20*%20aNumber%3E'),
+args: [],
+source: unescape('asString%0A%09%3Creturn%20self.toString%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('__slash'),
+unescape('_asTimeString'),
 smalltalk.method({
-selector: unescape('/'),
-category: 'arithmetic',
-fn: function (aNumber) {
+selector: unescape('asTimeString'),
+category: 'converting',
+fn: function () {
     var self = this;
-    return self / aNumber;
+    return self.toTimeString();
     return self;
 },
-args: ["aNumber"],
-source: unescape('/%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20/%20aNumber%3E'),
+args: [],
+source: unescape('asTimeString%0A%09%3Creturn%20self.toTimeString%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_max_'),
+unescape('_day'),
 smalltalk.method({
-selector: unescape('max%3A'),
-category: 'arithmetic',
-fn: function (aNumber) {
+selector: unescape('day'),
+category: 'accessing',
+fn: function () {
     var self = this;
-    return Math.max(self, aNumber);
+    return smalltalk.send(self, "_dayOfWeek", []);
     return self;
 },
-args: ["aNumber"],
-source: unescape('max%3A%20aNumber%0A%09%3Creturn%20Math.max%28self%2C%20aNumber%29%3B%3E'),
-messageSends: [],
+args: [],
+source: unescape('day%0A%09%5Eself%20dayOfWeek'),
+messageSends: ["dayOfWeek"],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_min_'),
+unescape('_day_'),
 smalltalk.method({
-selector: unescape('min%3A'),
-category: 'arithmetic',
+selector: unescape('day%3A'),
+category: 'accessing',
 fn: function (aNumber) {
     var self = this;
-    return Math.min(self, aNumber);
+    smalltalk.send(self, "_day_", [aNumber]);
     return self;
 },
 args: ["aNumber"],
-source: unescape('min%3A%20aNumber%0A%09%3Creturn%20Math.min%28self%2C%20aNumber%29%3B%3E'),
-messageSends: [],
+source: unescape('day%3A%20aNumber%0A%09self%20day%3A%20aNumber'),
+messageSends: ["day:"],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_rounded'),
+unescape('_dayOfMonth'),
 smalltalk.method({
-selector: unescape('rounded'),
-category: 'converting',
+selector: unescape('dayOfMonth'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return Math.round(self);
+    return self.getDate();
     return self;
 },
 args: [],
-source: unescape('rounded%0A%09%3Creturn%20Math.round%28self%29%3B%3E'),
+source: unescape('dayOfMonth%0A%09%3Creturn%20self.getDate%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_truncated'),
+unescape('_dayOfMonth_'),
 smalltalk.method({
-selector: unescape('truncated'),
-category: 'converting',
+selector: unescape('dayOfMonth%3A'),
+category: 'accessing',
+fn: function (aNumber) {
+    var self = this;
+    self.setDate(aNumber);
+    return self;
+},
+args: ["aNumber"],
+source: unescape('dayOfMonth%3A%20aNumber%0A%09%3Cself.setDate%28aNumber%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Date);
+
+smalltalk.addMethod(
+unescape('_dayOfWeek'),
+smalltalk.method({
+selector: unescape('dayOfWeek'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    var result = nil;
-    ($receiver = self >= 0).klass === smalltalk.Boolean ? $receiver ? function () {return result = Math.floor(self);}() : function () {return result = Math.floor(self * -1) * -1;}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return result = Math.floor(self);}, function () {return result = Math.floor(self * -1) * -1;}]);
-    return result;
+    return self.getDay() + 1;
     return self;
 },
 args: [],
-source: unescape('truncated%0A%7Cresult%7C%0A%0A%20%20%20%20self%20%3E%3D%200%20%0A%20%20%20%20%20%20%20%20ifTrue%3A%20%5B%3Cresult%20%3D%20Math.floor%28self%29%3B%3E%5D%0A%20%20%20%20%20%20%20%20ifFalse%3A%20%5B%3Cresult%20%3D%20%28Math.floor%28self%20*%20%28-1%29%29%20*%20%28-1%29%29%3B%3E%5D.%0A%0A%20%20%20%20%5E%20result'),
-messageSends: ["ifTrue:ifFalse:", unescape("%3E%3D")],
+source: unescape('dayOfWeek%0A%09%3Creturn%20self.getDay%28%29%20+%201%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_to_'),
+unescape('_dayOfWeek_'),
 smalltalk.method({
-selector: unescape('to%3A'),
-category: 'converting',
+selector: unescape('dayOfWeek%3A'),
+category: 'accessing',
 fn: function (aNumber) {
     var self = this;
-    var array = nil;
-    var first = nil;
-    var last = nil;
-    var count = nil;
-    first = smalltalk.send(self, "_truncated", []);
-    last = ($receiver = smalltalk.send(aNumber, "_truncated", [])).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);
-    count = 1;
-    array = smalltalk.send(smalltalk.Array || Array, "_new", []);
-    smalltalk.send(($receiver = last).klass === smalltalk.Number ? $receiver - first : smalltalk.send($receiver, "__minus", [first]), "_timesRepeat_", [function () {smalltalk.send(array, "_at_put_", [count, first]);count = ($receiver = count).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return first = ($receiver = first).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}]);
-    return array;
+    return self.setDay(aNumber - 1);
     return self;
 },
 args: ["aNumber"],
-source: unescape('to%3A%20aNumber%0A%09%7C%20array%20first%20last%20count%20%7C%0A%09first%20%3A%3D%20self%20truncated.%0A%09last%20%3A%3D%20aNumber%20truncated%20+%201.%0A%09count%20%3A%3D%201.%0A%09array%20%3A%3D%20Array%20new.%0A%09%28last%20-%20first%29%20timesRepeat%3A%20%5B%0A%09%20%20%20%20array%20at%3A%20count%20put%3A%20first.%0A%09%20%20%20%20count%20%3A%3D%20count%20+%201.%0A%09%20%20%20%20first%20%3A%3D%20first%20+%201%5D.%0A%09%5Earray'),
-messageSends: ["truncated", unescape("+"), "new", "timesRepeat:", unescape("-"), "at:put:"],
-referencedClasses: ["Array"]
+source: unescape('dayOfWeek%3A%20aNumber%0A%09%3Creturn%20self.setDay%28aNumber%20-%201%29%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_timesRepeat_'),
+unescape('_hours'),
 smalltalk.method({
-selector: unescape('timesRepeat%3A'),
-category: 'enumerating',
-fn: function (aBlock) {
-    var self = this;
-    var integer = nil;
-    var count = nil;
-    integer = smalltalk.send(self, "_truncated", []);
-    count = 1;
-    (function () {while (!function () {return ($receiver = count).klass === smalltalk.Number ? $receiver > self : smalltalk.send($receiver, "__gt", [self]);}()) {(function () {smalltalk.send(aBlock, "_value", []);return count = ($receiver = count).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}());}}());
+selector: unescape('hours'),
+category: 'accessing',
+fn: function () {
+    var self = this;
+    return self.getHours();
     return self;
 },
-args: ["aBlock"],
-source: unescape('timesRepeat%3A%20aBlock%0A%09%7C%20integer%20count%20%7C%0A%09integer%20%3A%3D%20self%20truncated.%0A%09count%20%3A%3D%201.%0A%09%5Bcount%20%3E%20self%5D%20whileFalse%3A%20%5B%0A%09%20%20%20%20aBlock%20value.%0A%09%20%20%20%20count%20%3A%3D%20count%20+%201%5D'),
-messageSends: ["truncated", "whileFalse:", unescape("%3E"), "value", unescape("+")],
+args: [],
+source: unescape('hours%0A%09%3Creturn%20self.getHours%28%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_to_do_'),
+unescape('_hours_'),
 smalltalk.method({
-selector: unescape('to%3Ado%3A'),
-category: 'enumerating',
-fn: function (stop, aBlock) {
+selector: unescape('hours%3A'),
+category: 'accessing',
+fn: function (aNumber) {
     var self = this;
-    var nextValue = nil;
-    nextValue = self;
-    (function () {while (function () {return ($receiver = nextValue).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [nextValue]);return nextValue = ($receiver = nextValue).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}());}}());
+    self.setHours(aNumber);
     return self;
 },
-args: ["stop", "aBlock"],
-source: unescape('to%3A%20stop%20do%3A%20aBlock%0A%09%22Evaluate%20aBlock%20for%20each%20number%20from%20self%20to%20aNumber.%22%0A%09%7C%20nextValue%20%7C%0A%09nextValue%20%3A%3D%20self.%0A%09%5BnextValue%20%3C%3D%20stop%5D%0A%09%09whileTrue%3A%20%0A%09%09%09%5BaBlock%20value%3A%20nextValue.%0A%09%09%09nextValue%20%3A%3D%20nextValue%20+%201%5D'),
-messageSends: ["whileTrue:", unescape("%3C%3D"), "value:", unescape("+")],
+args: ["aNumber"],
+source: unescape('hours%3A%20aNumber%0A%09%3Cself.setHours%28aNumber%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_milliseconds'),
 smalltalk.method({
-selector: unescape('asString'),
-category: 'converting',
+selector: unescape('milliseconds'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_printString", []);
+    return self.getMilliseconds();
     return self;
 },
 args: [],
-source: unescape('asString%0A%09%5Eself%20printString'),
-messageSends: ["printString"],
+source: unescape('milliseconds%0A%09%3Creturn%20self.getMilliseconds%28%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_asJavascript'),
+unescape('_milliseconds_'),
 smalltalk.method({
-selector: unescape('asJavascript'),
-category: 'converting',
-fn: function () {
+selector: unescape('milliseconds%3A'),
+category: 'accessing',
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(smalltalk.send(unescape("%28"), "__comma", [smalltalk.send(self, "_printString", [])]), "__comma", [unescape("%29")]);
+    self.setMilliseconds(aNumber);
     return self;
 },
-args: [],
-source: unescape('asJavascript%0A%09%5E%27%28%27%2C%20self%20printString%2C%20%27%29%27'),
-messageSends: [unescape("%2C"), "printString"],
+args: ["aNumber"],
+source: unescape('milliseconds%3A%20aNumber%0A%09%3Cself.setMilliseconds%28aNumber%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_minutes'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
+selector: unescape('minutes'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return String(self);
+    return self.getMinutes();
     return self;
 },
 args: [],
-source: unescape('printString%0A%09%3Creturn%20String%28self%29%3E'),
+source: unescape('minutes%0A%09%3Creturn%20self.getMinutes%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_isNumber'),
+unescape('_minutes_'),
 smalltalk.method({
-selector: unescape('isNumber'),
-category: 'testing',
-fn: function () {
+selector: unescape('minutes%3A'),
+category: 'accessing',
+fn: function (aNumber) {
     var self = this;
-    return true;
+    self.setMinutes(aNumber);
     return self;
 },
-args: [],
-source: unescape('isNumber%0A%09%5Etrue'),
+args: ["aNumber"],
+source: unescape('minutes%3A%20aNumber%0A%09%3Cself.setMinutes%28aNumber%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_atRandom'),
+unescape('_month'),
 smalltalk.method({
-selector: unescape('atRandom'),
-category: 'converting',
+selector: unescape('month'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return ($receiver = smalltalk.send(($receiver = smalltalk.send(smalltalk.send(smalltalk.Random || Random, "_new", []), "_next", [])).klass === smalltalk.Number ? $receiver * self : smalltalk.send($receiver, "__star", [self]), "_truncated", [])).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);
+    return self.getMonth() + 1;
     return self;
 },
 args: [],
-source: unescape('atRandom%0A%20%20%20%20%5E%28Random%20new%20next%20*%20self%29%20truncated%20+%201'),
-messageSends: [unescape("+"), "truncated", unescape("*"), "next", "new"],
-referencedClasses: ["Random"]
+source: unescape('month%0A%09%3Creturn%20self.getMonth%28%29%20+%201%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('__at'),
+unescape('_month_'),
 smalltalk.method({
-selector: unescape('@'),
-category: 'converting',
+selector: unescape('month%3A'),
+category: 'accessing',
 fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [self, aNumber]);
+    self.setMonth(aNumber - 1);
     return self;
 },
 args: ["aNumber"],
-source: unescape('@%20aNumber%0A%09%5EPoint%20x%3A%20self%20y%3A%20aNumber'),
-messageSends: ["x:y:"],
-referencedClasses: ["Point"]
+source: unescape('month%3A%20aNumber%0A%09%3Cself.setMonth%28aNumber%20-%201%29%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_asPoint'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('asPoint'),
-category: 'converting',
+selector: unescape('printString'),
+category: 'printing',
 fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [self, self]);
+    return smalltalk.send(self, "_asString", []);
     return self;
 },
 args: [],
-source: unescape('asPoint%0A%09%5EPoint%20x%3A%20self%20y%3A%20self'),
-messageSends: ["x:y:"],
-referencedClasses: ["Point"]
+source: unescape('printString%0A%09%5Eself%20asString'),
+messageSends: ["asString"],
+referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_clearInterval'),
+unescape('_seconds'),
 smalltalk.method({
-selector: unescape('clearInterval'),
-category: 'timeouts/intervals',
+selector: unescape('seconds'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    clearInterval(Number(self));
+    return self.getSeconds();
     return self;
 },
 args: [],
-source: unescape('clearInterval%0A%09%3CclearInterval%28Number%28self%29%29%3E'),
+source: unescape('seconds%0A%09%3Creturn%20self.getSeconds%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_clearTimeout'),
+unescape('_seconds_'),
 smalltalk.method({
-selector: unescape('clearTimeout'),
-category: 'timeouts/intervals',
-fn: function () {
+selector: unescape('seconds%3A'),
+category: 'accessing',
+fn: function (aNumber) {
     var self = this;
-    clearTimeout(Number(self));
+    self.setSeconds(aNumber);
     return self;
 },
-args: [],
-source: unescape('clearTimeout%0A%09%3CclearTimeout%28Number%28self%29%29%3E'),
+args: ["aNumber"],
+source: unescape('seconds%3A%20aNumber%0A%09%3Cself.setSeconds%28aNumber%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_even'),
+unescape('_time'),
 smalltalk.method({
-selector: unescape('even'),
-category: 'testing',
+selector: unescape('time'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return smalltalk.send(0, "__eq", [smalltalk.send(self, "_\\\\", [2])]);
+    return self.getTime();
     return self;
 },
 args: [],
-source: unescape('even%0A%09%5E%200%20%3D%20%28self%20%5C%5C%202%29'),
-messageSends: [unescape("%3D"), unescape("%5C%5C%5C%5C")],
+source: unescape('time%0A%09%3Creturn%20self.getTime%28%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_odd'),
+unescape('_time_'),
 smalltalk.method({
-selector: unescape('odd'),
-category: 'testing',
-fn: function () {
+selector: unescape('time%3A'),
+category: 'accessing',
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_even", []), "_not", []);
+    self.setTime(aNumber);
     return self;
 },
-args: [],
-source: unescape('odd%0A%09%5E%20self%20even%20not'),
-messageSends: ["not", "even"],
+args: ["aNumber"],
+source: unescape('time%3A%20aNumber%0A%09%3Cself.setTime%28aNumber%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_negated'),
+unescape('_year'),
 smalltalk.method({
-selector: unescape('negated'),
-category: 'arithmetic',
+selector: unescape('year'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return 0 - self;
+    return self.getFullYear();
     return self;
 },
 args: [],
-source: unescape('negated%0A%09%5E0%20-%20self'),
-messageSends: [unescape("-")],
+source: unescape('year%0A%09%3Creturn%20self.getFullYear%28%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_printShowingDecimalPlaces_'),
+unescape('_year_'),
 smalltalk.method({
-selector: unescape('printShowingDecimalPlaces%3A'),
-category: 'printing',
-fn: function (placesDesired) {
+selector: unescape('year%3A'),
+category: 'accessing',
+fn: function (aNumber) {
     var self = this;
-    return self.toFixed(placesDesired);
+    self.setFullYear(aNumber);
     return self;
 },
-args: ["placesDesired"],
-source: unescape('printShowingDecimalPlaces%3A%20placesDesired%0A%09%3Creturn%20self.toFixed%28placesDesired%29%3E'),
+args: ["aNumber"],
+source: unescape('year%3A%20aNumber%0A%09%3Cself.setFullYear%28aNumber%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date);
+
 
 smalltalk.addMethod(
-unescape('_to_by_'),
+unescape('_fromMilliseconds_'),
 smalltalk.method({
-selector: unescape('to%3Aby%3A'),
-category: 'converting',
-fn: function (stop, step) {
+selector: unescape('fromMilliseconds%3A'),
+category: 'instance creation',
+fn: function (aNumber) {
     var self = this;
-    var array = nil;
-    var value = nil;
-    var pos = nil;
-    value = self;
-    array = smalltalk.send(smalltalk.Array || Array, "_new", []);
-    pos = 1;
-    ($receiver = smalltalk.send(step, "__eq", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}]);
-    ($receiver = ($receiver = step).klass === smalltalk.Number ? $receiver < 0 : smalltalk.send($receiver, "__lt", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}, function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}]);
-    return array;
+    return smalltalk.send(self, "_new_", [aNumber]);
     return self;
 },
-args: ["stop", "step"],
-source: unescape('to%3A%20stop%20by%3A%20step%0A%09%7C%20array%20value%20pos%20%7C%0A%09value%20%3A%3D%20self.%0A%09array%20%3A%3D%20Array%20new.%0A%09pos%20%3A%3D%201.%0A%09step%20%3D%200%20ifTrue%3A%20%5Bself%20error%3A%20%27step%20must%20be%20non-zero%27%5D.%0A%09step%20%3C%200%0A%09%09ifTrue%3A%20%5B%5B%20value%20%3E%3D%20stop%20%5D%20whileTrue%3A%20%5B%0A%09%20%20%20%20%09%09%09array%20at%3A%20pos%20put%3A%20value.%0A%09%20%20%20%20%09%09%09pos%20%3A%3D%20pos%20+%201.%0A%09%20%20%20%20%09%09%09value%20%3A%3D%20value%20+%20step%5D%5D%0A%09%09ifFalse%3A%20%5B%5B%20value%20%3C%3D%20stop%20%5D%20whileTrue%3A%20%5B%0A%09%20%20%20%20%09%09%09array%20at%3A%20pos%20put%3A%20value.%0A%09%20%20%09%09%09pos%20%3A%3D%20pos%20+%201.%0A%09%20%20%20%20%09%09%09value%20%3A%3D%20value%20+%20step%5D%5D.%0A%09%5Earray'),
-messageSends: ["new", "ifTrue:", unescape("%3D"), "error:", "ifTrue:ifFalse:", unescape("%3C"), "whileTrue:", unescape("%3E%3D"), "at:put:", unescape("+"), unescape("%3C%3D")],
-referencedClasses: ["Array"]
+args: ["aNumber"],
+source: unescape('fromMilliseconds%3A%20aNumber%0A%09%5Eself%20new%3A%20aNumber'),
+messageSends: ["new:"],
+referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_to_by_do_'),
+unescape('_fromSeconds_'),
 smalltalk.method({
-selector: unescape('to%3Aby%3Ado%3A'),
-category: 'enumerating',
-fn: function (stop, step, aBlock) {
+selector: unescape('fromSeconds%3A'),
+category: 'instance creation',
+fn: function (aNumber) {
     var self = this;
-    var value = nil;
-    value = self;
-    ($receiver = smalltalk.send(step, "__eq", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}]);
-    ($receiver = ($receiver = step).klass === smalltalk.Number ? $receiver < 0 : smalltalk.send($receiver, "__lt", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}, function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}]);
+    return smalltalk.send(self, "_fromMilliseconds_", [($receiver = aNumber).klass === smalltalk.Number ? $receiver * 1000 : smalltalk.send($receiver, "__star", [1000])]);
     return self;
 },
-args: ["stop", "step", "aBlock"],
-source: unescape('to%3A%20stop%20by%3A%20step%20do%3A%20aBlock%0A%09%7C%20value%20%7C%0A%09value%20%3A%3D%20self.%0A%09step%20%3D%200%20ifTrue%3A%20%5Bself%20error%3A%20%27step%20must%20be%20non-zero%27%5D.%0A%09step%20%3C%200%0A%09%09ifTrue%3A%20%5B%5B%20value%20%3E%3D%20stop%20%5D%20whileTrue%3A%20%5B%0A%09%20%20%20%20%09%09%09aBlock%20value%3A%20value.%0A%09%20%20%20%20%09%09%09value%20%3A%3D%20value%20+%20step%5D%5D%0A%09%09ifFalse%3A%20%5B%5B%20value%20%3C%3D%20stop%20%5D%20whileTrue%3A%20%5B%0A%09%20%20%20%20%09%09%09aBlock%20value%3A%20value.%0A%09%20%20%20%20%09%09%09value%20%3A%3D%20value%20+%20step%5D%5D'),
-messageSends: ["ifTrue:", unescape("%3D"), "error:", "ifTrue:ifFalse:", unescape("%3C"), "whileTrue:", unescape("%3E%3D"), "value:", unescape("+"), unescape("%3C%3D")],
+args: ["aNumber"],
+source: unescape('fromSeconds%3A%20aNumber%0A%09%5Eself%20fromMilliseconds%3A%20aNumber%20*%201000'),
+messageSends: ["fromMilliseconds:", unescape("*")],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_fromString_'),
 smalltalk.method({
-selector: unescape('deepCopy'),
-category: 'copying',
-fn: function () {
+selector: unescape('fromString%3A'),
+category: 'instance creation',
+fn: function (aString) {
     var self = this;
-    return smalltalk.send(self, "_copy", []);
+    return smalltalk.send(self, "_new_", [aString]);
     return self;
 },
-args: [],
-source: unescape('deepCopy%0A%09%5Eself%20copy'),
-messageSends: ["copy"],
+args: ["aString"],
+source: unescape('fromString%3A%20aString%0A%09%22Example%3A%20Date%20fromString%28%272011/04/15%2000%3A00%3A00%27%29%22%0A%09%5Eself%20new%3A%20aString'),
+messageSends: ["new:"],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_copy'),
+unescape('_millisecondsToRun_'),
 smalltalk.method({
-selector: unescape('copy'),
-category: 'copying',
-fn: function () {
+selector: unescape('millisecondsToRun%3A'),
+category: 'instance creation',
+fn: function (aBlock) {
     var self = this;
-    return self;
+    var t = nil;
+    t = smalltalk.send(smalltalk.Date || Date, "_now", []);
+    smalltalk.send(aBlock, "_value", []);
+    return ($receiver = smalltalk.send(smalltalk.Date || Date, "_now", [])).klass === smalltalk.Number ? $receiver - t : smalltalk.send($receiver, "__minus", [t]);
     return self;
 },
-args: [],
-source: unescape('copy%0A%09%5Eself'),
-messageSends: [],
-referencedClasses: []
+args: ["aBlock"],
+source: unescape('millisecondsToRun%3A%20aBlock%0A%09%7C%20t%20%7C%0A%09t%20%3A%3D%20Date%20now.%0A%09aBlock%20value.%0A%09%5EDate%20now%20-%20t'),
+messageSends: ["now", "value", unescape("-")],
+referencedClasses: ["Date"]
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_%5C%5C'),
+unescape('_new_'),
 smalltalk.method({
-selector: unescape('%5C%5C'),
-category: 'arithmetic',
-fn: function (aNumber) {
+selector: unescape('new%3A'),
+category: 'instance creation',
+fn: function (anObject) {
     var self = this;
-    return self % aNumber;
+    return new Date(anObject);
     return self;
 },
-args: ["aNumber"],
-source: unescape('%5C%5C%20aNumber%0A%09%3Creturn%20self%20%25%20aNumber%3E'),
+args: ["anObject"],
+source: unescape('new%3A%20anObject%0A%09%3Creturn%20new%20Date%28anObject%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_sqrt'),
+unescape('_now'),
 smalltalk.method({
-selector: unescape('sqrt'),
-category: 'arithmetic',
+selector: unescape('now'),
+category: 'instance creation',
 fn: function () {
     var self = this;
-    return Math.sqrt(self);
+    return smalltalk.send(self, "_today", []);
     return self;
 },
 args: [],
-source: unescape('sqrt%0A%09%3Creturn%20Math.sqrt%28self%29%3E'),
-messageSends: [],
+source: unescape('now%0A%09%5Eself%20today'),
+messageSends: ["today"],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
 
 smalltalk.addMethod(
-unescape('_squared'),
+unescape('_today'),
 smalltalk.method({
-selector: unescape('squared'),
-category: 'arithmetic',
+selector: unescape('today'),
+category: 'instance creation',
 fn: function () {
     var self = this;
-    return self * self;
+    return smalltalk.send(self, "_new", []);
     return self;
 },
 args: [],
-source: unescape('squared%0A%09%5Eself%20*%20self'),
-messageSends: [unescape("*")],
+source: unescape('today%0A%09%5Eself%20new'),
+messageSends: ["new"],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.Date.klass);
+
 
+smalltalk.addClass('JSObjectProxy', smalltalk.Object, ['jsObject'], 'Kernel-Objects');
+smalltalk.JSObjectProxy.comment=unescape('JSObjectProxy%20handles%20sending%20messages%20to%20JavaScript%20object%2C%20therefore%20accessing%20JavaScript%20objects%20from%20Amber%20is%20transparent.%0AJSOjbectProxy%20makes%20intensive%20use%20of%20%60%23doesNotUnderstand%3A%60.%0A%0A%23%23%20Examples%0A%0AJSObjectProxy%20objects%20are%20instanciated%20by%20Amber%20when%20a%20Smalltalk%20message%20is%20sent%20to%20a%20JavaScript%20object.%0A%0A%20%20%20%20window%20alert%3A%20%27hello%20world%27.%0A%20%20%20%20window%20inspect.%0A%20%20%20%20%28window%20jQuery%3A%20%27body%27%29%20append%3A%20%27hello%20world%27%0A%0ASmalltalk%20messages%20sends%20are%20converted%20to%20JavaScript%20function%20calls%20or%20object%20property%20access%20_%28in%20this%20order%29_.%20If%20n%20one%20of%20them%20match%2C%20a%20%60MessageNotUnderstood%60%20error%20will%20be%20thrown.%20%0A%0A%23%23%20Message%20conversion%20rules%0A%0A-%20%60someUser%20name%60%20becomes%20%20%60someUser.name%60%0A-%20%60someUser%20name%3A%20%27John%27%60%20becomes%20%60someUser%20name%20%3D%20%22John%22%60%0A-%20%60console%20log%3A%20%27hello%20world%27%60%20becomes%20%60console.log%28%27hello%20world%27%29%60%0A-%20%60%28window%20jQuery%3A%20%27foo%27%29%20css%3A%20%27background%27%20color%3A%20%27red%27%60%20becomes%20%60window.jQuery%28%27foo%27%29.css%28%27background%27%2C%20%27red%27%29%60%0A%0A__Note%3A__%20For%20keyword-based%20messages%2C%20only%20the%20first%20keyword%20is%20kept%3A%20%60window%20foo%3A%201%20bar%3A%202%60%20is%20equivalent%20to%20%60window%20foo%3A%201%20baz%3A%202%60.')
 smalltalk.addMethod(
-unescape('_identityHash'),
+unescape('_at_'),
 smalltalk.method({
-selector: unescape('identityHash'),
+selector: unescape('at%3A'),
 category: 'accessing',
-fn: function () {
+fn: function (aSymbol) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "_asString", []), "__comma", ["n"]);
+    var attr = nil;
+    attr = smalltalk.send(aSymbol, "_asString", []);
+    return self['@jsObject'][attr];
     return self;
 },
-args: [],
-source: unescape('identityHash%0A%09%5Eself%20asString%2C%20%27n%27'),
-messageSends: [unescape("%2C"), "asString"],
+args: ["aSymbol"],
+source: unescape('at%3A%20aSymbol%0A%09%7C%20attr%20%7C%0A%09attr%20%3A%3D%20aSymbol%20asString.%0A%09%3Creturn%20self%5B%27@jsObject%27%5D%5Battr%5D%3E'),
+messageSends: ["asString"],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-unescape('_negative'),
+unescape('_at_put_'),
 smalltalk.method({
-selector: unescape('negative'),
-category: 'testing',
-fn: function () {
+selector: unescape('at%3Aput%3A'),
+category: 'accessing',
+fn: function (aSymbol, anObject) {
     var self = this;
-    return self < 0;
+    var attr = nil;
+    attr = smalltalk.send(aSymbol, "_asString", []);
+    self['@jsObject'][attr] = anObject;
     return self;
 },
-args: [],
-source: unescape('negative%0A%09%22Answer%20whether%20the%20receiver%20is%20mathematically%20negative.%22%0A%0A%09%5E%20self%20%3C%200'),
-messageSends: [unescape("%3C")],
+args: ["aSymbol", "anObject"],
+source: unescape('at%3A%20aSymbol%20put%3A%20anObject%0A%09%7C%20attr%20%7C%0A%09attr%20%3A%3D%20aSymbol%20asString.%0A%09%3Cself%5B%27@jsObject%27%5D%5Battr%5D%20%3D%20anObject%3E'),
+messageSends: ["asString"],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-unescape('_positive'),
+unescape('_doesNotUnderstand_'),
 smalltalk.method({
-selector: unescape('positive'),
-category: 'testing',
-fn: function () {
+selector: unescape('doesNotUnderstand%3A'),
+category: 'proxy',
+fn: function (aMessage) {
     var self = this;
-    return self >= 0;
+    var obj = nil;
+    var selector = nil;
+    var jsSelector = nil;
+    var arguments = nil;
+    obj = smalltalk.send(self, "_jsObject", []);
+    selector = smalltalk.send(aMessage, "_selector", []);
+    jsSelector = smalltalk.send(selector, "_asJavaScriptSelector", []);
+    arguments = smalltalk.send(aMessage, "_arguments", []);
+    if (obj[jsSelector] != undefined) {
+        return smalltalk.send(obj, jsSelector, arguments);
+    }
+    smalltalk.send(self, "_doesNotUnderstand_", [aMessage], smalltalk.Object);
     return self;
 },
-args: [],
-source: unescape('positive%0A%09%22Answer%20whether%20the%20receiver%20is%20positive%20or%20equal%20to%200.%20%28ST-80%20protocol%29.%22%0A%0A%09%5E%20self%20%3E%3D%200'),
-messageSends: [unescape("%3E%3D")],
+args: ["aMessage"],
+source: unescape('doesNotUnderstand%3A%20aMessage%0A%09%7C%20obj%20selector%20jsSelector%20arguments%20%7C%0A%09obj%20%3A%3D%20self%20jsObject.%0A%09selector%20%3A%3D%20aMessage%20selector.%0A%09jsSelector%20%3A%3D%20selector%20asJavaScriptSelector.%0A%09arguments%20%3A%3D%20aMessage%20arguments.%0A%09%3Cif%28obj%5BjsSelector%5D%20%21%3D%20undefined%29%20%7Breturn%20smalltalk.send%28obj%2C%20jsSelector%2C%20arguments%29%7D%3E.%0A%09super%20doesNotUnderstand%3A%20aMessage'),
+messageSends: ["jsObject", "selector", "asJavaScriptSelector", "arguments", "doesNotUnderstand:"],
 referencedClasses: []
 }),
-smalltalk.Number);
+smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-unescape('_isZero'),
+unescape('_inspectOn_'),
 smalltalk.method({
-selector: unescape('isZero'),
-category: 'testing',
-fn: function () {
+selector: unescape('inspectOn%3A'),
+category: 'proxy',
+fn: function (anInspector) {
     var self = this;
-    return smalltalk.send(self, "__eq", [0]);
+    var variables = nil;
+    variables = smalltalk.send(smalltalk.Dictionary || Dictionary, "_new", []);
+    smalltalk.send(variables, "_at_put_", [unescape("%23self"), smalltalk.send(self, "_jsObject", [])]);
+    smalltalk.send(anInspector, "_setLabel_", [smalltalk.send(self, "_printString", [])]);
+    for (var i in self['@jsObject']) {
+        variables._at_put_(i, self['@jsObject'][i]);
+    }
+    smalltalk.send(anInspector, "_setVariables_", [variables]);
     return self;
 },
-args: [],
-source: unescape('isZero%0A%09%5Eself%20%3D%200'),
-messageSends: [unescape("%3D")],
-referencedClasses: []
+args: ["anInspector"],
+source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self%20jsObject.%0A%09anInspector%20setLabel%3A%20self%20printString.%0A%09%3Cfor%28var%20i%20in%20self%5B%27@jsObject%27%5D%29%20%7B%0A%09%09variables._at_put_%28i%2C%20self%5B%27@jsObject%27%5D%5Bi%5D%29%3B%0A%09%7D%3E.%0A%09anInspector%20setVariables%3A%20variables'),
+messageSends: ["new", "at:put:", "jsObject", "setLabel:", "printString", "setVariables:"],
+referencedClasses: ["Dictionary"]
 }),
-smalltalk.Number);
+smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_jsObject'),
 smalltalk.method({
-selector: unescape('asJSON'),
-category: 'converting',
-fn: function (){
-var self=this;
-return self;
-return self;},
+selector: unescape('jsObject'),
+category: 'accessing',
+fn: function () {
+    var self = this;
+    return self['@jsObject'];
+    return self;
+},
 args: [],
-source: unescape('asJSON%0A%09%5Eself'),
+source: unescape('jsObject%0A%09%5EjsObject'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number);
-
+smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-unescape('_pi'),
+unescape('_jsObject_'),
 smalltalk.method({
-selector: unescape('pi'),
-category: 'instance creation',
-fn: function () {
+selector: unescape('jsObject%3A'),
+category: 'accessing',
+fn: function (aJSObject) {
     var self = this;
-    return Math.PI;
+    self['@jsObject'] = aJSObject;
     return self;
 },
-args: [],
-source: unescape('pi%0A%09%3Creturn%20Math.PI%3E'),
+args: ["aJSObject"],
+source: unescape('jsObject%3A%20aJSObject%0A%09jsObject%20%3A%3D%20aJSObject'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Number.klass);
-
+smalltalk.JSObjectProxy);
 
-smalltalk.addClass('Boolean', smalltalk.Object, [], 'Kernel-Objects');
-smalltalk.Boolean.comment=unescape('Boolean%20wraps%20the%20JavaScript%20%60Boolean%28%29%60%20constructor.%20The%20%60true%60%20and%20%60false%60%20objects%20are%20the%20JavaScript%20boolean%20objects.%0A%0ABoolean%20defines%20the%20protocol%20for%20logic%20testing%20operations%20and%20conditional%20control%20structures%20for%20the%20logical%20values.%0ABoolean%20instances%20are%20weither%20%60true%60%20or%20%60false%60.')
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('%3D'),
-category: 'comparing',
-fn: function (aBoolean) {
-    var self = this;
-    try {
-        ($receiver = smalltalk.send(smalltalk.send(aBoolean, "_class", []), "__eq", [smalltalk.send(self, "_class", [])])).klass === smalltalk.Boolean ? !$receiver ? function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}]);
-        return Boolean(self == true) == aBoolean;
-        return self;
-    } catch (e) {
-        if (e.name === "stReturn" && e.selector === "__eq") {
-            return e.fn();
-        }
-        throw e;
-    }
-},
-args: ["aBoolean"],
-source: unescape('%3D%20aBoolean%0A%09aBoolean%20class%20%3D%20self%20class%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09%3Creturn%20Boolean%28self%20%3D%3D%20true%29%20%3D%3D%20aBoolean%3E'),
-messageSends: ["ifFalse:", unescape("%3D"), "class"],
-referencedClasses: []
-}),
-smalltalk.Boolean);
-
-smalltalk.addMethod(
-unescape('_shallowCopy'),
-smalltalk.method({
-selector: unescape('shallowCopy'),
-category: 'copying',
+selector: unescape('printString'),
+category: 'proxy',
 fn: function () {
     var self = this;
-    return self;
+    return smalltalk.send(smalltalk.send(self, "_jsObject", []), "_toString", []);
     return self;
 },
 args: [],
-source: unescape('shallowCopy%0A%09%5Eself'),
-messageSends: [],
+source: unescape('printString%0A%09%5Eself%20jsObject%20toString'),
+messageSends: ["toString", "jsObject"],
 referencedClasses: []
 }),
-smalltalk.Boolean);
+smalltalk.JSObjectProxy);
+
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_on_'),
 smalltalk.method({
-selector: unescape('deepCopy'),
-category: 'copying',
-fn: function () {
+selector: unescape('on%3A'),
+category: 'instance creation',
+fn: function (aJSObject) {
     var self = this;
-    return self;
+    return function ($rec) {smalltalk.send($rec, "_jsObject_", [aJSObject]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
     return self;
 },
-args: [],
-source: unescape('deepCopy%0A%09%5Eself'),
-messageSends: [],
+args: ["aJSObject"],
+source: unescape('on%3A%20aJSObject%0A%09%5Eself%20new%0A%09%09jsObject%3A%20aJSObject%3B%0A%09%09yourself'),
+messageSends: ["jsObject:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.Boolean);
+smalltalk.JSObjectProxy.klass);
+
 
+smalltalk.addClass('Number', smalltalk.Object, [], 'Kernel-Objects');
+smalltalk.Number.comment=unescape('Number%20holds%20the%20most%20general%20methods%20for%20dealing%20with%20numbers.%20%20%0ANumber%20is%20directly%20mapped%20to%20JavaScript%20Number.%0A%0AMost%20arithmetic%20methods%20like%20%60%23+%60%20%60%23/%60%20%60%23-%60%20%60%23max%3A%60%20are%20directly%20inlined%20into%20javascript.%20%0A%0A%23%23Enumerating%0AA%20Number%20can%20be%20used%20to%20evaluate%20a%20Block%20a%20fixed%20number%20of%20times%3A%0A%0A%095%20timesRepeat%3A%20%5BTranscript%20show%3A%20%27This%20will%20be%20printed%205%20times%27%3B%20cr%5D.%0A%09%0A%091%20to%3A%205%20do%3A%20%5B%3AaNumber%7C%20Transcript%20show%3A%20aNumber%20asString%3B%20cr%5D.%0A%09%0A%091%20to%3A%2010%20by%3A%202%20do%3A%20%5B%3AaNumber%7C%20Transcript%20show%3A%20aNumber%20asString%3B%20cr%5D.')
 smalltalk.addMethod(
-unescape('_ifTrue_'),
+unescape('__star'),
 smalltalk.method({
-selector: unescape('ifTrue%3A'),
-category: 'controlling',
-fn: function (aBlock) {
+selector: unescape('*'),
+category: 'arithmetic',
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(self, "_ifTrue_ifFalse_", [aBlock, function () {return nil;}]);
+    return self * aNumber;
     return self;
 },
-args: ["aBlock"],
-source: unescape('ifTrue%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself%20ifTrue%3A%20aBlock%20ifFalse%3A%20%5B%5D'),
-messageSends: ["ifTrue:ifFalse:"],
+args: ["aNumber"],
+source: unescape('*%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20*%20aNumber%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Boolean);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_ifFalse_'),
+unescape('__plus'),
 smalltalk.method({
-selector: unescape('ifFalse%3A'),
-category: 'controlling',
-fn: function (aBlock) {
+selector: unescape('+'),
+category: 'arithmetic',
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(self, "_ifTrue_ifFalse_", [function () {return nil;}, aBlock]);
+    return self + aNumber;
     return self;
 },
-args: ["aBlock"],
-source: unescape('ifFalse%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself%20ifTrue%3A%20%5B%5D%20ifFalse%3A%20aBlock'),
-messageSends: ["ifTrue:ifFalse:"],
+args: ["aNumber"],
+source: unescape('+%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20+%20aNumber%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Boolean);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_ifFalse_ifTrue_'),
+unescape('__minus'),
 smalltalk.method({
-selector: unescape('ifFalse%3AifTrue%3A'),
-category: 'controlling',
-fn: function (aBlock, anotherBlock) {
+selector: unescape('-'),
+category: 'arithmetic',
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(self, "_ifTrue_ifFalse_", [anotherBlock, aBlock]);
+    return self - aNumber;
     return self;
 },
-args: ["aBlock", "anotherBlock"],
-source: unescape('ifFalse%3A%20aBlock%20ifTrue%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself%20ifTrue%3A%20anotherBlock%20ifFalse%3A%20aBlock'),
-messageSends: ["ifTrue:ifFalse:"],
+args: ["aNumber"],
+source: unescape('-%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20-%20aNumber%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Boolean);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_ifTrue_ifFalse_'),
+unescape('__slash'),
 smalltalk.method({
-selector: unescape('ifTrue%3AifFalse%3A'),
-category: 'controlling',
-fn: function (aBlock, anotherBlock) {
+selector: unescape('/'),
+category: 'arithmetic',
+fn: function (aNumber) {
     var self = this;
-    if (self == true) {
-        return aBlock();
-    } else {
-        return anotherBlock();
-    }
+    return self / aNumber;
     return self;
 },
-args: ["aBlock", "anotherBlock"],
-source: unescape('ifTrue%3A%20aBlock%20ifFalse%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3C%0A%09%20%20%20%20if%28self%20%3D%3D%20true%29%20%7B%0A%09%09return%20aBlock%28%29%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20anotherBlock%28%29%3B%0A%09%20%20%20%20%7D%0A%09%3E'),
+args: ["aNumber"],
+source: unescape('/%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20/%20aNumber%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Boolean);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_and_'),
+unescape('__lt'),
 smalltalk.method({
-selector: unescape('and%3A'),
-category: 'controlling',
-fn: function (aBlock) {
+selector: unescape('%3C'),
+category: 'comparing',
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "__eq", [true]), "_ifTrue_ifFalse_", [aBlock, function () {return false;}]);
+    return self < aNumber;
     return self;
 },
-args: ["aBlock"],
-source: unescape('and%3A%20aBlock%0A%09%5Eself%20%3D%20true%0A%09%20%20%20%20ifTrue%3A%20aBlock%0A%09%20%20%20%20ifFalse%3A%20%5Bfalse%5D'),
-messageSends: ["ifTrue:ifFalse:", unescape("%3D")],
+args: ["aNumber"],
+source: unescape('%3C%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20%3C%20aNumber%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Boolean);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_or_'),
+unescape('__lt_eq'),
 smalltalk.method({
-selector: unescape('or%3A'),
-category: 'controlling',
-fn: function (aBlock) {
+selector: unescape('%3C%3D'),
+category: 'comparing',
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(smalltalk.send(self, "__eq", [true]), "_ifTrue_ifFalse_", [function () {return true;}, aBlock]);
+    return self <= aNumber;
     return self;
 },
-args: ["aBlock"],
-source: unescape('or%3A%20aBlock%0A%09%5Eself%20%3D%20true%0A%09%20%20%20%20ifTrue%3A%20%5Btrue%5D%0A%09%20%20%20%20ifFalse%3A%20aBlock'),
-messageSends: ["ifTrue:ifFalse:", unescape("%3D")],
+args: ["aNumber"],
+source: unescape('%3C%3D%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20%3C%3D%20aNumber%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Boolean);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_not'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('not'),
-category: 'controlling',
-fn: function () {
+selector: unescape('%3D'),
+category: 'comparing',
+fn: function (aNumber) {
     var self = this;
-    return smalltalk.send(self, "__eq", [false]);
-    return self;
+    try {
+        ($receiver = smalltalk.send(aNumber, "_isNumber", [])).klass === smalltalk.Boolean ? !$receiver ? function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return function () {throw {name: "stReturn", selector: "__eq", fn: function () {return false;}};}();}]);
+        return Number(self) == aNumber;
+        return self;
+    } catch (e) {
+        if (e.name === "stReturn" && e.selector === "__eq") {
+            return e.fn();
+        }
+        throw e;
+    }
 },
-args: [],
-source: unescape('not%0A%09%5Eself%20%3D%20false'),
-messageSends: [unescape("%3D")],
+args: ["aNumber"],
+source: unescape('%3D%20aNumber%0A%09aNumber%20isNumber%20ifFalse%3A%20%5B%5Efalse%5D.%20%0A%09%3Creturn%20Number%28self%29%20%3D%3D%20aNumber%3E'),
+messageSends: ["ifFalse:", "isNumber"],
 referencedClasses: []
 }),
-smalltalk.Boolean);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('__gt'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
-fn: function () {
+selector: unescape('%3E'),
+category: 'comparing',
+fn: function (aNumber) {
     var self = this;
-    return self.toString();
+    return self > aNumber;
     return self;
 },
-args: [],
-source: unescape('printString%0A%09%3Creturn%20self.toString%28%29%3E'),
+args: ["aNumber"],
+source: unescape('%3E%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20%3E%3E%20aNumber%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Boolean);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_%26'),
+unescape('__gt_eq'),
 smalltalk.method({
-selector: unescape('%26'),
-category: 'controlling',
-fn: function (aBoolean) {
+selector: unescape('%3E%3D'),
+category: 'comparing',
+fn: function (aNumber) {
     var self = this;
-    if (self == true) {
-        return aBoolean;
-    } else {
-        return false;
-    }
+    return self >= aNumber;
     return self;
 },
-args: ["aBoolean"],
-source: unescape('%26%20aBoolean%0A%09%3C%0A%09%20%20%20%20if%28self%20%3D%3D%20true%29%20%7B%0A%09%09return%20aBoolean%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20false%3B%0A%09%20%20%20%20%7D%0A%09%3E'),
+args: ["aNumber"],
+source: unescape('%3E%3D%20aNumber%0A%09%22Inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%20%3E%3E%3D%20aNumber%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Boolean);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_%7C'),
+unescape('__at'),
 smalltalk.method({
-selector: unescape('%7C'),
-category: 'controlling',
-fn: function (aBoolean) {
+selector: unescape('@'),
+category: 'converting',
+fn: function (aNumber) {
     var self = this;
-    if (self == true) {
-        return true;
-    } else {
-        return aBoolean;
-    }
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [self, aNumber]);
     return self;
 },
-args: ["aBoolean"],
-source: unescape('%7C%20aBoolean%0A%09%3C%0A%09%20%20%20%20if%28self%20%3D%3D%20true%29%20%7B%0A%09%09return%20true%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20aBoolean%3B%0A%09%20%20%20%20%7D%0A%09%3E'),
-messageSends: [],
-referencedClasses: []
+args: ["aNumber"],
+source: unescape('@%20aNumber%0A%09%5EPoint%20x%3A%20self%20y%3A%20aNumber'),
+messageSends: ["x:y:"],
+referencedClasses: ["Point"]
 }),
-smalltalk.Boolean);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asJSON'),
+unescape('_%5C%5C'),
+smalltalk.method({
+selector: unescape('%5C%5C'),
+category: 'arithmetic',
+fn: function (aNumber) {
+    var self = this;
+    return self % aNumber;
+    return self;
+},
+args: ["aNumber"],
+source: unescape('%5C%5C%20aNumber%0A%09%3Creturn%20self%20%25%20aNumber%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+unescape('_asJSON'),
 smalltalk.method({
 selector: unescape('asJSON'),
 category: 'converting',
@@ -2825,1127 +2951,1205 @@ source: unescape('asJSON%0A%09%5Eself'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Boolean);
-
-
+smalltalk.Number);
 
-smalltalk.addClass('Date', smalltalk.Object, [], 'Kernel-Objects');
-smalltalk.Date.comment=unescape('The%20Date%20class%20is%20used%20to%20work%20with%20dates%20and%20times.%20Therefore%20%60Date%20today%60%20and%20%60Date%20now%60%20are%20both%20valid%20in%0AAmber%20and%20answer%20the%20same%20date%20object.%0A%0ADate%20wraps%20the%20%60Date%28%29%60%20JavaScript%20constructor%2C%20and%20Smalltalk%20date%20objects%20are%20JavaScript%20date%20objects.')
 smalltalk.addMethod(
-unescape('_year'),
+unescape('_asJavascript'),
 smalltalk.method({
-selector: unescape('year'),
-category: 'accessing',
+selector: unescape('asJavascript'),
+category: 'converting',
 fn: function () {
     var self = this;
-    return self.getFullYear();
+    return smalltalk.send(smalltalk.send(unescape("%28"), "__comma", [smalltalk.send(self, "_printString", [])]), "__comma", [unescape("%29")]);
     return self;
 },
 args: [],
-source: unescape('year%0A%09%3Creturn%20self.getFullYear%28%29%3E'),
-messageSends: [],
+source: unescape('asJavascript%0A%09%5E%27%28%27%2C%20self%20printString%2C%20%27%29%27'),
+messageSends: [unescape("%2C"), "printString"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_month'),
+unescape('_asPoint'),
 smalltalk.method({
-selector: unescape('month'),
-category: 'accessing',
+selector: unescape('asPoint'),
+category: 'converting',
 fn: function () {
     var self = this;
-    return self.getMonth() + 1;
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [self, self]);
     return self;
 },
 args: [],
-source: unescape('month%0A%09%3Creturn%20self.getMonth%28%29%20+%201%3E'),
-messageSends: [],
-referencedClasses: []
+source: unescape('asPoint%0A%09%5EPoint%20x%3A%20self%20y%3A%20self'),
+messageSends: ["x:y:"],
+referencedClasses: ["Point"]
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_month_'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('month%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('asString'),
+category: 'converting',
+fn: function () {
     var self = this;
-    self.setMonth(aNumber - 1);
+    return smalltalk.send(self, "_printString", []);
     return self;
 },
-args: ["aNumber"],
-source: unescape('month%3A%20aNumber%0A%09%3Cself.setMonth%28aNumber%20-%201%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('asString%0A%09%5Eself%20printString'),
+messageSends: ["printString"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_day'),
+unescape('_atRandom'),
 smalltalk.method({
-selector: unescape('day'),
-category: 'accessing',
+selector: unescape('atRandom'),
+category: 'converting',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_dayOfWeek", []);
+    return ($receiver = smalltalk.send(($receiver = smalltalk.send(smalltalk.send(smalltalk.Random || Random, "_new", []), "_next", [])).klass === smalltalk.Number ? $receiver * self : smalltalk.send($receiver, "__star", [self]), "_truncated", [])).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);
     return self;
 },
 args: [],
-source: unescape('day%0A%09%5Eself%20dayOfWeek'),
-messageSends: ["dayOfWeek"],
-referencedClasses: []
+source: unescape('atRandom%0A%20%20%20%20%5E%28Random%20new%20next%20*%20self%29%20truncated%20+%201'),
+messageSends: [unescape("+"), "truncated", unescape("*"), "next", "new"],
+referencedClasses: ["Random"]
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_dayOfWeek'),
+unescape('_clearInterval'),
 smalltalk.method({
-selector: unescape('dayOfWeek'),
-category: 'accessing',
+selector: unescape('clearInterval'),
+category: 'timeouts/intervals',
 fn: function () {
     var self = this;
-    return self.getDay() + 1;
+    clearInterval(Number(self));
     return self;
 },
 args: [],
-source: unescape('dayOfWeek%0A%09%3Creturn%20self.getDay%28%29%20+%201%3E'),
+source: unescape('clearInterval%0A%09%3CclearInterval%28Number%28self%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_dayOfWeek_'),
+unescape('_clearTimeout'),
 smalltalk.method({
-selector: unescape('dayOfWeek%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('clearTimeout'),
+category: 'timeouts/intervals',
+fn: function () {
     var self = this;
-    return self.setDay(aNumber - 1);
+    clearTimeout(Number(self));
     return self;
 },
-args: ["aNumber"],
-source: unescape('dayOfWeek%3A%20aNumber%0A%09%3Creturn%20self.setDay%28aNumber%20-%201%29%3E'),
+args: [],
+source: unescape('clearTimeout%0A%09%3CclearTimeout%28Number%28self%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_day_'),
+unescape('_copy'),
 smalltalk.method({
-selector: unescape('day%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('copy'),
+category: 'copying',
+fn: function () {
     var self = this;
-    smalltalk.send(self, "_day_", [aNumber]);
     return self;
-},
-args: ["aNumber"],
-source: unescape('day%3A%20aNumber%0A%09self%20day%3A%20aNumber'),
-messageSends: ["day:"],
-referencedClasses: []
-}),
-smalltalk.Date);
-
-smalltalk.addMethod(
-unescape('_year_'),
-smalltalk.method({
-selector: unescape('year%3A'),
-category: 'accessing',
-fn: function (aNumber) {
-    var self = this;
-    self.setFullYear(aNumber);
     return self;
 },
-args: ["aNumber"],
-source: unescape('year%3A%20aNumber%0A%09%3Cself.setFullYear%28aNumber%29%3E'),
+args: [],
+source: unescape('copy%0A%09%5Eself'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_dayOfMonth'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('dayOfMonth'),
-category: 'accessing',
+selector: unescape('deepCopy'),
+category: 'copying',
 fn: function () {
     var self = this;
-    return self.getDate();
+    return smalltalk.send(self, "_copy", []);
     return self;
 },
 args: [],
-source: unescape('dayOfMonth%0A%09%3Creturn%20self.getDate%28%29%3E'),
-messageSends: [],
+source: unescape('deepCopy%0A%09%5Eself%20copy'),
+messageSends: ["copy"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_dayOfMonth_'),
+unescape('_even'),
 smalltalk.method({
-selector: unescape('dayOfMonth%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('even'),
+category: 'testing',
+fn: function () {
     var self = this;
-    self.setDate(aNumber);
+    return smalltalk.send(0, "__eq", [smalltalk.send(self, "_\\\\", [2])]);
     return self;
 },
-args: ["aNumber"],
-source: unescape('dayOfMonth%3A%20aNumber%0A%09%3Cself.setDate%28aNumber%29%3E'),
-messageSends: [],
+args: [],
+source: unescape('even%0A%09%5E%200%20%3D%20%28self%20%5C%5C%202%29'),
+messageSends: [unescape("%3D"), unescape("%5C%5C%5C%5C")],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_identityHash'),
 smalltalk.method({
-selector: unescape('asString'),
-category: 'converting',
+selector: unescape('identityHash'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return self.toString();
+    return smalltalk.send(smalltalk.send(self, "_asString", []), "__comma", ["n"]);
     return self;
 },
 args: [],
-source: unescape('asString%0A%09%3Creturn%20self.toString%28%29%3E'),
-messageSends: [],
+source: unescape('identityHash%0A%09%5Eself%20asString%2C%20%27n%27'),
+messageSends: [unescape("%2C"), "asString"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_isNumber'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
+selector: unescape('isNumber'),
+category: 'testing',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_asString", []);
+    return true;
     return self;
 },
 args: [],
-source: unescape('printString%0A%09%5Eself%20asString'),
-messageSends: ["asString"],
+source: unescape('isNumber%0A%09%5Etrue'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asMilliseconds'),
+unescape('_isZero'),
 smalltalk.method({
-selector: unescape('asMilliseconds'),
-category: 'converting',
+selector: unescape('isZero'),
+category: 'testing',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_time", []);
+    return smalltalk.send(self, "__eq", [0]);
     return self;
 },
 args: [],
-source: unescape('asMilliseconds%0A%09%5Eself%20time'),
-messageSends: ["time"],
+source: unescape('isZero%0A%09%5Eself%20%3D%200'),
+messageSends: [unescape("%3D")],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_time'),
+unescape('_max_'),
 smalltalk.method({
-selector: unescape('time'),
-category: 'accessing',
-fn: function () {
+selector: unescape('max%3A'),
+category: 'arithmetic',
+fn: function (aNumber) {
     var self = this;
-    return self.getTime();
+    return Math.max(self, aNumber);
     return self;
 },
-args: [],
-source: unescape('time%0A%09%3Creturn%20self.getTime%28%29%3E'),
+args: ["aNumber"],
+source: unescape('max%3A%20aNumber%0A%09%3Creturn%20Math.max%28self%2C%20aNumber%29%3B%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_time_'),
+unescape('_min_'),
 smalltalk.method({
-selector: unescape('time%3A'),
-category: 'accessing',
+selector: unescape('min%3A'),
+category: 'arithmetic',
 fn: function (aNumber) {
     var self = this;
-    self.setTime(aNumber);
+    return Math.min(self, aNumber);
     return self;
 },
 args: ["aNumber"],
-source: unescape('time%3A%20aNumber%0A%09%3Cself.setTime%28aNumber%29%3E'),
+source: unescape('min%3A%20aNumber%0A%09%3Creturn%20Math.min%28self%2C%20aNumber%29%3B%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asDateString'),
+unescape('_negated'),
 smalltalk.method({
-selector: unescape('asDateString'),
-category: 'converting',
+selector: unescape('negated'),
+category: 'arithmetic',
 fn: function () {
     var self = this;
-    return self.toDateString();
+    return 0 - self;
     return self;
 },
 args: [],
-source: unescape('asDateString%0A%09%3Creturn%20self.toDateString%28%29%3E'),
-messageSends: [],
+source: unescape('negated%0A%09%5E0%20-%20self'),
+messageSends: [unescape("-")],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asTimeString'),
+unescape('_negative'),
 smalltalk.method({
-selector: unescape('asTimeString'),
-category: 'converting',
+selector: unescape('negative'),
+category: 'testing',
 fn: function () {
     var self = this;
-    return self.toTimeString();
+    return self < 0;
     return self;
 },
 args: [],
-source: unescape('asTimeString%0A%09%3Creturn%20self.toTimeString%28%29%3E'),
-messageSends: [],
+source: unescape('negative%0A%09%22Answer%20whether%20the%20receiver%20is%20mathematically%20negative.%22%0A%0A%09%5E%20self%20%3C%200'),
+messageSends: [unescape("%3C")],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asLocaleString'),
+unescape('_odd'),
 smalltalk.method({
-selector: unescape('asLocaleString'),
-category: 'converting',
+selector: unescape('odd'),
+category: 'testing',
 fn: function () {
     var self = this;
-    return self.toLocaleString();
+    return smalltalk.send(smalltalk.send(self, "_even", []), "_not", []);
     return self;
 },
 args: [],
-source: unescape('asLocaleString%0A%09%3Creturn%20self.toLocaleString%28%29%3E'),
-messageSends: [],
+source: unescape('odd%0A%09%5E%20self%20even%20not'),
+messageSends: ["not", "even"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_asNumber'),
+unescape('_positive'),
 smalltalk.method({
-selector: unescape('asNumber'),
-category: 'converting',
+selector: unescape('positive'),
+category: 'testing',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_asMilliseconds", []);
+    return self >= 0;
     return self;
 },
 args: [],
-source: unescape('asNumber%0A%09%5Eself%20asMilliseconds'),
-messageSends: ["asMilliseconds"],
+source: unescape('positive%0A%09%22Answer%20whether%20the%20receiver%20is%20positive%20or%20equal%20to%200.%20%28ST-80%20protocol%29.%22%0A%0A%09%5E%20self%20%3E%3D%200'),
+messageSends: [unescape("%3E%3D")],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_hours_'),
+unescape('_printShowingDecimalPlaces_'),
 smalltalk.method({
-selector: unescape('hours%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('printShowingDecimalPlaces%3A'),
+category: 'printing',
+fn: function (placesDesired) {
     var self = this;
-    self.setHours(aNumber);
+    return self.toFixed(placesDesired);
     return self;
 },
-args: ["aNumber"],
-source: unescape('hours%3A%20aNumber%0A%09%3Cself.setHours%28aNumber%29%3E'),
+args: ["placesDesired"],
+source: unescape('printShowingDecimalPlaces%3A%20placesDesired%0A%09%3Creturn%20self.toFixed%28placesDesired%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_minutes_'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('minutes%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('printString'),
+category: 'printing',
+fn: function () {
     var self = this;
-    self.setMinutes(aNumber);
+    return String(self);
     return self;
 },
-args: ["aNumber"],
-source: unescape('minutes%3A%20aNumber%0A%09%3Cself.setMinutes%28aNumber%29%3E'),
+args: [],
+source: unescape('printString%0A%09%3Creturn%20String%28self%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_seconds_'),
+unescape('_rounded'),
 smalltalk.method({
-selector: unescape('seconds%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('rounded'),
+category: 'converting',
+fn: function () {
     var self = this;
-    self.setSeconds(aNumber);
+    return Math.round(self);
     return self;
 },
-args: ["aNumber"],
-source: unescape('seconds%3A%20aNumber%0A%09%3Cself.setSeconds%28aNumber%29%3E'),
+args: [],
+source: unescape('rounded%0A%09%3Creturn%20Math.round%28self%29%3B%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_milliseconds_'),
+unescape('_sqrt'),
 smalltalk.method({
-selector: unescape('milliseconds%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('sqrt'),
+category: 'arithmetic',
+fn: function () {
     var self = this;
-    self.setMilliseconds(aNumber);
+    return Math.sqrt(self);
     return self;
 },
-args: ["aNumber"],
-source: unescape('milliseconds%3A%20aNumber%0A%09%3Cself.setMilliseconds%28aNumber%29%3E'),
+args: [],
+source: unescape('sqrt%0A%09%3Creturn%20Math.sqrt%28self%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_hours'),
+unescape('_squared'),
 smalltalk.method({
-selector: unescape('hours'),
-category: 'accessing',
+selector: unescape('squared'),
+category: 'arithmetic',
 fn: function () {
     var self = this;
-    return self.getHours();
+    return self * self;
     return self;
 },
 args: [],
-source: unescape('hours%0A%09%3Creturn%20self.getHours%28%29%3E'),
-messageSends: [],
+source: unescape('squared%0A%09%5Eself%20*%20self'),
+messageSends: [unescape("*")],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_minutes'),
+unescape('_timesRepeat_'),
 smalltalk.method({
-selector: unescape('minutes'),
-category: 'accessing',
-fn: function () {
+selector: unescape('timesRepeat%3A'),
+category: 'enumerating',
+fn: function (aBlock) {
     var self = this;
-    return self.getMinutes();
+    var integer = nil;
+    var count = nil;
+    integer = smalltalk.send(self, "_truncated", []);
+    count = 1;
+    (function () {while (!function () {return ($receiver = count).klass === smalltalk.Number ? $receiver > self : smalltalk.send($receiver, "__gt", [self]);}()) {(function () {smalltalk.send(aBlock, "_value", []);return count = ($receiver = count).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}());}}());
     return self;
 },
-args: [],
-source: unescape('minutes%0A%09%3Creturn%20self.getMinutes%28%29%3E'),
-messageSends: [],
+args: ["aBlock"],
+source: unescape('timesRepeat%3A%20aBlock%0A%09%7C%20integer%20count%20%7C%0A%09integer%20%3A%3D%20self%20truncated.%0A%09count%20%3A%3D%201.%0A%09%5Bcount%20%3E%20self%5D%20whileFalse%3A%20%5B%0A%09%20%20%20%20aBlock%20value.%0A%09%20%20%20%20count%20%3A%3D%20count%20+%201%5D'),
+messageSends: ["truncated", "whileFalse:", unescape("%3E"), "value", unescape("+")],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_seconds'),
+unescape('_to_'),
 smalltalk.method({
-selector: unescape('seconds'),
-category: 'accessing',
-fn: function () {
+selector: unescape('to%3A'),
+category: 'converting',
+fn: function (aNumber) {
     var self = this;
-    return self.getSeconds();
+    var array = nil;
+    var first = nil;
+    var last = nil;
+    var count = nil;
+    first = smalltalk.send(self, "_truncated", []);
+    last = ($receiver = smalltalk.send(aNumber, "_truncated", [])).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);
+    count = 1;
+    array = smalltalk.send(smalltalk.Array || Array, "_new", []);
+    smalltalk.send(($receiver = last).klass === smalltalk.Number ? $receiver - first : smalltalk.send($receiver, "__minus", [first]), "_timesRepeat_", [function () {smalltalk.send(array, "_at_put_", [count, first]);count = ($receiver = count).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return first = ($receiver = first).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}]);
+    return array;
     return self;
 },
-args: [],
-source: unescape('seconds%0A%09%3Creturn%20self.getSeconds%28%29%3E'),
-messageSends: [],
-referencedClasses: []
+args: ["aNumber"],
+source: unescape('to%3A%20aNumber%0A%09%7C%20array%20first%20last%20count%20%7C%0A%09first%20%3A%3D%20self%20truncated.%0A%09last%20%3A%3D%20aNumber%20truncated%20+%201.%0A%09count%20%3A%3D%201.%0A%09array%20%3A%3D%20Array%20new.%0A%09%28last%20-%20first%29%20timesRepeat%3A%20%5B%0A%09%20%20%20%20array%20at%3A%20count%20put%3A%20first.%0A%09%20%20%20%20count%20%3A%3D%20count%20+%201.%0A%09%20%20%20%20first%20%3A%3D%20first%20+%201%5D.%0A%09%5Earray'),
+messageSends: ["truncated", unescape("+"), "new", "timesRepeat:", unescape("-"), "at:put:"],
+referencedClasses: ["Array"]
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('_milliseconds'),
+unescape('_to_by_'),
 smalltalk.method({
-selector: unescape('milliseconds'),
-category: 'accessing',
-fn: function () {
+selector: unescape('to%3Aby%3A'),
+category: 'converting',
+fn: function (stop, step) {
     var self = this;
-    return self.getMilliseconds();
+    var array = nil;
+    var value = nil;
+    var pos = nil;
+    value = self;
+    array = smalltalk.send(smalltalk.Array || Array, "_new", []);
+    pos = 1;
+    ($receiver = smalltalk.send(step, "__eq", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}]);
+    ($receiver = ($receiver = step).klass === smalltalk.Number ? $receiver < 0 : smalltalk.send($receiver, "__lt", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}, function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(array, "_at_put_", [pos, value]);pos = ($receiver = pos).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}]);
+    return array;
     return self;
 },
-args: [],
-source: unescape('milliseconds%0A%09%3Creturn%20self.getMilliseconds%28%29%3E'),
-messageSends: [],
-referencedClasses: []
+args: ["stop", "step"],
+source: unescape('to%3A%20stop%20by%3A%20step%0A%09%7C%20array%20value%20pos%20%7C%0A%09value%20%3A%3D%20self.%0A%09array%20%3A%3D%20Array%20new.%0A%09pos%20%3A%3D%201.%0A%09step%20%3D%200%20ifTrue%3A%20%5Bself%20error%3A%20%27step%20must%20be%20non-zero%27%5D.%0A%09step%20%3C%200%0A%09%09ifTrue%3A%20%5B%5B%20value%20%3E%3D%20stop%20%5D%20whileTrue%3A%20%5B%0A%09%20%20%20%20%09%09%09array%20at%3A%20pos%20put%3A%20value.%0A%09%20%20%20%20%09%09%09pos%20%3A%3D%20pos%20+%201.%0A%09%20%20%20%20%09%09%09value%20%3A%3D%20value%20+%20step%5D%5D%0A%09%09ifFalse%3A%20%5B%5B%20value%20%3C%3D%20stop%20%5D%20whileTrue%3A%20%5B%0A%09%20%20%20%20%09%09%09array%20at%3A%20pos%20put%3A%20value.%0A%09%20%20%09%09%09pos%20%3A%3D%20pos%20+%201.%0A%09%20%20%20%20%09%09%09value%20%3A%3D%20value%20+%20step%5D%5D.%0A%09%5Earray'),
+messageSends: ["new", "ifTrue:", unescape("%3D"), "error:", "ifTrue:ifFalse:", unescape("%3C"), "whileTrue:", unescape("%3E%3D"), "at:put:", unescape("+"), unescape("%3C%3D")],
+referencedClasses: ["Array"]
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('__lt'),
+unescape('_to_by_do_'),
 smalltalk.method({
-selector: unescape('%3C'),
-category: 'comparing',
-fn: function (aDate) {
+selector: unescape('to%3Aby%3Ado%3A'),
+category: 'enumerating',
+fn: function (stop, step, aBlock) {
     var self = this;
-    return self < aDate;
+    var value = nil;
+    value = self;
+    ($receiver = smalltalk.send(step, "__eq", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [unescape("step%20must%20be%20non-zero")]);}]);
+    ($receiver = ($receiver = step).klass === smalltalk.Number ? $receiver < 0 : smalltalk.send($receiver, "__lt", [0])).klass === smalltalk.Boolean ? $receiver ? function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver >= stop : smalltalk.send($receiver, "__gt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}, function () {return function () {while (function () {return ($receiver = value).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [value]);return value = ($receiver = value).klass === smalltalk.Number ? $receiver + step : smalltalk.send($receiver, "__plus", [step]);}());}}();}]);
     return self;
 },
-args: ["aDate"],
-source: unescape('%3C%20aDate%0A%09%3Creturn%20self%20%3C%20aDate%3E'),
-messageSends: [],
+args: ["stop", "step", "aBlock"],
+source: unescape('to%3A%20stop%20by%3A%20step%20do%3A%20aBlock%0A%09%7C%20value%20%7C%0A%09value%20%3A%3D%20self.%0A%09step%20%3D%200%20ifTrue%3A%20%5Bself%20error%3A%20%27step%20must%20be%20non-zero%27%5D.%0A%09step%20%3C%200%0A%09%09ifTrue%3A%20%5B%5B%20value%20%3E%3D%20stop%20%5D%20whileTrue%3A%20%5B%0A%09%20%20%20%20%09%09%09aBlock%20value%3A%20value.%0A%09%20%20%20%20%09%09%09value%20%3A%3D%20value%20+%20step%5D%5D%0A%09%09ifFalse%3A%20%5B%5B%20value%20%3C%3D%20stop%20%5D%20whileTrue%3A%20%5B%0A%09%20%20%20%20%09%09%09aBlock%20value%3A%20value.%0A%09%20%20%20%20%09%09%09value%20%3A%3D%20value%20+%20step%5D%5D'),
+messageSends: ["ifTrue:", unescape("%3D"), "error:", "ifTrue:ifFalse:", unescape("%3C"), "whileTrue:", unescape("%3E%3D"), "value:", unescape("+"), unescape("%3C%3D")],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('__gt'),
+unescape('_to_do_'),
 smalltalk.method({
-selector: unescape('%3E'),
-category: 'comparing',
-fn: function (aDate) {
+selector: unescape('to%3Ado%3A'),
+category: 'enumerating',
+fn: function (stop, aBlock) {
     var self = this;
-    return self > aDate;
+    var nextValue = nil;
+    nextValue = self;
+    (function () {while (function () {return ($receiver = nextValue).klass === smalltalk.Number ? $receiver <= stop : smalltalk.send($receiver, "__lt_eq", [stop]);}()) {(function () {smalltalk.send(aBlock, "_value_", [nextValue]);return nextValue = ($receiver = nextValue).klass === smalltalk.Number ? $receiver + 1 : smalltalk.send($receiver, "__plus", [1]);}());}}());
     return self;
 },
-args: ["aDate"],
-source: unescape('%3E%20aDate%0A%09%3Creturn%20self%20%3E%3E%20aDate%3E'),
-messageSends: [],
+args: ["stop", "aBlock"],
+source: unescape('to%3A%20stop%20do%3A%20aBlock%0A%09%22Evaluate%20aBlock%20for%20each%20number%20from%20self%20to%20aNumber.%22%0A%09%7C%20nextValue%20%7C%0A%09nextValue%20%3A%3D%20self.%0A%09%5BnextValue%20%3C%3D%20stop%5D%0A%09%09whileTrue%3A%20%0A%09%09%09%5BaBlock%20value%3A%20nextValue.%0A%09%09%09nextValue%20%3A%3D%20nextValue%20+%201%5D'),
+messageSends: ["whileTrue:", unescape("%3C%3D"), "value:", unescape("+")],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
 
 smalltalk.addMethod(
-unescape('__lt_eq'),
+unescape('_truncated'),
 smalltalk.method({
-selector: unescape('%3C%3D'),
-category: 'comparing',
-fn: function (aDate) {
+selector: unescape('truncated'),
+category: 'converting',
+fn: function () {
     var self = this;
-    return self <= aDate;
-    return self;
+    var result = nil;
+    ($receiver = self >= 0).klass === smalltalk.Boolean ? $receiver ? function () {return result = Math.floor(self);}() : function () {return result = Math.floor(self * -1) * -1;}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return result = Math.floor(self);}, function () {return result = Math.floor(self * -1) * -1;}]);
+    return result;
+    return self;
 },
-args: ["aDate"],
-source: unescape('%3C%3D%20aDate%0A%09%3Creturn%20self%20%3C%3D%20aDate%3E'),
-messageSends: [],
+args: [],
+source: unescape('truncated%0A%7Cresult%7C%0A%0A%20%20%20%20self%20%3E%3D%200%20%0A%20%20%20%20%20%20%20%20ifTrue%3A%20%5B%3Cresult%20%3D%20Math.floor%28self%29%3B%3E%5D%0A%20%20%20%20%20%20%20%20ifFalse%3A%20%5B%3Cresult%20%3D%20%28Math.floor%28self%20*%20%28-1%29%29%20*%20%28-1%29%29%3B%3E%5D.%0A%0A%20%20%20%20%5E%20result'),
+messageSends: ["ifTrue:ifFalse:", unescape("%3E%3D")],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number);
+
 
 smalltalk.addMethod(
-unescape('__gt_eq'),
+unescape('_pi'),
 smalltalk.method({
-selector: unescape('%3E%3D'),
-category: 'comparing',
-fn: function (aDate) {
+selector: unescape('pi'),
+category: 'instance creation',
+fn: function () {
     var self = this;
-    return self >= aDate;
+    return Math.PI;
     return self;
 },
-args: ["aDate"],
-source: unescape('%3E%3D%20aDate%0A%09%3Creturn%20self%20%3E%3E%3D%20aDate%3E'),
+args: [],
+source: unescape('pi%0A%09%3Creturn%20Math.PI%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Number.klass);
+
 
+smalltalk.addClass('Package', smalltalk.Object, ['commitPathJs', 'commitPathSt'], 'Kernel-Objects');
+smalltalk.Package.comment=unescape('A%20Package%20is%20similar%20to%20a%20%22class%20category%22%20typically%20found%20in%20other%20Smalltalks%20like%20Pharo%20or%20Squeak.%20Amber%20does%20not%20have%20class%20categories%20anymore%2C%20it%20had%20in%20the%20beginning%20but%20now%20each%20class%20in%20the%20system%20knows%20which%20package%20it%20belongs%20to.%0A%0AA%20Package%20has%20a%20name%2C%20an%20Array%20of%20%22requires%22%2C%20a%20comment%20and%20a%20Dictionary%20with%20other%20optional%20key%20value%20attributes.%20A%20Package%20can%20also%20be%20queried%20for%20its%20classes%2C%20but%20it%20will%20then%20resort%20to%20a%20reverse%20scan%20of%20all%20classes%20to%20find%20them.%0APackages%20are%20manipulated%20through%20%22Smalltalk%20current%22%2C%20like%20for%20example%20finding%20one%20based%20on%20a%20name%3A%0A%0A%09Smalltalk%20current%20packageAt%3A%20%27Kernel%27%0A%0A...but%20you%20can%20also%20use%3A%0A%0A%09Package%20named%3A%20%27Kernel%27%0A%0AA%20Package%20differs%20slightly%20from%20a%20Monticello%20package%20which%20can%20span%20multiple%20class%20categories%20using%20a%20naming%20convention%20based%20on%20hyphenation.%20But%20just%20as%20in%20Monticello%20a%20Package%20supports%20%22class%20extensions%22%20so%20a%20Package%0Acan%20define%20behaviors%20in%20foreign%20classes%20using%20a%20naming%20convention%20for%20method%20categories%20where%20the%20category%20starts%20with%20an%20asterisk%20and%20then%20the%20name%20of%20the%20owning%20package%20follows.%20This%20can%20easily%20be%20seen%20in%20for%20example%20class%0AString%20where%20the%20method%20category%20%22*IDE%22%20defines%20%23inspectOn%3A%20which%20thus%20is%20a%20method%20belonging%20to%20the%20IDE%20package.%0A%0AYou%20can%20fetch%20a%20package%20from%20the%20server%3A%0A%0A%09Package%20fetch%3A%20%27Additional-Examples%27')
 smalltalk.addMethod(
-unescape('__minus'),
+unescape('_classes'),
 smalltalk.method({
-selector: unescape('-'),
-category: 'arithmetic',
-fn: function (aDate) {
+selector: unescape('classes'),
+category: 'classes',
+fn: function () {
     var self = this;
-    return self - aDate;
+    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_classes", []), "_select_", [function (c) {return smalltalk.send(smalltalk.send(c, "_package", []), "__eq_eq", [self]);}]);
     return self;
 },
-args: ["aDate"],
-source: unescape('-%20aDate%0A%09%3Creturn%20self%20-%20aDate%3E'),
-messageSends: [],
-referencedClasses: []
+args: [],
+source: unescape('classes%0A%09%22We%20need%20to%20do%20a%20reverse%20scan.%22%0A%09%5ESmalltalk%20current%20classes%20select%3A%20%5B%3Ac%20%7C%20c%20package%20%3D%3D%20self%5D'),
+messageSends: ["select:", "classes", "current", unescape("%3D%3D"), "package"],
+referencedClasses: ["Smalltalk"]
 }),
-smalltalk.Date);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('__plus'),
+unescape('_commitPathJs'),
 smalltalk.method({
-selector: unescape('+'),
-category: 'arithmetic',
-fn: function (aDate) {
+selector: unescape('commitPathJs'),
+category: 'accessing',
+fn: function () {
     var self = this;
-    return self + aDate;
+    return ($receiver = self['@commitPathJs']) == nil ||
+        $receiver == undefined ? function () {return smalltalk.send(smalltalk.send(self, "_class", []), "_defaultCommitPathJs", []);}() : $receiver;
     return self;
 },
-args: ["aDate"],
-source: unescape('+%20aDate%0A%09%3Creturn%20self%20+%20aDate%3E'),
-messageSends: [],
+args: [],
+source: unescape('commitPathJs%0A%09%5E%20commitPathJs%20ifNil%3A%20%5Bself%20class%20defaultCommitPathJs%5D'),
+messageSends: ["ifNil:", "defaultCommitPathJs", "class"],
 referencedClasses: []
 }),
-smalltalk.Date);
-
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_new_'),
+unescape('_commitPathJs_'),
 smalltalk.method({
-selector: unescape('new%3A'),
-category: 'instance creation',
-fn: function (anObject) {
+selector: unescape('commitPathJs%3A'),
+category: 'accessing',
+fn: function (aString) {
     var self = this;
-    return new Date(anObject);
+    self['@commitPathJs'] = aString;
     return self;
 },
-args: ["anObject"],
-source: unescape('new%3A%20anObject%0A%09%3Creturn%20new%20Date%28anObject%29%3E'),
+args: ["aString"],
+source: unescape('commitPathJs%3A%20aString%0A%09commitPathJs%A0%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date.klass);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_fromString_'),
+unescape('_commitPathSt'),
 smalltalk.method({
-selector: unescape('fromString%3A'),
-category: 'instance creation',
-fn: function (aString) {
+selector: unescape('commitPathSt'),
+category: 'accessing',
+fn: function () {
     var self = this;
-    return smalltalk.send(self, "_new_", [aString]);
+    return ($receiver = self['@commitPathSt']) == nil ||
+        $receiver == undefined ? function () {return smalltalk.send(smalltalk.send(self, "_class", []), "_defaultCommitPathSt", []);}() : $receiver;
     return self;
 },
-args: ["aString"],
-source: unescape('fromString%3A%20aString%0A%09%22Example%3A%20Date%20fromString%28%272011/04/15%2000%3A00%3A00%27%29%22%0A%09%5Eself%20new%3A%20aString'),
-messageSends: ["new:"],
+args: [],
+source: unescape('commitPathSt%0A%09%5E%20commitPathSt%20ifNil%3A%20%5Bself%20class%20defaultCommitPathSt%5D'),
+messageSends: ["ifNil:", "defaultCommitPathSt", "class"],
 referencedClasses: []
 }),
-smalltalk.Date.klass);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_fromSeconds_'),
+unescape('_commitPathSt_'),
 smalltalk.method({
-selector: unescape('fromSeconds%3A'),
-category: 'instance creation',
-fn: function (aNumber) {
+selector: unescape('commitPathSt%3A'),
+category: 'accessing',
+fn: function (aString) {
     var self = this;
-    return smalltalk.send(self, "_fromMilliseconds_", [($receiver = aNumber).klass === smalltalk.Number ? $receiver * 1000 : smalltalk.send($receiver, "__star", [1000])]);
+    self['@commitPathSt'] = aString;
     return self;
 },
-args: ["aNumber"],
-source: unescape('fromSeconds%3A%20aNumber%0A%09%5Eself%20fromMilliseconds%3A%20aNumber%20*%201000'),
-messageSends: ["fromMilliseconds:", unescape("*")],
+args: ["aString"],
+source: unescape('commitPathSt%3A%20aString%0A%09commitPathSt%A0%3A%3D%20aString'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date.klass);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_fromMilliseconds_'),
+unescape('_dependencies'),
 smalltalk.method({
-selector: unescape('fromMilliseconds%3A'),
-category: 'instance creation',
-fn: function (aNumber) {
+selector: unescape('dependencies'),
+category: 'accessing',
+fn: function () {
     var self = this;
-    return smalltalk.send(self, "_new_", [aNumber]);
+    return smalltalk.send(self, "_propertyAt_ifAbsent_", ["dependencies", function () {return [];}]);
     return self;
 },
-args: ["aNumber"],
-source: unescape('fromMilliseconds%3A%20aNumber%0A%09%5Eself%20new%3A%20aNumber'),
-messageSends: ["new:"],
+args: [],
+source: unescape('dependencies%0A%09%5Eself%20propertyAt%3A%20%27dependencies%27%20ifAbsent%3A%20%5B%23%28%29%5D'),
+messageSends: ["propertyAt:ifAbsent:"],
 referencedClasses: []
 }),
-smalltalk.Date.klass);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_today'),
+unescape('_dependencies_'),
 smalltalk.method({
-selector: unescape('today'),
-category: 'instance creation',
-fn: function () {
+selector: unescape('dependencies%3A'),
+category: 'accessing',
+fn: function (anArray) {
     var self = this;
-    return smalltalk.send(self, "_new", []);
+    return smalltalk.send(self, "_propertyAt_put_", ["dependencies", anArray]);
     return self;
 },
-args: [],
-source: unescape('today%0A%09%5Eself%20new'),
-messageSends: ["new"],
+args: ["anArray"],
+source: unescape('dependencies%3A%20anArray%0A%09%5Eself%20propertyAt%3A%20%27dependencies%27%20put%3A%20anArray'),
+messageSends: ["propertyAt:put:"],
 referencedClasses: []
 }),
-smalltalk.Date.klass);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_now'),
+unescape('_jsProperties'),
 smalltalk.method({
-selector: unescape('now'),
-category: 'instance creation',
+selector: unescape('jsProperties'),
+category: 'private',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_today", []);
+    return self.properties;
     return self;
 },
 args: [],
-source: unescape('now%0A%09%5Eself%20today'),
-messageSends: ["today"],
+source: unescape('jsProperties%0A%09%3Creturn%20self.properties%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date.klass);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_millisecondsToRun_'),
+unescape('_jsProperties_'),
 smalltalk.method({
-selector: unescape('millisecondsToRun%3A'),
-category: 'instance creation',
-fn: function (aBlock) {
+selector: unescape('jsProperties%3A'),
+category: 'private',
+fn: function (aJSObject) {
     var self = this;
-    var t = nil;
-    t = smalltalk.send(smalltalk.Date || Date, "_now", []);
-    smalltalk.send(aBlock, "_value", []);
-    return ($receiver = smalltalk.send(smalltalk.Date || Date, "_now", [])).klass === smalltalk.Number ? $receiver - t : smalltalk.send($receiver, "__minus", [t]);
+    return self.properties = aJSObject;
     return self;
 },
-args: ["aBlock"],
-source: unescape('millisecondsToRun%3A%20aBlock%0A%09%7C%20t%20%7C%0A%09t%20%3A%3D%20Date%20now.%0A%09aBlock%20value.%0A%09%5EDate%20now%20-%20t'),
-messageSends: ["now", "value", unescape("-")],
-referencedClasses: ["Date"]
+args: ["aJSObject"],
+source: unescape('jsProperties%3A%20aJSObject%0A%09%3Creturn%20self.properties%20%3D%20aJSObject%3E'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Date.klass);
-
+smalltalk.Package);
 
-smalltalk.addClass('UndefinedObject', smalltalk.Object, [], 'Kernel-Objects');
-smalltalk.UndefinedObject.comment=unescape('UndefinedObject%20describes%20the%20behavior%20of%20its%20sole%20instance%2C%20%60nil%60.%20%60nil%60%20represents%20a%20prior%20value%20for%20variables%20that%20have%20not%20been%20initialized%2C%20or%20for%20results%20which%20are%20meaningless.%0A%0A%60nil%60%20is%20the%20Smalltalk%20representation%20of%20the%20%60undefined%60%20JavaScript%20object.')
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_'),
+unescape('_name'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3A'),
-category: 'class creation',
-fn: function (aString, anotherString) {
+selector: unescape('name'),
+category: 'accessing',
+fn: function () {
     var self = this;
-    return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, anotherString, nil]);
+    return self.pkgName;
     return self;
 },
-args: ["aString", "anotherString"],
-source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%20package%3A%20nil'),
-messageSends: ["subclass:instanceVariableNames:package:"],
+args: [],
+source: unescape('name%0A%09%3Creturn%20self.pkgName%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_category_'),
+unescape('_name_'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3Acategory%3A'),
-category: 'class creation',
-fn: function (aString, aString2, aString3) {
+selector: unescape('name%3A'),
+category: 'accessing',
+fn: function (aString) {
     var self = this;
-    smalltalk.send(self, "_deprecatedAPI", []);
-    return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
+    self.pkgName = aString;
     return self;
 },
-args: ["aString", "aString2", "aString3"],
-source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%22Kept%20for%20compatibility.%22%0A%09self%20deprecatedAPI.%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3'),
-messageSends: ["deprecatedAPI", "subclass:instanceVariableNames:package:"],
+args: ["aString"],
+source: unescape('name%3A%20aString%0A%09%3Cself.pkgName%20%3D%20aString%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_shallowCopy'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('shallowCopy'),
-category: 'copying',
+selector: unescape('printString'),
+category: 'printing',
 fn: function () {
     var self = this;
-    return self;
+    return smalltalk.send(self, "_name", []);
     return self;
 },
 args: [],
-source: unescape('shallowCopy%0A%09%5Eself'),
-messageSends: [],
+source: unescape('printString%0A%09%5Eself%20name'),
+messageSends: ["name"],
 referencedClasses: []
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_deepCopy'),
+unescape('_properties'),
 smalltalk.method({
-selector: unescape('deepCopy'),
-category: 'copying',
+selector: unescape('properties'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return self;
+    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_readJSObject_", [smalltalk.send(self, "_basicAt_", ["properties"])]);
     return self;
 },
 args: [],
-source: unescape('deepCopy%0A%09%5Eself'),
-messageSends: [],
-referencedClasses: []
+source: unescape('properties%0A%09%5ESmalltalk%20current%20readJSObject%3A%20%28self%20basicAt%3A%20%27properties%27%29'),
+messageSends: ["readJSObject:", "current", "basicAt:"],
+referencedClasses: ["Smalltalk"]
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_ifNil_'),
+unescape('_properties_'),
 smalltalk.method({
-selector: unescape('ifNil%3A'),
-category: 'testing',
-fn: function (aBlock) {
+selector: unescape('properties%3A'),
+category: 'accessing',
+fn: function (aDict) {
     var self = this;
-    return smalltalk.send(self, "_ifNil_ifNotNil_", [aBlock, function () {return nil;}]);
+    var object = nil;
+    object = {};
+    smalltalk.send(aDict, "_keysAndValuesDo_", [function (key, value) {return object[key] = value;}]);
+    return self.properties = object;
     return self;
 },
-args: ["aBlock"],
-source: unescape('ifNil%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself%20ifNil%3A%20aBlock%20ifNotNil%3A%20%5B%5D'),
-messageSends: ["ifNil:ifNotNil:"],
+args: ["aDict"],
+source: unescape('properties%3A%20aDict%0A%09%22We%20store%20it%20as%20a%20javascript%20object.%22%0A%09%0A%09%7C%20object%20%7C%0A%09%3Cobject%20%3D%20%7B%7D%3B%3E.%0A%09aDict%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%09%3Cobject%5Bkey%5D%20%3D%20value%3E.%0A%09%5D.%0A%09%3Creturn%20self.properties%20%3D%20object%3E'),
+messageSends: ["keysAndValuesDo:"],
 referencedClasses: []
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_ifNotNil_'),
+unescape('_propertiesAsJSON'),
 smalltalk.method({
-selector: unescape('ifNotNil%3A'),
-category: 'testing',
-fn: function (aBlock) {
+selector: unescape('propertiesAsJSON'),
+category: 'private',
+fn: function () {
     var self = this;
-    return self;
+    return JSON.stringify(self.properties);
     return self;
 },
-args: ["aBlock"],
-source: unescape('ifNotNil%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself'),
+args: [],
+source: unescape('propertiesAsJSON%0A%09%3Creturn%20JSON.stringify%28self.properties%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_ifNil_ifNotNil_'),
+unescape('_propertyAt_'),
 smalltalk.method({
-selector: unescape('ifNil%3AifNotNil%3A'),
-category: 'testing',
-fn: function (aBlock, anotherBlock) {
+selector: unescape('propertyAt%3A'),
+category: 'properties',
+fn: function (key) {
     var self = this;
-    return smalltalk.send(aBlock, "_value", []);
+    return self.properties[key];
     return self;
 },
-args: ["aBlock", "anotherBlock"],
-source: unescape('ifNil%3A%20aBlock%20ifNotNil%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5EaBlock%20value'),
-messageSends: ["value"],
+args: ["key"],
+source: unescape('propertyAt%3A%20key%0A%0A%09%3Creturn%20self.properties%5Bkey%5D%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_ifNotNil_ifNil_'),
+unescape('_propertyAt_ifAbsent_'),
 smalltalk.method({
-selector: unescape('ifNotNil%3AifNil%3A'),
-category: 'testing',
-fn: function (aBlock, anotherBlock) {
+selector: unescape('propertyAt%3AifAbsent%3A'),
+category: 'properties',
+fn: function (key, block) {
     var self = this;
-    return smalltalk.send(anotherBlock, "_value", []);
+    return ($receiver = smalltalk.send(self, "_propertyAt_", [key])) == nil ||
+        $receiver == undefined ? function () {return smalltalk.send(block, "_value", []);}() : $receiver;
     return self;
 },
-args: ["aBlock", "anotherBlock"],
-source: unescape('ifNotNil%3A%20aBlock%20ifNil%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5EanotherBlock%20value'),
-messageSends: ["value"],
+args: ["key", "block"],
+source: unescape('propertyAt%3A%20key%20ifAbsent%3A%20block%0A%0A%09%5E%28self%20propertyAt%3A%20key%29%20ifNil%3A%20%5Bblock%20value%5D'),
+messageSends: ["ifNil:", "propertyAt:", "value"],
 referencedClasses: []
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_isNil'),
+unescape('_propertyAt_put_'),
 smalltalk.method({
-selector: unescape('isNil'),
-category: 'testing',
-fn: function () {
+selector: unescape('propertyAt%3Aput%3A'),
+category: 'properties',
+fn: function (key, value) {
     var self = this;
-    return true;
+    return self.properties[key] = value;
     return self;
 },
-args: [],
-source: unescape('isNil%0A%09%5Etrue'),
+args: ["key", "value"],
+source: unescape('propertyAt%3A%20key%20put%3A%20value%0A%0A%09%3Creturn%20self.properties%5Bkey%5D%20%3D%20value%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
 smalltalk.addMethod(
-unescape('_notNil'),
+unescape('_sortedClasses'),
 smalltalk.method({
-selector: unescape('notNil'),
-category: 'testing',
-fn: function () {
-    var self = this;
-    return false;
-    return self;
-},
+selector: unescape('sortedClasses'),
+category: 'classes',
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_class", []), "_sortedClasses_", [smalltalk.send(self, "_classes", [])]);
+return self;},
 args: [],
-source: unescape('notNil%0A%09%5Efalse'),
-messageSends: [],
+source: unescape('sortedClasses%0A%09%22Answer%20all%20classes%20in%20the%20receiver%2C%20sorted%20by%20superclass/subclasses%20and%20by%20class%20name%20for%20common%20subclasses%20%28Issue%20%23143%29%22%0A%0A%09%5Eself%20class%20sortedClasses%3A%20self%20classes'),
+messageSends: ["sortedClasses:", "class", "classes"],
 referencedClasses: []
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package);
 
+
+smalltalk.Package.klass.iVarNames = ['defaultCommitPathJs','defaultCommitPathSt'];
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_commitToLocalStorage_'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
-fn: function () {
+selector: unescape('commitToLocalStorage%3A'),
+category: 'loading-storing',
+fn: function (aPackageName) {
     var self = this;
-    return "nil";
+    var key = nil;
+    var sourceCode = nil;
+    key = smalltalk.send("smalltalk.packages.", "__comma", [aPackageName]);
+    sourceCode = smalltalk.send(smalltalk.send(smalltalk.Exporter || Exporter, "_new", []), "_exportPackage_", [aPackageName]);
+    localStorage[key] = escape(sourceCode);
     return self;
 },
-args: [],
-source: unescape('printString%0A%20%20%20%20%5E%27nil%27'),
-messageSends: [],
-referencedClasses: []
+args: ["aPackageName"],
+source: unescape('commitToLocalStorage%3A%20aPackageName%0A%09%7C%20key%20sourceCode%20%7C%0A%09key%20%3A%3D%20%27smalltalk.packages.%27%20%2C%20aPackageName.%0A%09sourceCode%20%3A%3D%20Exporter%20new%20exportPackage%3A%20aPackageName.%0A%09%3ClocalStorage%5Bkey%5D%20%3D%20escape%28sourceCode%29%3E'),
+messageSends: [unescape("%2C"), "exportPackage:", "new"],
+referencedClasses: ["Exporter"]
 }),
-smalltalk.UndefinedObject);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_subclass_instanceVariableNames_package_'),
+unescape('_defaultCommitPathJs'),
 smalltalk.method({
-selector: unescape('subclass%3AinstanceVariableNames%3Apackage%3A'),
-category: 'class creation',
-fn: function (aString, aString2, aString3) {
+selector: unescape('defaultCommitPathJs'),
+category: 'commit paths',
+fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.ClassBuilder || ClassBuilder, "_new", []), "_superclass_subclass_instanceVariableNames_package_", [self, aString, aString2, aString3]);
+    return ($receiver = self['@defaultCommitPathJs']) == nil ||
+        $receiver == undefined ? function () {return self['@defaultCommitPathJs'] = "js";}() : $receiver;
     return self;
 },
-args: ["aString", "aString2", "aString3"],
-source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3%0A%09%5EClassBuilder%20new%0A%09%20%20%20%20superclass%3A%20self%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3'),
-messageSends: ["superclass:subclass:instanceVariableNames:package:", "new"],
-referencedClasses: ["ClassBuilder"]
-}),
-smalltalk.UndefinedObject);
-
-smalltalk.addMethod(
-unescape('_asJSON'),
-smalltalk.method({
-selector: unescape('asJSON'),
-category: 'converting',
-fn: function (){
-var self=this;
-return (typeof null == 'undefined' ? nil : null);
-return self;},
 args: [],
-source: unescape('asJSON%0A%09%5Enull'),
-messageSends: [],
+source: unescape('defaultCommitPathJs%0A%09%5E%20defaultCommitPathJs%20ifNil%3A%20%5B%20defaultCommitPathJs%20%3A%3D%20%27js%27%5D'),
+messageSends: ["ifNil:"],
 referencedClasses: []
 }),
-smalltalk.UndefinedObject);
-
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_new'),
+unescape('_defaultCommitPathJs_'),
 smalltalk.method({
-selector: unescape('new'),
-category: 'instance creation',
-fn: function () {
+selector: unescape('defaultCommitPathJs%3A'),
+category: 'commit paths',
+fn: function (aString) {
     var self = this;
-    smalltalk.send(self, "_error_", ["You cannot create new instances of UndefinedObject. Use nil"]);
+    self['@defaultCommitPathJs'] = aString;
     return self;
 },
-args: [],
-source: unescape('new%0A%09%20%20%20%20self%20error%3A%20%27You%20cannot%20create%20new%20instances%20of%20UndefinedObject.%20Use%20nil%27'),
-messageSends: ["error:"],
+args: ["aString"],
+source: unescape('defaultCommitPathJs%3A%20aString%0A%09defaultCommitPathJs%20%3A%3D%20aString'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.UndefinedObject.klass);
-
+smalltalk.Package.klass);
 
-smalltalk.addClass('Date', smalltalk.Object, [], 'Kernel-Objects');
-smalltalk.Date.comment=unescape('The%20Date%20class%20is%20used%20to%20work%20with%20dates%20and%20times.%20Therefore%20%60Date%20today%60%20and%20%60Date%20now%60%20are%20both%20valid%20in%0AAmber%20and%20answer%20the%20same%20date%20object.%0A%0ADate%20wraps%20the%20%60Date%28%29%60%20JavaScript%20constructor%2C%20and%20Smalltalk%20date%20objects%20are%20JavaScript%20date%20objects.')
 smalltalk.addMethod(
-unescape('_year'),
+unescape('_defaultCommitPathSt'),
 smalltalk.method({
-selector: unescape('year'),
-category: 'accessing',
+selector: unescape('defaultCommitPathSt'),
+category: 'commit paths',
 fn: function () {
     var self = this;
-    return self.getFullYear();
+    return ($receiver = self['@defaultCommitPathSt']) == nil ||
+        $receiver == undefined ? function () {return self['@defaultCommitPathSt'] = "st";}() : $receiver;
     return self;
 },
 args: [],
-source: unescape('year%0A%09%3Creturn%20self.getFullYear%28%29%3E'),
-messageSends: [],
+source: unescape('defaultCommitPathSt%0A%09%5E%20defaultCommitPathSt%20ifNil%3A%20%5B%20defaultCommitPathSt%20%3A%3D%20%27st%27%5D'),
+messageSends: ["ifNil:"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_month'),
+unescape('_defaultCommitPathSt_'),
 smalltalk.method({
-selector: unescape('month'),
-category: 'accessing',
-fn: function () {
+selector: unescape('defaultCommitPathSt%3A'),
+category: 'commit paths',
+fn: function (aString) {
     var self = this;
-    return self.getMonth() + 1;
+    self['@defaultCommitPathSt'] = aString;
     return self;
 },
-args: [],
-source: unescape('month%0A%09%3Creturn%20self.getMonth%28%29%20+%201%3E'),
+args: ["aString"],
+source: unescape('defaultCommitPathSt%3A%20aString%0A%09defaultCommitPathSt%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_month_'),
+unescape('_fetch_'),
 smalltalk.method({
-selector: unescape('month%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('fetch%3A'),
+category: 'loading-storing',
+fn: function (aPackageName) {
     var self = this;
-    self.setMonth(aNumber - 1);
+    smalltalk.send(self, "_fetch_prefix_", [aPackageName, smalltalk.send(smalltalk.send(self, "_defaultCommitPathJs", []), "__comma", [unescape("/")])]);
     return self;
 },
-args: ["aNumber"],
-source: unescape('month%3A%20aNumber%0A%09%3Cself.setMonth%28aNumber%20-%201%29%3E'),
-messageSends: [],
+args: ["aPackageName"],
+source: unescape('fetch%3A%20aPackageName%0A%09self%20fetch%3A%20aPackageName%20prefix%3A%20self%20defaultCommitPathJs%2C%20%27/%27'),
+messageSends: ["fetch:prefix:", unescape("%2C"), "defaultCommitPathJs"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_day'),
+unescape('_fetch_prefix_'),
 smalltalk.method({
-selector: unescape('day'),
-category: 'accessing',
-fn: function () {
-    var self = this;
-    return smalltalk.send(self, "_dayOfWeek", []);
+selector: unescape('fetch%3Aprefix%3A'),
+category: 'loading-storing',
+fn: function (aPackageName, aPrefix) {
+    var self = this;
+    smalltalk.send(typeof jQuery == "undefined" ? nil : jQuery, "_getScript_onSuccess_", [smalltalk.send(smalltalk.send(aPrefix, "__comma", [aPackageName]), "__comma", [".js"]), function () {return smalltalk.send(smalltalk.Package || Package, "_init_", [aPackageName]);}]);
     return self;
 },
-args: [],
-source: unescape('day%0A%09%5Eself%20dayOfWeek'),
-messageSends: ["dayOfWeek"],
+args: ["aPackageName", "aPrefix"],
+source: unescape('fetch%3A%20aPackageName%20prefix%3A%20aPrefix%0A%09jQuery%20getScript%3A%20%28aPrefix%20%2C%20aPackageName%20%2C%20%27.js%27%29%20onSuccess%3A%20%5B%20Package%20init%3A%20aPackageName%20%5D'),
+messageSends: ["getScript:onSuccess:", unescape("%2C"), "init:"],
+referencedClasses: ["Package"]
+}),
+smalltalk.Package.klass);
+
+smalltalk.addMethod(
+unescape('_init_'),
+smalltalk.method({
+selector: unescape('init%3A'),
+category: 'loading-storing',
+fn: function (aPackageName) {
+    var self = this;
+    (function ($rec) {smalltalk.send($rec, "_do_", [function (each) {return smalltalk.init(each);}]);return smalltalk.send($rec, "_do_", [function (each) {return smalltalk.send(each, "_initialize", []);}]);}(smalltalk.send(smalltalk.send(typeof smalltalk == "undefined" ? nil : smalltalk, "_classes", []), "_select_", [function (each) {return each.pkg.pkgName == aPackageName;}])));
+    return self;
+},
+args: ["aPackageName"],
+source: unescape('init%3A%20aPackageName%0A%09%28smalltalk%20classes%20select%3A%20%5B%20%3Aeach%20%7C%20%3Ceach.pkg.pkgName%20%3D%3D%20aPackageName%3E%20%5D%29%0A%09%09do%3A%20%5B%20%3Aeach%20%7C%20%3Csmalltalk.init%28each%29%3E%20%5D%3B%0A%09%09do%3A%20%5B%20%3Aeach%20%7C%20each%20initialize%20%5D'),
+messageSends: ["do:", "initialize", "select:", "classes"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_dayOfWeek'),
+unescape('_named_'),
 smalltalk.method({
-selector: unescape('dayOfWeek'),
-category: 'accessing',
+selector: unescape('named%3A'),
+category: 'not yet classified',
+fn: function (aPackageName) {
+    var self = this;
+    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_packageAt_", [aPackageName]);
+    return self;
+},
+args: ["aPackageName"],
+source: unescape('named%3A%20aPackageName%0A%0A%09%5ESmalltalk%20current%20packageAt%3A%20aPackageName'),
+messageSends: ["packageAt:", "current"],
+referencedClasses: ["Smalltalk"]
+}),
+smalltalk.Package.klass);
+
+smalltalk.addMethod(
+unescape('_named_ifAbsent_'),
+smalltalk.method({
+selector: unescape('named%3AifAbsent%3A'),
+category: 'not yet classified',
+fn: function (aPackageName, aBlock) {
+    var self = this;
+    return smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_packageAt_ifAbsent_", [aPackageName, aBlock]);
+    return self;
+},
+args: ["aPackageName", "aBlock"],
+source: unescape('named%3A%20aPackageName%20ifAbsent%3A%20aBlock%0A%0A%09%5ESmalltalk%20current%20packageAt%3A%20aPackageName%20ifAbsent%3A%20aBlock'),
+messageSends: ["packageAt:ifAbsent:", "current"],
+referencedClasses: ["Smalltalk"]
+}),
+smalltalk.Package.klass);
+
+smalltalk.addMethod(
+unescape('_resetCommitPaths'),
+smalltalk.method({
+selector: unescape('resetCommitPaths'),
+category: 'commit paths',
 fn: function () {
     var self = this;
-    return self.getDay() + 1;
+    self['@defaultCommitPathJs'] = nil;
+    self['@defaultCommitPathSt'] = nil;
     return self;
 },
 args: [],
-source: unescape('dayOfWeek%0A%09%3Creturn%20self.getDay%28%29%20+%201%3E'),
+source: unescape('resetCommitPaths%0A%20%20%20%20%20%20%20%20defaultCommitPathJs%20%3A%3D%20nil.%0A%20%20%20%20%20%20%20%20defaultCommitPathSt%20%3A%3D%20nil.'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Package.klass);
 
 smalltalk.addMethod(
-unescape('_dayOfWeek_'),
+unescape('_sortedClasses_'),
 smalltalk.method({
-selector: unescape('dayOfWeek%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('sortedClasses%3A'),
+category: 'sorting',
+fn: function (classes){
+var self=this;
+var children=nil;
+var others=nil;
+var nodes=nil;
+var expandedClasses=nil;
+(children=[]);
+(others=[]);
+smalltalk.send(classes, "_do_", [(function(each){return ((($receiver = smalltalk.send(classes, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(children, "_add_", [each]);})() : (function(){return smalltalk.send(others, "_add_", [each]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(children, "_add_", [each]);}), (function(){return smalltalk.send(others, "_add_", [each]);})]));})]);
+(nodes=smalltalk.send(children, "_collect_", [(function(each){return smalltalk.send((smalltalk.ClassSorterNode || ClassSorterNode), "_on_classes_level_", [each, others, (0)]);})]));
+(nodes=smalltalk.send(nodes, "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(smalltalk.send(a, "_theClass", []), "_name", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", [])]));})]));
+(expandedClasses=smalltalk.send((smalltalk.Array || Array), "_new", []));
+smalltalk.send(nodes, "_do_", [(function(aNode){return smalltalk.send(aNode, "_traverseClassesWith_", [expandedClasses]);})]);
+return expandedClasses;
+return self;},
+args: ["classes"],
+source: unescape('sortedClasses%3A%20classes%0A%09%22Answer%20classes%2C%20sorted%20by%20superclass/subclasses%20and%20by%20class%20name%20for%20common%20subclasses%20%28Issue%20%23143%29%22%0A%0A%09%7C%20children%20others%20nodes%20expandedClasses%20%7C%0A%09children%20%3A%3D%20%23%28%29.%0A%09others%20%3A%3D%20%23%28%29.%0A%09classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%28classes%20includes%3A%20each%20superclass%29%0A%09%09%09ifFalse%3A%20%5Bchildren%20add%3A%20each%5D%0A%09%09%09ifTrue%3A%20%5Bothers%20add%3A%20each%5D%5D.%0A%09nodes%20%3A%3D%20children%20collect%3A%20%5B%3Aeach%20%7C%0A%09%09ClassSorterNode%20on%3A%20each%20classes%3A%20others%20level%3A%200%5D.%0A%09nodes%20%3A%3D%20nodes%20sorted%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20theClass%20name%20%3C%3D%20b%20theClass%20name%20%5D.%0A%09expandedClasses%20%3A%3D%20Array%20new.%0A%09nodes%20do%3A%20%5B%3AaNode%20%7C%0A%09%09aNode%20traverseClassesWith%3A%20expandedClasses%5D.%0A%09%5EexpandedClasses'),
+messageSends: ["do:", "ifFalse:ifTrue:", "includes:", "superclass", "add:", "collect:", "on:classes:level:", "sorted:", unescape("%3C%3D"), "name", "theClass", "new", "traverseClassesWith:"],
+referencedClasses: ["ClassSorterNode", "Array"]
+}),
+smalltalk.Package.klass);
+
+
+smalltalk.addClass('Point', smalltalk.Object, ['x', 'y'], 'Kernel-Objects');
+smalltalk.Point.comment=unescape('A%20%60Point%60%20represents%20an%20x-y%20pair%20of%20numbers%20usually%20designating%20a%20geometric%20coordinate.%0APoints%20are%20traditionally%20created%20using%20the%20binary%20%60%23@%60%20message%20to%20a%20number%3A%0A%0A%09100@120%0A%0APoints%20can%20then%20be%20arithmetically%20manipulated%3A%0A%0A%09100@100%20+%20%2810@10%29%0A%0A...or%20for%20example%3A%0A%0A%09%28100@100%29%20*%202%0A%0A**NOTE%3A**%20Creating%20a%20Point%20with%20a%20negative%20y-value%20will%20need%20a%20space%20after%20%60@%60%20in%20order%20to%20avoid%20a%20parsing%20error%3A%0A%0A%09100@%20-100%20%22but%20100@-100%20would%20not%20parse%22%0A%0AAmber%20does%20not%20have%20much%20behavior%20in%20this%20class%20out-of-the-box.')
+smalltalk.addMethod(
+unescape('__star'),
+smalltalk.method({
+selector: unescape('*'),
+category: 'arithmetic',
+fn: function (aPoint) {
     var self = this;
-    return self.setDay(aNumber - 1);
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver * smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__star", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver * smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__star", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
     return self;
 },
-args: ["aNumber"],
-source: unescape('dayOfWeek%3A%20aNumber%0A%09%3Creturn%20self.setDay%28aNumber%20-%201%29%3E'),
-messageSends: [],
-referencedClasses: []
+args: ["aPoint"],
+source: unescape('*%20aPoint%0A%09%5EPoint%20x%3A%20self%20x%20*%20aPoint%20asPoint%20x%20y%3A%20self%20y%20*%20aPoint%20asPoint%20y'),
+messageSends: ["x:y:", unescape("*"), "x", "asPoint", "y"],
+referencedClasses: ["Point"]
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_day_'),
+unescape('__plus'),
 smalltalk.method({
-selector: unescape('day%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('+'),
+category: 'arithmetic',
+fn: function (aPoint) {
     var self = this;
-    smalltalk.send(self, "_day_", [aNumber]);
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver + smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver + smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
     return self;
 },
-args: ["aNumber"],
-source: unescape('day%3A%20aNumber%0A%09self%20day%3A%20aNumber'),
-messageSends: ["day:"],
-referencedClasses: []
+args: ["aPoint"],
+source: unescape('+%20aPoint%0A%09%5EPoint%20x%3A%20self%20x%20+%20aPoint%20asPoint%20x%20y%3A%20self%20y%20+%20aPoint%20asPoint%20y'),
+messageSends: ["x:y:", unescape("+"), "x", "asPoint", "y"],
+referencedClasses: ["Point"]
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_year_'),
+unescape('__minus'),
 smalltalk.method({
-selector: unescape('year%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('-'),
+category: 'arithmetic',
+fn: function (aPoint) {
     var self = this;
-    self.setFullYear(aNumber);
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver - smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver - smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
     return self;
 },
-args: ["aNumber"],
-source: unescape('year%3A%20aNumber%0A%09%3Cself.setFullYear%28aNumber%29%3E'),
-messageSends: [],
-referencedClasses: []
+args: ["aPoint"],
+source: unescape('-%20aPoint%0A%09%5EPoint%20x%3A%20self%20x%20-%20aPoint%20asPoint%20x%20y%3A%20self%20y%20-%20aPoint%20asPoint%20y'),
+messageSends: ["x:y:", unescape("-"), "x", "asPoint", "y"],
+referencedClasses: ["Point"]
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_dayOfMonth'),
+unescape('__slash'),
 smalltalk.method({
-selector: unescape('dayOfMonth'),
-category: 'accessing',
-fn: function () {
+selector: unescape('/'),
+category: 'arithmetic',
+fn: function (aPoint) {
     var self = this;
-    return self.getDate();
+    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver / smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver / smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
     return self;
 },
-args: [],
-source: unescape('dayOfMonth%0A%09%3Creturn%20self.getDate%28%29%3E'),
-messageSends: [],
-referencedClasses: []
+args: ["aPoint"],
+source: unescape('/%20aPoint%0A%09%5EPoint%20x%3A%20self%20x%20/%20aPoint%20asPoint%20x%20y%3A%20self%20y%20/%20aPoint%20asPoint%20y'),
+messageSends: ["x:y:", unescape("/"), "x", "asPoint", "y"],
+referencedClasses: ["Point"]
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_dayOfMonth_'),
+unescape('__eq'),
 smalltalk.method({
-selector: unescape('dayOfMonth%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('%3D'),
+category: 'arithmetic',
+fn: function (aPoint) {
     var self = this;
-    self.setDate(aNumber);
+    return smalltalk.send(smalltalk.send(smalltalk.send(aPoint, "_class", []), "__eq", [smalltalk.send(self, "_class", [])]), "_and_", [function () {return smalltalk.send(smalltalk.send(smalltalk.send(aPoint, "_x", []), "__eq", [smalltalk.send(self, "_x", [])]), "_&", [smalltalk.send(smalltalk.send(aPoint, "_y", []), "__eq", [smalltalk.send(self, "_y", [])])]);}]);
     return self;
 },
-args: ["aNumber"],
-source: unescape('dayOfMonth%3A%20aNumber%0A%09%3Cself.setDate%28aNumber%29%3E'),
-messageSends: [],
+args: ["aPoint"],
+source: unescape('%3D%20aPoint%0A%09%5EaPoint%20class%20%3D%20self%20class%20and%3A%20%5B%0A%09%09%28aPoint%20x%20%3D%20self%20x%29%20%26%20%28aPoint%20y%20%3D%20self%20y%29%5D'),
+messageSends: ["and:", unescape("%3D"), "class", unescape("%26"), "x", "y"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_asPoint'),
 smalltalk.method({
-selector: unescape('asString'),
+selector: unescape('asPoint'),
 category: 'converting',
 fn: function () {
     var self = this;
-    return self.toString();
+    return self;
     return self;
 },
 args: [],
-source: unescape('asString%0A%09%3Creturn%20self.toString%28%29%3E'),
+source: unescape('asPoint%0A%09%5Eself'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
 unescape('_printString'),
@@ -3954,918 +4158,740 @@ selector: unescape('printString'),
 category: 'printing',
 fn: function () {
     var self = this;
-    return smalltalk.send(self, "_asString", []);
+    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (stream) {smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@x'], "_printString", []), "__comma", [unescape("@")])]);($receiver = smalltalk.send(smalltalk.send(self['@y'], "_notNil", []), "_and_", [function () {return smalltalk.send(self['@y'], "_negative", []);}])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(stream, "_space", []);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(stream, "_space", []);}]);return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self['@y'], "_printString", [])]);}]);
     return self;
 },
 args: [],
-source: unescape('printString%0A%09%5Eself%20asString'),
-messageSends: ["asString"],
-referencedClasses: []
+source: unescape('printString%0A%09%22Print%20receiver%20in%20classic%20x@y%20notation.%22%0A%0A%09%5EString%20streamContents%3A%20%5B%3Astream%20%7C%0A%09%09stream%20nextPutAll%3A%20x%20printString%2C%20%27@%27.%0A%09%09%28y%20notNil%20and%3A%20%5By%20negative%5D%29%0A%09%09%09ifTrue%3A%20%5B%0A%09%09%09%09%22Avoid%20ambiguous%20@-%20construct%22%0A%09%09%09%09stream%20space%5D.%0A%09%09stream%20nextPutAll%3A%20y%20printString%5D'),
+messageSends: ["streamContents:", "nextPutAll:", unescape("%2C"), "printString", "ifTrue:", "and:", "notNil", "negative", "space"],
+referencedClasses: ["String"]
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_asMilliseconds'),
+unescape('_translateBy_'),
 smalltalk.method({
-selector: unescape('asMilliseconds'),
-category: 'converting',
-fn: function () {
-    var self = this;
-    return smalltalk.send(self, "_time", []);
-    return self;
-},
-args: [],
-source: unescape('asMilliseconds%0A%09%5Eself%20time'),
-messageSends: ["time"],
+selector: unescape('translateBy%3A'),
+category: 'transforming',
+fn: function (delta){
+var self=this;
+return smalltalk.send(((($receiver = smalltalk.send(delta, "_x", [])).klass === smalltalk.Number) ? $receiver +self['@x'] : smalltalk.send($receiver, "__plus", [self['@x']])), "__at", [((($receiver = smalltalk.send(delta, "_y", [])).klass === smalltalk.Number) ? $receiver +self['@y'] : smalltalk.send($receiver, "__plus", [self['@y']]))]);
+return self;},
+args: ["delta"],
+source: unescape('translateBy%3A%20delta%20%0A%09%22Answer%20a%20Point%20translated%20by%20delta%20%28an%20instance%20of%20Point%29.%22%0A%09%5E%28delta%20x%20+%20x%29%20@%20%28delta%20y%20+%20y%29'),
+messageSends: [unescape("@"), unescape("+"), "x", "y"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_time'),
+unescape('_x'),
 smalltalk.method({
-selector: unescape('time'),
+selector: unescape('x'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return self.getTime();
+    return self['@x'];
     return self;
 },
 args: [],
-source: unescape('time%0A%09%3Creturn%20self.getTime%28%29%3E'),
+source: unescape('x%0A%09%5Ex'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_time_'),
+unescape('_x_'),
 smalltalk.method({
-selector: unescape('time%3A'),
+selector: unescape('x%3A'),
 category: 'accessing',
 fn: function (aNumber) {
     var self = this;
-    self.setTime(aNumber);
+    self['@x'] = aNumber;
     return self;
 },
 args: ["aNumber"],
-source: unescape('time%3A%20aNumber%0A%09%3Cself.setTime%28aNumber%29%3E'),
+source: unescape('x%3A%20aNumber%0A%09x%20%3A%3D%20aNumber'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_asDateString'),
+unescape('_y'),
 smalltalk.method({
-selector: unescape('asDateString'),
-category: 'converting',
+selector: unescape('y'),
+category: 'accessing',
 fn: function () {
     var self = this;
-    return self.toDateString();
+    return self['@y'];
     return self;
 },
 args: [],
-source: unescape('asDateString%0A%09%3Creturn%20self.toDateString%28%29%3E'),
+source: unescape('y%0A%09%5Ey'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Point);
 
 smalltalk.addMethod(
-unescape('_asTimeString'),
+unescape('_y_'),
 smalltalk.method({
-selector: unescape('asTimeString'),
-category: 'converting',
-fn: function () {
+selector: unescape('y%3A'),
+category: 'accessing',
+fn: function (aNumber) {
     var self = this;
-    return self.toTimeString();
+    self['@y'] = aNumber;
     return self;
 },
-args: [],
-source: unescape('asTimeString%0A%09%3Creturn%20self.toTimeString%28%29%3E'),
+args: ["aNumber"],
+source: unescape('y%3A%20aNumber%0A%09y%20%3A%3D%20aNumber'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Point);
 
-smalltalk.addMethod(
-unescape('_asLocaleString'),
-smalltalk.method({
-selector: unescape('asLocaleString'),
-category: 'converting',
-fn: function () {
-    var self = this;
-    return self.toLocaleString();
-    return self;
-},
-args: [],
-source: unescape('asLocaleString%0A%09%3Creturn%20self.toLocaleString%28%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Date);
 
 smalltalk.addMethod(
-unescape('_asNumber'),
+unescape('_x_y_'),
 smalltalk.method({
-selector: unescape('asNumber'),
-category: 'converting',
-fn: function () {
+selector: unescape('x%3Ay%3A'),
+category: 'instance creation',
+fn: function (aNumber, anotherNumber) {
     var self = this;
-    return smalltalk.send(self, "_asMilliseconds", []);
+    return function ($rec) {smalltalk.send($rec, "_x_", [aNumber]);smalltalk.send($rec, "_y_", [anotherNumber]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
     return self;
 },
-args: [],
-source: unescape('asNumber%0A%09%5Eself%20asMilliseconds'),
-messageSends: ["asMilliseconds"],
+args: ["aNumber", "anotherNumber"],
+source: unescape('x%3A%20aNumber%20y%3A%20anotherNumber%0A%09%5Eself%20new%0A%09%09x%3A%20aNumber%3B%0A%09%09y%3A%20anotherNumber%3B%0A%09%09yourself'),
+messageSends: ["x:", "y:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Point.klass);
+
 
+smalltalk.addClass('Random', smalltalk.Object, [], 'Kernel-Objects');
+smalltalk.Random.comment=unescape('%60Random%60%20is%20a%20random%20number%20generator%20and%20is%20implemented%20as%20a%20trivial%20wrapper%20around%20javascript%20%60Math.random%28%29%60%20and%20is%20used%20like%20this%3A%0A%0A%09Random%20new%20next%0A%0AThis%20will%20return%20a%20float%20x%20where%20x%20%3C%201%20and%20x%20%3E%200.%20If%20you%20want%20a%20random%20integer%20from%201%20to%2010%20you%20can%20use%20%60%23atRandom%60%0A%0A%0910%20atRandom%0A%0A...and%20if%20you%20want%20a%20random%20number%20in%20a%20specific%20interval%20this%20also%20works%3A%0A%0A%09%283%20to%3A%207%29%20atRandom%0A%0A...but%20be%20aware%20that%20%60%23to%3A%60%20does%20not%20create%20an%20Interval%20as%20in%20other%20Smalltalk%20implementations%20but%20in%20fact%20an%20%60Array%60%20of%20numbers%2C%20so%20it%27s%20better%20to%20use%3A%0A%0A%095%20atRandom%20+%202%0A%0ASince%20%60%23atRandom%60%20is%20implemented%20in%20%60SequencableCollection%60%20you%20can%20easy%20pick%20an%20element%20at%20random%3A%0A%0A%09%23%28%27a%27%20%27b%27%20%27c%27%29%20atRandom%0A%0A...or%20perhaps%20a%20letter%20from%20a%20%60String%60%3A%0A%0A%09%27abc%27%20atRandom%0A%0ASince%20Amber%20does%20not%20have%20Characters%20this%20will%20return%20a%20%60String%60%20of%20length%201%20like%20for%20example%20%60%27b%27%60.')
 smalltalk.addMethod(
-unescape('_hours_'),
+unescape('_next'),
 smalltalk.method({
-selector: unescape('hours%3A'),
+selector: unescape('next'),
 category: 'accessing',
-fn: function (aNumber) {
+fn: function () {
     var self = this;
-    self.setHours(aNumber);
+    return Math.random();
     return self;
 },
-args: ["aNumber"],
-source: unescape('hours%3A%20aNumber%0A%09%3Cself.setHours%28aNumber%29%3E'),
+args: [],
+source: unescape('next%0A%09%3Creturn%20Math.random%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Random);
 
 smalltalk.addMethod(
-unescape('_minutes_'),
+unescape('_next_'),
 smalltalk.method({
-selector: unescape('minutes%3A'),
+selector: unescape('next%3A'),
 category: 'accessing',
-fn: function (aNumber) {
+fn: function (anInteger) {
     var self = this;
-    self.setMinutes(aNumber);
+    return smalltalk.send(smalltalk.send(1, "_to_", [anInteger]), "_collect_", [function (each) {return smalltalk.send(self, "_next", []);}]);
     return self;
 },
-args: ["aNumber"],
-source: unescape('minutes%3A%20aNumber%0A%09%3Cself.setMinutes%28aNumber%29%3E'),
-messageSends: [],
+args: ["anInteger"],
+source: unescape('next%3A%20anInteger%0A%20%20%20%20%5E%281%20to%3A%20anInteger%29%20collect%3A%20%5B%3Aeach%20%7C%20self%20next%5D'),
+messageSends: ["collect:", "to:", "next"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Random);
 
+
+
+smalltalk.addClass('Smalltalk', smalltalk.Object, [], 'Kernel-Objects');
+smalltalk.Smalltalk.comment=unescape('Smalltalk%20has%20only%20one%20instance%2C%20accessed%20with%20%60Smalltalk%20current%60.%20%0AIt%20represents%20the%20global%20JavaScript%20variable%20%60smalltalk%60%20declared%20in%20%60js/boot.js%60.%0A%0AThe%20%60smalltalk%60%20object%20holds%20all%20class%20and%20packages%20defined%20in%20the%20system.%0A%0A%23%23%20Classes%0A%0AClasses%20can%20be%20accessed%20using%20the%20following%20methods%3A%0A%0A-%20%60%23classes%60%20answers%20the%20full%20list%20of%20Smalltalk%20classes%20in%20the%20system%0A-%20%60%23at%3A%60%20answers%20a%20specific%20class%20of%20%60nil%60%0A%0A%23%23%20Packages%0A%0APackages%20can%20be%20accessed%20using%20the%20following%20methods%3A%0A%0A-%20%60%23packages%60%20answers%20the%20full%20list%20of%20packages%0A-%20%60%23packageAt%3A%60%20answers%20a%20specific%20class%20of%20%60nil%60%0A%0A__note%3A__%20classes%20and%20packages%20are%20accessed%20using%20strings%2C%20not%20symbols%0A%0A%23%23%20Parsing%0A%0AThe%20%60%23parse%3A%60%20method%20is%20used%20to%20parse%20Smalltalk%20source%20code.%20%0AIt%20requires%20the%20%60Compiler%60%20package%20and%20the%20%60js/parser.js%60%20parser%20file%20in%20order%20to%20work')
 smalltalk.addMethod(
-unescape('_seconds_'),
+unescape('_at_'),
 smalltalk.method({
-selector: unescape('seconds%3A'),
+selector: unescape('at%3A'),
 category: 'accessing',
-fn: function (aNumber) {
+fn: function (aString) {
     var self = this;
-    self.setSeconds(aNumber);
+    return self[aString];
     return self;
 },
-args: ["aNumber"],
-source: unescape('seconds%3A%20aNumber%0A%09%3Cself.setSeconds%28aNumber%29%3E'),
+args: ["aString"],
+source: unescape('at%3A%20aString%0A%09%3Creturn%20self%5BaString%5D%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_milliseconds_'),
+unescape('_basicParse_'),
 smalltalk.method({
-selector: unescape('milliseconds%3A'),
+selector: unescape('basicParse%3A'),
 category: 'accessing',
-fn: function (aNumber) {
+fn: function (aString) {
     var self = this;
-    self.setMilliseconds(aNumber);
+    return smalltalk.parser.parse(aString);
     return self;
 },
-args: ["aNumber"],
-source: unescape('milliseconds%3A%20aNumber%0A%09%3Cself.setMilliseconds%28aNumber%29%3E'),
+args: ["aString"],
+source: unescape('basicParse%3A%20aString%0A%09%3Creturn%20smalltalk.parser.parse%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_hours'),
+unescape('_classes'),
 smalltalk.method({
-selector: unescape('hours'),
+selector: unescape('classes'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return self.getHours();
+    return self.classes();
     return self;
 },
 args: [],
-source: unescape('hours%0A%09%3Creturn%20self.getHours%28%29%3E'),
+source: unescape('classes%0A%09%3Creturn%20self.classes%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_minutes'),
+unescape('_createPackage_'),
 smalltalk.method({
-selector: unescape('minutes'),
-category: 'accessing',
-fn: function () {
+selector: unescape('createPackage%3A'),
+category: 'private',
+fn: function (packageName) {
     var self = this;
-    return self.getMinutes();
+    return smalltalk.addPackage(packageName, nil);
     return self;
 },
-args: [],
-source: unescape('minutes%0A%09%3Creturn%20self.getMinutes%28%29%3E'),
+args: ["packageName"],
+source: unescape('createPackage%3A%20packageName%0A%09%22Create%20and%20bind%20a%20new%20package%20with%20given%20name%20and%20return%20it.%22%0A%0A%20%20%20%20%20%20%3Creturn%20smalltalk.addPackage%28packageName%2C%20nil%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_seconds'),
+unescape('_createPackage_properties_'),
 smalltalk.method({
-selector: unescape('seconds'),
-category: 'accessing',
-fn: function () {
+selector: unescape('createPackage%3Aproperties%3A'),
+category: 'private',
+fn: function (packageName, aDict) {
     var self = this;
-    return self.getSeconds();
+    var object = nil;
+    object = {};
+    smalltalk.send(aDict, "_keysAndValuesDo_", [function (key, value) {return object[key] = value;}]);
+    return smalltalk.addPackage(packageName, object);
     return self;
 },
-args: [],
-source: unescape('seconds%0A%09%3Creturn%20self.getSeconds%28%29%3E'),
-messageSends: [],
+args: ["packageName", "aDict"],
+source: unescape('createPackage%3A%20packageName%20properties%3A%20aDict%0A%09%22Create%20and%20bind%20a%20new%20package%20with%20given%20name%20and%20return%20it.%22%0A%0A%09%7C%20object%20%7C%0A%09%3Cobject%20%3D%20%7B%7D%3B%3E.%0A%09aDict%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%09%09%3Cobject%5Bkey%5D%20%3D%20value%3E.%0A%09%5D.%0A%20%20%20%20%20%20%20%3Creturn%20smalltalk.addPackage%28packageName%2C%20object%29%3E'),
+messageSends: ["keysAndValuesDo:"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_milliseconds'),
+unescape('_deletePackage_'),
 smalltalk.method({
-selector: unescape('milliseconds'),
-category: 'accessing',
-fn: function () {
+selector: unescape('deletePackage%3A'),
+category: 'private',
+fn: function (packageName) {
     var self = this;
-    return self.getMilliseconds();
+    delete smalltalk.packages[packageName];
     return self;
 },
-args: [],
-source: unescape('milliseconds%0A%09%3Creturn%20self.getMilliseconds%28%29%3E'),
+args: ["packageName"],
+source: unescape('deletePackage%3A%20packageName%0A%09%22Deletes%20a%20package%20by%20deleting%20its%20binding%2C%20but%20does%20not%20check%20if%20it%20contains%20classes%20etc.%0A%09To%20remove%20a%20package%2C%20use%20%23removePackage%20instead.%22%0A%0A%20%20%20%20%20%20%20%3Cdelete%20smalltalk.packages%5BpackageName%5D%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('__lt'),
+unescape('_packageAt_'),
 smalltalk.method({
-selector: unescape('%3C'),
-category: 'comparing',
-fn: function (aDate) {
+selector: unescape('packageAt%3A'),
+category: 'packages',
+fn: function (packageName) {
     var self = this;
-    return self < aDate;
+    return self.packages[packageName];
     return self;
 },
-args: ["aDate"],
-source: unescape('%3C%20aDate%0A%09%3Creturn%20self%20%3C%20aDate%3E'),
+args: ["packageName"],
+source: unescape('packageAt%3A%20packageName%0A%20%20%20%20%20%20%20%3Creturn%20self.packages%5BpackageName%5D%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('__gt'),
+unescape('_packageAt_ifAbsent_'),
 smalltalk.method({
-selector: unescape('%3E'),
-category: 'comparing',
-fn: function (aDate) {
+selector: unescape('packageAt%3AifAbsent%3A'),
+category: 'packages',
+fn: function (packageName, aBlock) {
     var self = this;
-    return self > aDate;
+    return smalltalk.send(smalltalk.send(self, "_packageAt_", [packageName]), "_ifNil_", [aBlock]);
     return self;
 },
-args: ["aDate"],
-source: unescape('%3E%20aDate%0A%09%3Creturn%20self%20%3E%3E%20aDate%3E'),
-messageSends: [],
+args: ["packageName", "aBlock"],
+source: unescape('packageAt%3A%20packageName%20ifAbsent%3A%20aBlock%0A%20%20%20%20%20%20%20%5E%28self%20packageAt%3A%20packageName%29%20ifNil%3A%20aBlock'),
+messageSends: ["ifNil:", "packageAt:"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('__lt_eq'),
+unescape('_packages'),
 smalltalk.method({
-selector: unescape('%3C%3D'),
-category: 'comparing',
-fn: function (aDate) {
+selector: unescape('packages'),
+category: 'packages',
+fn: function () {
     var self = this;
-    return self <= aDate;
+    return self.packages.all();
     return self;
 },
-args: ["aDate"],
-source: unescape('%3C%3D%20aDate%0A%09%3Creturn%20self%20%3C%3D%20aDate%3E'),
+args: [],
+source: unescape('packages%0A%09%22Return%20all%20Package%20instances%20in%20the%20system.%22%0A%0A%09%3Creturn%20self.packages.all%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('__gt_eq'),
+unescape('_parse_'),
 smalltalk.method({
-selector: unescape('%3E%3D'),
-category: 'comparing',
-fn: function (aDate) {
+selector: unescape('parse%3A'),
+category: 'accessing',
+fn: function (aString) {
     var self = this;
-    return self >= aDate;
+    var result = nil;
+    smalltalk.send(self, "_try_catch_", [function () {return result = smalltalk.send(self, "_basicParse_", [aString]);}, function (ex) {return smalltalk.send(smalltalk.send(self, "_parseError_parsing_", [ex, aString]), "_signal", []);}]);
+    return result;
     return self;
 },
-args: ["aDate"],
-source: unescape('%3E%3D%20aDate%0A%09%3Creturn%20self%20%3E%3E%3D%20aDate%3E'),
-messageSends: [],
+args: ["aString"],
+source: unescape('parse%3A%20aString%0A%09%7C%20result%20%7C%20%0A%09self%20try%3A%20%5Bresult%20%3A%3D%20self%20basicParse%3A%20aString%5D%20catch%3A%20%5B%3Aex%20%7C%20%28self%20parseError%3A%20ex%20parsing%3A%20aString%29%20signal%5D.%0A%09%5Eresult'),
+messageSends: ["try:catch:", "basicParse:", "signal", "parseError:parsing:"],
 referencedClasses: []
 }),
-smalltalk.Date);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('__minus'),
+unescape('_parseError_parsing_'),
 smalltalk.method({
-selector: unescape('-'),
-category: 'arithmetic',
-fn: function (aDate) {
-    var self = this;
-    return self - aDate;
-    return self;
-},
-args: ["aDate"],
-source: unescape('-%20aDate%0A%09%3Creturn%20self%20-%20aDate%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Date);
-
-smalltalk.addMethod(
-unescape('__plus'),
-smalltalk.method({
-selector: unescape('+'),
-category: 'arithmetic',
-fn: function (aDate) {
+selector: unescape('parseError%3Aparsing%3A'),
+category: 'accessing',
+fn: function (anException, aString) {
     var self = this;
-    return self + aDate;
+    var row = nil;
+    var col = nil;
+    var message = nil;
+    var lines = nil;
+    var badLine = nil;
+    var code = nil;
+    row = anException.line;
+    col = anException.column;
+    message = anException.message;
+    lines = smalltalk.send(aString, "_lines", []);
+    badLine = smalltalk.send(lines, "_at_", [row]);
+    badLine = smalltalk.send(smalltalk.send(smalltalk.send(badLine, "_copyFrom_to_", [1, ($receiver = col).klass === smalltalk.Number ? $receiver - 1 : smalltalk.send($receiver, "__minus", [1])]), "__comma", [unescape("%20%3D%3D%3D%3E")]), "__comma", [smalltalk.send(badLine, "_copyFrom_to_", [col, smalltalk.send(badLine, "_size", [])])]);
+    smalltalk.send(lines, "_at_put_", [row, badLine]);
+    code = smalltalk.send(smalltalk.String || String, "_streamContents_", [function (s) {return smalltalk.send(lines, "_withIndexDo_", [function (l, i) {return smalltalk.send(s, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(i, "_asString", []), "__comma", [": "]), "__comma", [l]), "__comma", [smalltalk.send(smalltalk.String || String, "_lf", [])])]);}]);}]);
+    return smalltalk.send(smalltalk.send(smalltalk.Error || Error, "_new", []), "_messageText_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send("Parse error on line ", "__comma", [row]), "__comma", [" column "]), "__comma", [col]), "__comma", [" : "]), "__comma", [message]), "__comma", [unescape("%20Below%20is%20code%20with%20line%20numbers%20and%20%3D%3D%3D%3E%20marker%20inserted%3A")]), "__comma", [smalltalk.send(smalltalk.String || String, "_lf", [])]), "__comma", [code])]);
     return self;
 },
-args: ["aDate"],
-source: unescape('+%20aDate%0A%09%3Creturn%20self%20+%20aDate%3E'),
-messageSends: [],
-referencedClasses: []
+args: ["anException", "aString"],
+source: unescape('parseError%3A%20anException%20parsing%3A%20aString%0A%09%7C%20row%20col%20message%20lines%20badLine%20code%20%7C%0A%09%3Crow%20%3D%20anException.line%3B%0A%09col%20%3D%20anException.column%3B%0A%09message%20%3D%20anException.message%3B%3E.%0A%09lines%20%3A%3D%20aString%20lines.%0A%09badLine%20%3A%3D%20lines%20at%3A%20row.%0A%09badLine%20%3A%3D%20%28badLine%20copyFrom%3A%201%20to%3A%20col%20-%201%29%2C%20%27%20%3D%3D%3D%3E%27%2C%20%28badLine%20copyFrom%3A%20%20col%20to%3A%20badLine%20size%29.%0A%09lines%20at%3A%20row%20put%3A%20badLine.%0A%09code%20%3A%3D%20String%20streamContents%3A%20%5B%3As%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lines%20withIndexDo%3A%20%5B%3Al%20%3Ai%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20nextPutAll%3A%20i%20asString%2C%20%27%3A%20%27%2C%20l%2C%20String%20lf%5D%5D.%0A%09%5E%20Error%20new%20messageText%3A%20%28%27Parse%20error%20on%20line%20%27%20%2C%20row%20%2C%20%27%20column%20%27%20%2C%20col%20%2C%20%27%20%3A%20%27%20%2C%20message%20%2C%20%27%20Below%20is%20code%20with%20line%20numbers%20and%20%3D%3D%3D%3E%20marker%20inserted%3A%27%20%2C%20String%20lf%2C%20code%29'),
+messageSends: ["lines", "at:", unescape("%2C"), "copyFrom:to:", unescape("-"), "size", "at:put:", "streamContents:", "withIndexDo:", "nextPutAll:", "asString", "lf", "messageText:", "new"],
+referencedClasses: ["String", "Error"]
 }),
-smalltalk.Date);
-
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_new_'),
+unescape('_readJSObject_'),
 smalltalk.method({
-selector: unescape('new%3A'),
-category: 'instance creation',
+selector: unescape('readJSObject%3A'),
+category: 'accessing',
 fn: function (anObject) {
     var self = this;
-    return new Date(anObject);
+    return self.readJSObject(anObject);
     return self;
 },
 args: ["anObject"],
-source: unescape('new%3A%20anObject%0A%09%3Creturn%20new%20Date%28anObject%29%3E'),
+source: unescape('readJSObject%3A%20anObject%0A%09%3Creturn%20self.readJSObject%28anObject%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Date.klass);
-
-smalltalk.addMethod(
-unescape('_fromString_'),
-smalltalk.method({
-selector: unescape('fromString%3A'),
-category: 'instance creation',
-fn: function (aString) {
-    var self = this;
-    return smalltalk.send(self, "_new_", [aString]);
-    return self;
-},
-args: ["aString"],
-source: unescape('fromString%3A%20aString%0A%09%22Example%3A%20Date%20fromString%28%272011/04/15%2000%3A00%3A00%27%29%22%0A%09%5Eself%20new%3A%20aString'),
-messageSends: ["new:"],
-referencedClasses: []
-}),
-smalltalk.Date.klass);
-
-smalltalk.addMethod(
-unescape('_fromSeconds_'),
-smalltalk.method({
-selector: unescape('fromSeconds%3A'),
-category: 'instance creation',
-fn: function (aNumber) {
-    var self = this;
-    return smalltalk.send(self, "_fromMilliseconds_", [($receiver = aNumber).klass === smalltalk.Number ? $receiver * 1000 : smalltalk.send($receiver, "__star", [1000])]);
-    return self;
-},
-args: ["aNumber"],
-source: unescape('fromSeconds%3A%20aNumber%0A%09%5Eself%20fromMilliseconds%3A%20aNumber%20*%201000'),
-messageSends: ["fromMilliseconds:", unescape("*")],
-referencedClasses: []
-}),
-smalltalk.Date.klass);
-
-smalltalk.addMethod(
-unescape('_fromMilliseconds_'),
-smalltalk.method({
-selector: unescape('fromMilliseconds%3A'),
-category: 'instance creation',
-fn: function (aNumber) {
-    var self = this;
-    return smalltalk.send(self, "_new_", [aNumber]);
-    return self;
-},
-args: ["aNumber"],
-source: unescape('fromMilliseconds%3A%20aNumber%0A%09%5Eself%20new%3A%20aNumber'),
-messageSends: ["new:"],
-referencedClasses: []
-}),
-smalltalk.Date.klass);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_today'),
+unescape('_removeClass_'),
 smalltalk.method({
-selector: unescape('today'),
-category: 'instance creation',
-fn: function () {
+selector: unescape('removeClass%3A'),
+category: 'classes',
+fn: function (aClass) {
     var self = this;
-    return smalltalk.send(self, "_new", []);
+    ($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_asString", []), "__comma", [unescape("%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21")])]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_asString", []), "__comma", [unescape("%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21")])]);}]);
+    smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_do_", [function (each) {return smalltalk.send(aClass, "_removeCompiledMethod_", [each]);}]);
+    smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_methodDictionary", []), "_values", []), "_do_", [function (each) {return smalltalk.send(smalltalk.send(aClass, "_class", []), "_removeCompiledMethod_", [each]);}]);
+    smalltalk.send(self, "_basicDelete_", [smalltalk.send(aClass, "_name", [])]);
     return self;
 },
-args: [],
-source: unescape('today%0A%09%5Eself%20new'),
-messageSends: ["new"],
+args: ["aClass"],
+source: unescape('removeClass%3A%20aClass%0A%09aClass%20isMetaclass%20ifTrue%3A%20%5Bself%20error%3A%20aClass%20asString%2C%20%27%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21%27%5D.%0A%09aClass%20methodDictionary%20values%20do%3A%20%5B%3Aeach%20%7C%0A%09%09aClass%20removeCompiledMethod%3A%20each%5D.%0A%09aClass%20class%20methodDictionary%20values%20do%3A%20%5B%3Aeach%20%7C%0A%09%09aClass%20class%20removeCompiledMethod%3A%20each%5D.%0A%09self%20basicDelete%3A%20aClass%20name'),
+messageSends: ["ifTrue:", "isMetaclass", "error:", unescape("%2C"), "asString", "do:", "values", "methodDictionary", "removeCompiledMethod:", "class", "basicDelete:", "name"],
 referencedClasses: []
 }),
-smalltalk.Date.klass);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_now'),
+unescape('_removePackage_'),
 smalltalk.method({
-selector: unescape('now'),
-category: 'instance creation',
-fn: function () {
+selector: unescape('removePackage%3A'),
+category: 'packages',
+fn: function (packageName) {
     var self = this;
-    return smalltalk.send(self, "_today", []);
+    var pkg = nil;
+    pkg = smalltalk.send(self, "_packageAt_ifAbsent_", [packageName, function () {return smalltalk.send(self, "_error_", [smalltalk.send("Missing package: ", "__comma", [packageName])]);}]);
+    smalltalk.send(smalltalk.send(pkg, "_classes", []), "_do_", [function (each) {return smalltalk.send(self, "_removeClass_", [each]);}]);
+    smalltalk.send(self, "_deletePackage_", [packageName]);
     return self;
 },
-args: [],
-source: unescape('now%0A%09%5Eself%20today'),
-messageSends: ["today"],
+args: ["packageName"],
+source: unescape('removePackage%3A%20packageName%0A%09%22Removes%20a%20package%20and%20all%20its%20classes.%22%0A%0A%09%7C%20pkg%20%7C%0A%09pkg%20%3A%3D%20self%20packageAt%3A%20packageName%20ifAbsent%3A%20%5Bself%20error%3A%20%27Missing%20package%3A%20%27%2C%20packageName%5D.%0A%09pkg%20classes%20do%3A%20%5B%3Aeach%20%7C%0A%20%20%20%20%20%20%20%20%09self%20removeClass%3A%20each%5D.%0A%09self%20deletePackage%3A%20packageName'),
+messageSends: ["packageAt:ifAbsent:", "error:", unescape("%2C"), "do:", "classes", "removeClass:", "deletePackage:"],
 referencedClasses: []
 }),
-smalltalk.Date.klass);
-
-smalltalk.addMethod(
-unescape('_millisecondsToRun_'),
-smalltalk.method({
-selector: unescape('millisecondsToRun%3A'),
-category: 'instance creation',
-fn: function (aBlock) {
-    var self = this;
-    var t = nil;
-    t = smalltalk.send(smalltalk.Date || Date, "_now", []);
-    smalltalk.send(aBlock, "_value", []);
-    return ($receiver = smalltalk.send(smalltalk.Date || Date, "_now", [])).klass === smalltalk.Number ? $receiver - t : smalltalk.send($receiver, "__minus", [t]);
-    return self;
-},
-args: ["aBlock"],
-source: unescape('millisecondsToRun%3A%20aBlock%0A%09%7C%20t%20%7C%0A%09t%20%3A%3D%20Date%20now.%0A%09aBlock%20value.%0A%09%5EDate%20now%20-%20t'),
-messageSends: ["now", "value", unescape("-")],
-referencedClasses: ["Date"]
-}),
-smalltalk.Date.klass);
-
+smalltalk.Smalltalk);
 
-smalltalk.addClass('JSObjectProxy', smalltalk.Object, ['jsObject'], 'Kernel-Objects');
-smalltalk.JSObjectProxy.comment=unescape('JSObjectProxy%20handles%20sending%20messages%20to%20JavaScript%20object%2C%20therefore%20accessing%20JavaScript%20objects%20from%20Amber%20is%20transparent.%0AJSOjbectProxy%20makes%20intensive%20use%20of%20%60%23doesNotUnderstand%3A%60.%0A%0A%23%23%20Examples%0A%0AJSObjectProxy%20objects%20are%20instanciated%20by%20Amber%20when%20a%20Smalltalk%20message%20is%20sent%20to%20a%20JavaScript%20object.%0A%0A%20%20%20%20window%20alert%3A%20%27hello%20world%27.%0A%20%20%20%20window%20inspect.%0A%20%20%20%20%28window%20jQuery%3A%20%27body%27%29%20append%3A%20%27hello%20world%27%0A%0ASmalltalk%20messages%20sends%20are%20converted%20to%20JavaScript%20function%20calls%20or%20object%20property%20access%20_%28in%20this%20order%29_.%20If%20n%20one%20of%20them%20match%2C%20a%20%60MessageNotUnderstood%60%20error%20will%20be%20thrown.%20%0A%0A%23%23%20Message%20conversion%20rules%0A%0A-%20%60someUser%20name%60%20becomes%20%20%60someUser.name%60%0A-%20%60someUser%20name%3A%20%27John%27%60%20becomes%20%60someUser%20name%20%3D%20%22John%22%60%0A-%20%60console%20log%3A%20%27hello%20world%27%60%20becomes%20%60console.log%28%27hello%20world%27%29%60%0A-%20%60%28window%20jQuery%3A%20%27foo%27%29%20css%3A%20%27background%27%20color%3A%20%27red%27%60%20becomes%20%60window.jQuery%28%27foo%27%29.css%28%27background%27%2C%20%27red%27%29%60%0A%0A__Note%3A__%20For%20keyword-based%20messages%2C%20only%20the%20first%20keyword%20is%20kept%3A%20%60window%20foo%3A%201%20bar%3A%202%60%20is%20equivalent%20to%20%60window%20foo%3A%201%20baz%3A%202%60.')
 smalltalk.addMethod(
-unescape('_jsObject_'),
+unescape('_renamePackage_to_'),
 smalltalk.method({
-selector: unescape('jsObject%3A'),
-category: 'accessing',
-fn: function (aJSObject) {
+selector: unescape('renamePackage%3Ato%3A'),
+category: 'packages',
+fn: function (packageName, newName) {
     var self = this;
-    self['@jsObject'] = aJSObject;
+    var pkg = nil;
+    pkg = smalltalk.send(self, "_packageAt_ifAbsent_", [packageName, function () {return smalltalk.send(self, "_error_", [smalltalk.send("Missing package: ", "__comma", [packageName])]);}]);
+    ($receiver = smalltalk.send(self, "_packageAt_", [newName])) != nil &&
+        $receiver != undefined ? function () {return smalltalk.send(self, "_error_", [smalltalk.send("Already exists a package called: ", "__comma", [newName])]);}() : nil;
+    smalltalk.packages[newName] = smalltalk.packages[packageName];
+    smalltalk.send(pkg, "_name_", [newName]);
+    smalltalk.send(self, "_deletePackage_", [packageName]);
     return self;
 },
-args: ["aJSObject"],
-source: unescape('jsObject%3A%20aJSObject%0A%09jsObject%20%3A%3D%20aJSObject'),
-messageSends: [],
+args: ["packageName", "newName"],
+source: unescape('renamePackage%3A%20packageName%20to%3A%20newName%0A%09%22Rename%20a%20package.%22%0A%0A%09%7C%20pkg%20%7C%0A%09pkg%20%3A%3D%20self%20packageAt%3A%20packageName%20ifAbsent%3A%20%5Bself%20error%3A%20%27Missing%20package%3A%20%27%2C%20packageName%5D.%0A%09%28self%20packageAt%3A%20newName%29%20ifNotNil%3A%20%5Bself%20error%3A%20%27Already%20exists%20a%20package%20called%3A%20%27%2C%20newName%5D.%0A%09%3Csmalltalk.packages%5BnewName%5D%20%3D%20smalltalk.packages%5BpackageName%5D%3E.%0A%09pkg%20name%3A%20newName.%0A%09self%20deletePackage%3A%20packageName.'),
+messageSends: ["packageAt:ifAbsent:", "error:", unescape("%2C"), "ifNotNil:", "packageAt:", "name:", "deletePackage:"],
 referencedClasses: []
 }),
-smalltalk.JSObjectProxy);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_jsObject'),
+unescape('_reservedWords'),
 smalltalk.method({
-selector: unescape('jsObject'),
+selector: unescape('reservedWords'),
 category: 'accessing',
 fn: function () {
     var self = this;
-    return self['@jsObject'];
+    return self.reservedWords;
     return self;
 },
 args: [],
-source: unescape('jsObject%0A%09%5EjsObject'),
+source: unescape('reservedWords%0A%09%22JavaScript%20reserved%20words%22%0A%09%3Creturn%20self.reservedWords%3E'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.JSObjectProxy);
-
-smalltalk.addMethod(
-unescape('_printString'),
-smalltalk.method({
-selector: unescape('printString'),
-category: 'proxy',
-fn: function () {
-    var self = this;
-    return smalltalk.send(smalltalk.send(self, "_jsObject", []), "_toString", []);
-    return self;
-},
-args: [],
-source: unescape('printString%0A%09%5Eself%20jsObject%20toString'),
-messageSends: ["toString", "jsObject"],
-referencedClasses: []
-}),
-smalltalk.JSObjectProxy);
-
-smalltalk.addMethod(
-unescape('_inspectOn_'),
-smalltalk.method({
-selector: unescape('inspectOn%3A'),
-category: 'proxy',
-fn: function (anInspector) {
-    var self = this;
-    var variables = nil;
-    variables = smalltalk.send(smalltalk.Dictionary || Dictionary, "_new", []);
-    smalltalk.send(variables, "_at_put_", [unescape("%23self"), smalltalk.send(self, "_jsObject", [])]);
-    smalltalk.send(anInspector, "_setLabel_", [smalltalk.send(self, "_printString", [])]);
-    for (var i in self['@jsObject']) {
-        variables._at_put_(i, self['@jsObject'][i]);
-    }
-    smalltalk.send(anInspector, "_setVariables_", [variables]);
-    return self;
-},
-args: ["anInspector"],
-source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self%20jsObject.%0A%09anInspector%20setLabel%3A%20self%20printString.%0A%09%3Cfor%28var%20i%20in%20self%5B%27@jsObject%27%5D%29%20%7B%0A%09%09variables._at_put_%28i%2C%20self%5B%27@jsObject%27%5D%5Bi%5D%29%3B%0A%09%7D%3E.%0A%09anInspector%20setVariables%3A%20variables'),
-messageSends: ["new", "at:put:", "jsObject", "setLabel:", "printString", "setVariables:"],
-referencedClasses: ["Dictionary"]
-}),
-smalltalk.JSObjectProxy);
+smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-unescape('_doesNotUnderstand_'),
+unescape('_send_to_arguments_'),
 smalltalk.method({
-selector: unescape('doesNotUnderstand%3A'),
-category: 'proxy',
-fn: function (aMessage) {
+selector: unescape('send%3Ato%3Aarguments%3A'),
+category: 'accessing',
+fn: function (aSelector, anObject, aCollection) {
     var self = this;
-    var obj = nil;
     var selector = nil;
-    var jsSelector = nil;
-    var arguments = nil;
-    obj = smalltalk.send(self, "_jsObject", []);
-    selector = smalltalk.send(aMessage, "_selector", []);
-    jsSelector = smalltalk.send(selector, "_asJavaScriptSelector", []);
-    arguments = smalltalk.send(aMessage, "_arguments", []);
-    if (obj[jsSelector] != undefined) {
-        return smalltalk.send(obj, jsSelector, arguments);
-    }
-    smalltalk.send(self, "_doesNotUnderstand_", [aMessage], smalltalk.Object);
+    selector = smalltalk.send(smalltalk.send(aSelector, "_asString", []), "_asSelector", []);
+    self.send(anObject, selector, aCollection);
     return self;
 },
-args: ["aMessage"],
-source: unescape('doesNotUnderstand%3A%20aMessage%0A%09%7C%20obj%20selector%20jsSelector%20arguments%20%7C%0A%09obj%20%3A%3D%20self%20jsObject.%0A%09selector%20%3A%3D%20aMessage%20selector.%0A%09jsSelector%20%3A%3D%20selector%20asJavaScriptSelector.%0A%09arguments%20%3A%3D%20aMessage%20arguments.%0A%09%3Cif%28obj%5BjsSelector%5D%20%21%3D%20undefined%29%20%7Breturn%20smalltalk.send%28obj%2C%20jsSelector%2C%20arguments%29%7D%3E.%0A%09super%20doesNotUnderstand%3A%20aMessage'),
-messageSends: ["jsObject", "selector", "asJavaScriptSelector", "arguments", "doesNotUnderstand:"],
+args: ["aSelector", "anObject", "aCollection"],
+source: unescape('send%3A%20aSelector%20to%3A%20anObject%20arguments%3A%20aCollection%0A%09%7C%20selector%20%7C%0A%09selector%20%3A%3D%20aSelector%20asString%20asSelector.%0A%09%3Cself.send%28anObject%2C%20selector%2C%20aCollection%29%3E'),
+messageSends: ["asSelector", "asString"],
 referencedClasses: []
 }),
-smalltalk.JSObjectProxy);
+smalltalk.Smalltalk);
 
-smalltalk.addMethod(
-unescape('_at_'),
-smalltalk.method({
-selector: unescape('at%3A'),
-category: 'accessing',
-fn: function (aSymbol) {
-    var self = this;
-    var attr = nil;
-    attr = smalltalk.send(aSymbol, "_asString", []);
-    return self['@jsObject'][attr];
-    return self;
-},
-args: ["aSymbol"],
-source: unescape('at%3A%20aSymbol%0A%09%7C%20attr%20%7C%0A%09attr%20%3A%3D%20aSymbol%20asString.%0A%09%3Creturn%20self%5B%27@jsObject%27%5D%5Battr%5D%3E'),
-messageSends: ["asString"],
-referencedClasses: []
-}),
-smalltalk.JSObjectProxy);
 
+smalltalk.Smalltalk.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-unescape('_at_put_'),
+unescape('_current'),
 smalltalk.method({
-selector: unescape('at%3Aput%3A'),
+selector: unescape('current'),
 category: 'accessing',
-fn: function (aSymbol, anObject) {
+fn: function () {
     var self = this;
-    var attr = nil;
-    attr = smalltalk.send(aSymbol, "_asString", []);
-    self['@jsObject'][attr] = anObject;
+    return smalltalk;
     return self;
 },
-args: ["aSymbol", "anObject"],
-source: unescape('at%3A%20aSymbol%20put%3A%20anObject%0A%09%7C%20attr%20%7C%0A%09attr%20%3A%3D%20aSymbol%20asString.%0A%09%3Cself%5B%27@jsObject%27%5D%5Battr%5D%20%3D%20anObject%3E'),
-messageSends: ["asString"],
+args: [],
+source: unescape('current%0A%09%3Creturn%20smalltalk%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.JSObjectProxy);
+smalltalk.Smalltalk.klass);
 
 
+smalltalk.addClass('UndefinedObject', smalltalk.Object, [], 'Kernel-Objects');
+smalltalk.UndefinedObject.comment=unescape('UndefinedObject%20describes%20the%20behavior%20of%20its%20sole%20instance%2C%20%60nil%60.%20%60nil%60%20represents%20a%20prior%20value%20for%20variables%20that%20have%20not%20been%20initialized%2C%20or%20for%20results%20which%20are%20meaningless.%0A%0A%60nil%60%20is%20the%20Smalltalk%20representation%20of%20the%20%60undefined%60%20JavaScript%20object.')
 smalltalk.addMethod(
-unescape('_on_'),
+unescape('_asJSON'),
 smalltalk.method({
-selector: unescape('on%3A'),
-category: 'instance creation',
-fn: function (aJSObject) {
-    var self = this;
-    return function ($rec) {smalltalk.send($rec, "_jsObject_", [aJSObject]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
-    return self;
-},
-args: ["aJSObject"],
-source: unescape('on%3A%20aJSObject%0A%09%5Eself%20new%0A%09%09jsObject%3A%20aJSObject%3B%0A%09%09yourself'),
-messageSends: ["jsObject:", "yourself", "new"],
+selector: unescape('asJSON'),
+category: 'converting',
+fn: function (){
+var self=this;
+return (typeof null == 'undefined' ? nil : null);
+return self;},
+args: [],
+source: unescape('asJSON%0A%09%5Enull'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.JSObjectProxy.klass);
-
+smalltalk.UndefinedObject);
 
-smalltalk.addClass('Point', smalltalk.Object, ['x', 'y'], 'Kernel-Objects');
-smalltalk.Point.comment=unescape('A%20%60Point%60%20represents%20an%20x-y%20pair%20of%20numbers%20usually%20designating%20a%20geometric%20coordinate.%0APoints%20are%20traditionally%20created%20using%20the%20binary%20%60%23@%60%20message%20to%20a%20number%3A%0A%0A%09100@120%0A%0APoints%20can%20then%20be%20arithmetically%20manipulated%3A%0A%0A%09100@100%20+%20%2810@10%29%0A%0A...or%20for%20example%3A%0A%0A%09%28100@100%29%20*%202%0A%0A**NOTE%3A**%20Creating%20a%20Point%20with%20a%20negative%20y-value%20will%20need%20a%20space%20after%20%60@%60%20in%20order%20to%20avoid%20a%20parsing%20error%3A%0A%0A%09100@%20-100%20%22but%20100@-100%20would%20not%20parse%22%0A%0AAmber%20does%20not%20have%20much%20behavior%20in%20this%20class%20out-of-the-box.')
 smalltalk.addMethod(
-unescape('_x'),
+unescape('_deepCopy'),
 smalltalk.method({
-selector: unescape('x'),
-category: 'accessing',
+selector: unescape('deepCopy'),
+category: 'copying',
 fn: function () {
     var self = this;
-    return self['@x'];
+    return self;
     return self;
 },
 args: [],
-source: unescape('x%0A%09%5Ex'),
+source: unescape('deepCopy%0A%09%5Eself'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('_y'),
+unescape('_ifNil_'),
 smalltalk.method({
-selector: unescape('y'),
-category: 'accessing',
-fn: function () {
+selector: unescape('ifNil%3A'),
+category: 'testing',
+fn: function (aBlock) {
     var self = this;
-    return self['@y'];
+    return smalltalk.send(self, "_ifNil_ifNotNil_", [aBlock, function () {return nil;}]);
     return self;
 },
-args: [],
-source: unescape('y%0A%09%5Ey'),
-messageSends: [],
+args: ["aBlock"],
+source: unescape('ifNil%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself%20ifNil%3A%20aBlock%20ifNotNil%3A%20%5B%5D'),
+messageSends: ["ifNil:ifNotNil:"],
 referencedClasses: []
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('_y_'),
+unescape('_ifNil_ifNotNil_'),
 smalltalk.method({
-selector: unescape('y%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('ifNil%3AifNotNil%3A'),
+category: 'testing',
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    self['@y'] = aNumber;
+    return smalltalk.send(aBlock, "_value", []);
     return self;
 },
-args: ["aNumber"],
-source: unescape('y%3A%20aNumber%0A%09y%20%3A%3D%20aNumber'),
-messageSends: [],
+args: ["aBlock", "anotherBlock"],
+source: unescape('ifNil%3A%20aBlock%20ifNotNil%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5EaBlock%20value'),
+messageSends: ["value"],
 referencedClasses: []
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('_x_'),
+unescape('_ifNotNil_'),
 smalltalk.method({
-selector: unescape('x%3A'),
-category: 'accessing',
-fn: function (aNumber) {
+selector: unescape('ifNotNil%3A'),
+category: 'testing',
+fn: function (aBlock) {
     var self = this;
-    self['@x'] = aNumber;
+    return self;
     return self;
 },
-args: ["aNumber"],
-source: unescape('x%3A%20aNumber%0A%09x%20%3A%3D%20aNumber'),
+args: ["aBlock"],
+source: unescape('ifNotNil%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5Eself'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('__star'),
+unescape('_ifNotNil_ifNil_'),
 smalltalk.method({
-selector: unescape('*'),
-category: 'arithmetic',
-fn: function (aPoint) {
+selector: unescape('ifNotNil%3AifNil%3A'),
+category: 'testing',
+fn: function (aBlock, anotherBlock) {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver * smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__star", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver * smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__star", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
+    return smalltalk.send(anotherBlock, "_value", []);
     return self;
 },
-args: ["aPoint"],
-source: unescape('*%20aPoint%0A%09%5EPoint%20x%3A%20self%20x%20*%20aPoint%20asPoint%20x%20y%3A%20self%20y%20*%20aPoint%20asPoint%20y'),
-messageSends: ["x:y:", unescape("*"), "x", "asPoint", "y"],
-referencedClasses: ["Point"]
+args: ["aBlock", "anotherBlock"],
+source: unescape('ifNotNil%3A%20aBlock%20ifNil%3A%20anotherBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%5EanotherBlock%20value'),
+messageSends: ["value"],
+referencedClasses: []
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('__plus'),
+unescape('_isNil'),
 smalltalk.method({
-selector: unescape('+'),
-category: 'arithmetic',
-fn: function (aPoint) {
+selector: unescape('isNil'),
+category: 'testing',
+fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver + smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver + smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
+    return true;
     return self;
 },
-args: ["aPoint"],
-source: unescape('+%20aPoint%0A%09%5EPoint%20x%3A%20self%20x%20+%20aPoint%20asPoint%20x%20y%3A%20self%20y%20+%20aPoint%20asPoint%20y'),
-messageSends: ["x:y:", unescape("+"), "x", "asPoint", "y"],
-referencedClasses: ["Point"]
+args: [],
+source: unescape('isNil%0A%09%5Etrue'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('__minus'),
+unescape('_notNil'),
 smalltalk.method({
-selector: unescape('-'),
-category: 'arithmetic',
-fn: function (aPoint) {
+selector: unescape('notNil'),
+category: 'testing',
+fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver - smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver - smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
+    return false;
     return self;
 },
-args: ["aPoint"],
-source: unescape('-%20aPoint%0A%09%5EPoint%20x%3A%20self%20x%20-%20aPoint%20asPoint%20x%20y%3A%20self%20y%20-%20aPoint%20asPoint%20y'),
-messageSends: ["x:y:", unescape("-"), "x", "asPoint", "y"],
-referencedClasses: ["Point"]
+args: [],
+source: unescape('notNil%0A%09%5Efalse'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('__slash'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('/'),
-category: 'arithmetic',
-fn: function (aPoint) {
+selector: unescape('printString'),
+category: 'printing',
+fn: function () {
     var self = this;
-    return smalltalk.send(smalltalk.Point || Point, "_x_y_", [($receiver = smalltalk.send(self, "_x", [])).klass === smalltalk.Number ? $receiver / smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_x", [])]), ($receiver = smalltalk.send(self, "_y", [])).klass === smalltalk.Number ? $receiver / smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(smalltalk.send(aPoint, "_asPoint", []), "_y", [])])]);
+    return "nil";
     return self;
 },
-args: ["aPoint"],
-source: unescape('/%20aPoint%0A%09%5EPoint%20x%3A%20self%20x%20/%20aPoint%20asPoint%20x%20y%3A%20self%20y%20/%20aPoint%20asPoint%20y'),
-messageSends: ["x:y:", unescape("/"), "x", "asPoint", "y"],
-referencedClasses: ["Point"]
+args: [],
+source: unescape('printString%0A%20%20%20%20%5E%27nil%27'),
+messageSends: [],
+referencedClasses: []
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('_asPoint'),
+unescape('_shallowCopy'),
 smalltalk.method({
-selector: unescape('asPoint'),
-category: 'converting',
+selector: unescape('shallowCopy'),
+category: 'copying',
 fn: function () {
     var self = this;
     return self;
     return self;
 },
 args: [],
-source: unescape('asPoint%0A%09%5Eself'),
+source: unescape('shallowCopy%0A%09%5Eself'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('__eq'),
+unescape('_subclass_instanceVariableNames_'),
 smalltalk.method({
-selector: unescape('%3D'),
-category: 'arithmetic',
-fn: function (aPoint) {
+selector: unescape('subclass%3AinstanceVariableNames%3A'),
+category: 'class creation',
+fn: function (aString, anotherString) {
     var self = this;
-    return smalltalk.send(smalltalk.send(smalltalk.send(aPoint, "_class", []), "__eq", [smalltalk.send(self, "_class", [])]), "_and_", [function () {return smalltalk.send(smalltalk.send(smalltalk.send(aPoint, "_x", []), "__eq", [smalltalk.send(self, "_x", [])]), "_&", [smalltalk.send(smalltalk.send(aPoint, "_y", []), "__eq", [smalltalk.send(self, "_y", [])])]);}]);
+    return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, anotherString, nil]);
     return self;
 },
-args: ["aPoint"],
-source: unescape('%3D%20aPoint%0A%09%5EaPoint%20class%20%3D%20self%20class%20and%3A%20%5B%0A%09%09%28aPoint%20x%20%3D%20self%20x%29%20%26%20%28aPoint%20y%20%3D%20self%20y%29%5D'),
-messageSends: ["and:", unescape("%3D"), "class", unescape("%26"), "x", "y"],
+args: ["aString", "anotherString"],
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%20package%3A%20nil'),
+messageSends: ["subclass:instanceVariableNames:package:"],
 referencedClasses: []
 }),
-smalltalk.Point);
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_subclass_instanceVariableNames_category_'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
-fn: function () {
+selector: unescape('subclass%3AinstanceVariableNames%3Acategory%3A'),
+category: 'class creation',
+fn: function (aString, aString2, aString3) {
     var self = this;
-    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (stream) {smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(smalltalk.send(self['@x'], "_printString", []), "__comma", [unescape("@")])]);($receiver = smalltalk.send(smalltalk.send(self['@y'], "_notNil", []), "_and_", [function () {return smalltalk.send(self['@y'], "_negative", []);}])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(stream, "_space", []);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(stream, "_space", []);}]);return smalltalk.send(stream, "_nextPutAll_", [smalltalk.send(self['@y'], "_printString", [])]);}]);
+    smalltalk.send(self, "_deprecatedAPI", []);
+    return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
     return self;
 },
-args: [],
-source: unescape('printString%0A%09%22Print%20receiver%20in%20classic%20x@y%20notation.%22%0A%0A%09%5EString%20streamContents%3A%20%5B%3Astream%20%7C%0A%09%09stream%20nextPutAll%3A%20x%20printString%2C%20%27@%27.%0A%09%09%28y%20notNil%20and%3A%20%5By%20negative%5D%29%0A%09%09%09ifTrue%3A%20%5B%0A%09%09%09%09%22Avoid%20ambiguous%20@-%20construct%22%0A%09%09%09%09stream%20space%5D.%0A%09%09stream%20nextPutAll%3A%20y%20printString%5D'),
-messageSends: ["streamContents:", "nextPutAll:", unescape("%2C"), "printString", "ifTrue:", "and:", "notNil", "negative", "space"],
-referencedClasses: ["String"]
-}),
-smalltalk.Point);
-
-smalltalk.addMethod(
-unescape('_translateBy_'),
-smalltalk.method({
-selector: unescape('translateBy%3A'),
-category: 'transforming',
-fn: function (delta){
-var self=this;
-return smalltalk.send(((($receiver = smalltalk.send(delta, "_x", [])).klass === smalltalk.Number) ? $receiver +self['@x'] : smalltalk.send($receiver, "__plus", [self['@x']])), "__at", [((($receiver = smalltalk.send(delta, "_y", [])).klass === smalltalk.Number) ? $receiver +self['@y'] : smalltalk.send($receiver, "__plus", [self['@y']]))]);
-return self;},
-args: ["delta"],
-source: unescape('translateBy%3A%20delta%20%0A%09%22Answer%20a%20Point%20translated%20by%20delta%20%28an%20instance%20of%20Point%29.%22%0A%09%5E%28delta%20x%20+%20x%29%20@%20%28delta%20y%20+%20y%29'),
-messageSends: [unescape("@"), unescape("+"), "x", "y"],
+args: ["aString", "aString2", "aString3"],
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%22Kept%20for%20compatibility.%22%0A%09self%20deprecatedAPI.%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3'),
+messageSends: ["deprecatedAPI", "subclass:instanceVariableNames:package:"],
 referencedClasses: []
 }),
-smalltalk.Point);
-
+smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-unescape('_x_y_'),
+unescape('_subclass_instanceVariableNames_package_'),
 smalltalk.method({
-selector: unescape('x%3Ay%3A'),
-category: 'instance creation',
-fn: function (aNumber, anotherNumber) {
+selector: unescape('subclass%3AinstanceVariableNames%3Apackage%3A'),
+category: 'class creation',
+fn: function (aString, aString2, aString3) {
     var self = this;
-    return function ($rec) {smalltalk.send($rec, "_x_", [aNumber]);smalltalk.send($rec, "_y_", [anotherNumber]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
+    return smalltalk.send(smalltalk.send(smalltalk.ClassBuilder || ClassBuilder, "_new", []), "_superclass_subclass_instanceVariableNames_package_", [self, aString, aString2, aString3]);
     return self;
 },
-args: ["aNumber", "anotherNumber"],
-source: unescape('x%3A%20aNumber%20y%3A%20anotherNumber%0A%09%5Eself%20new%0A%09%09x%3A%20aNumber%3B%0A%09%09y%3A%20anotherNumber%3B%0A%09%09yourself'),
-messageSends: ["x:", "y:", "yourself", "new"],
-referencedClasses: []
+args: ["aString", "aString2", "aString3"],
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3%0A%09%5EClassBuilder%20new%0A%09%20%20%20%20superclass%3A%20self%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3'),
+messageSends: ["superclass:subclass:instanceVariableNames:package:", "new"],
+referencedClasses: ["ClassBuilder"]
 }),
-smalltalk.Point.klass);
+smalltalk.UndefinedObject);
 
 
-smalltalk.addClass('Random', smalltalk.Object, [], 'Kernel-Objects');
-smalltalk.Random.comment=unescape('%60Random%60%20is%20a%20random%20number%20generator%20and%20is%20implemented%20as%20a%20trivial%20wrapper%20around%20javascript%20%60Math.random%28%29%60%20and%20is%20used%20like%20this%3A%0A%0A%09Random%20new%20next%0A%0AThis%20will%20return%20a%20float%20x%20where%20x%20%3C%201%20and%20x%20%3E%200.%20If%20you%20want%20a%20random%20integer%20from%201%20to%2010%20you%20can%20use%20%60%23atRandom%60%0A%0A%0910%20atRandom%0A%0A...and%20if%20you%20want%20a%20random%20number%20in%20a%20specific%20interval%20this%20also%20works%3A%0A%0A%09%283%20to%3A%207%29%20atRandom%0A%0A...but%20be%20aware%20that%20%60%23to%3A%60%20does%20not%20create%20an%20Interval%20as%20in%20other%20Smalltalk%20implementations%20but%20in%20fact%20an%20%60Array%60%20of%20numbers%2C%20so%20it%27s%20better%20to%20use%3A%0A%0A%095%20atRandom%20+%202%0A%0ASince%20%60%23atRandom%60%20is%20implemented%20in%20%60SequencableCollection%60%20you%20can%20easy%20pick%20an%20element%20at%20random%3A%0A%0A%09%23%28%27a%27%20%27b%27%20%27c%27%29%20atRandom%0A%0A...or%20perhaps%20a%20letter%20from%20a%20%60String%60%3A%0A%0A%09%27abc%27%20atRandom%0A%0ASince%20Amber%20does%20not%20have%20Characters%20this%20will%20return%20a%20%60String%60%20of%20length%201%20like%20for%20example%20%60%27b%27%60.')
 smalltalk.addMethod(
-unescape('_next'),
+unescape('_new'),
 smalltalk.method({
-selector: unescape('next'),
-category: 'accessing',
+selector: unescape('new'),
+category: 'instance creation',
 fn: function () {
     var self = this;
-    return Math.random();
+    smalltalk.send(self, "_error_", ["You cannot create new instances of UndefinedObject. Use nil"]);
     return self;
 },
 args: [],
-source: unescape('next%0A%09%3Creturn%20Math.random%28%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Random);
-
-smalltalk.addMethod(
-unescape('_next_'),
-smalltalk.method({
-selector: unescape('next%3A'),
-category: 'accessing',
-fn: function (anInteger) {
-    var self = this;
-    return smalltalk.send(smalltalk.send(1, "_to_", [anInteger]), "_collect_", [function (each) {return smalltalk.send(self, "_next", []);}]);
-    return self;
-},
-args: ["anInteger"],
-source: unescape('next%3A%20anInteger%0A%20%20%20%20%5E%281%20to%3A%20anInteger%29%20collect%3A%20%5B%3Aeach%20%7C%20self%20next%5D'),
-messageSends: ["collect:", "to:", "next"],
+source: unescape('new%0A%09%20%20%20%20self%20error%3A%20%27You%20cannot%20create%20new%20instances%20of%20UndefinedObject.%20Use%20nil%27'),
+messageSends: ["error:"],
 referencedClasses: []
 }),
-smalltalk.Random);
-
+smalltalk.UndefinedObject.klass);
 
 
diff --git a/amber/src/js/Kernel-Tests.deploy.js b/amber/src/js/Kernel-Tests.deploy.js
index 5bc5f5c80be..7844c658503 100644
--- a/amber/src/js/Kernel-Tests.deploy.js
+++ b/amber/src/js/Kernel-Tests.deploy.js
@@ -24,173 +24,237 @@ smalltalk.ArrayTest);
 
 
 
-smalltalk.addClass('StringTest', smalltalk.TestCase, [], 'Kernel-Tests');
+smalltalk.addClass('BlockClosureTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testJoin'),
+unescape('_testCompiledSource'),
 smalltalk.method({
-selector: unescape('testJoin'),
+selector: unescape('testCompiledSource'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("hello%2Cworld"), smalltalk.send(unescape("%2C"), "_join_", [["hello", "world"]])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((function(){return (1) + (1);}), "_compiledSource", []), "_includesSubString_", ["function"])]);
 return self;}
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testStreamContents'),
+unescape('_testEnsure'),
 smalltalk.method({
-selector: unescape('testStreamContents'),
+selector: unescape('testEnsure'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", ["hello world", smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(aStream){return (function($rec){smalltalk.send($rec, "_nextPutAll_", ["hello"]);smalltalk.send($rec, "_space", []);return smalltalk.send($rec, "_nextPutAll_", ["world"]);})(aStream);})])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((function(){return smalltalk.send((smalltalk.Error || Error), "_new", []);}), "_ensure_", [(function(){return true;})])]);
 return self;}
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testIncludesSubString'),
+unescape('_testNumArgs'),
 smalltalk.method({
-selector: unescape('testIncludesSubString'),
+selector: unescape('testNumArgs'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send("amber", "_includesSubString_", ["ber"])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("amber", "_includesSubString_", ["zork"])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return nil;}), "_numArgs", []), (0)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b){return nil;}), "_numArgs", []), (2)]);
 return self;}
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testEquality'),
+unescape('_testOnDo'),
 smalltalk.method({
-selector: unescape('testEquality'),
+selector: unescape('testOnDo'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send("hello", "__eq", ["hello"])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("hello", "__eq", ["world"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send("hello", "__eq", [smalltalk.send("hello", "_yourself", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_yourself", []), "__eq", ["hello"])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [(0)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((function(){return smalltalk.send(smalltalk.send((smalltalk.Error || Error), "_new", []), "_signal", []);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return true;})])]);
 return self;}
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testCopyWithoutAll'),
+unescape('_testValue'),
 smalltalk.method({
-selector: unescape('testCopyWithoutAll'),
+selector: unescape('testValue'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", ["hello world", smalltalk.send(unescape("*hello*%20*world*"), "_copyWithoutAll_", [unescape("*")])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return (1) + (1);}), "_value", []), (2)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(x){return ((($receiver = x).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]));}), "_value_", [(2)]), (3)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(x, y){return ((($receiver = x).klass === smalltalk.Number) ? $receiver *y : smalltalk.send($receiver, "__star", [y]));}), "_value_value_", [(2), (4)]), (8)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b, c){return (1);}), "_value", []), (1)]);
 return self;}
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testAt'),
+unescape('_testValueWithPossibleArguments'),
 smalltalk.method({
-selector: unescape('testAt'),
+selector: unescape('testValueWithPossibleArguments'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_", [(1)]), "__eq", ["h"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_", [(5)]), "__eq", ["o"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_ifAbsent_", [(6), (function(){return nil;})]), "__eq", [nil])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return (1);}), "_valueWithPossibleArguments_", [[(3), (4)]]), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +(4) : smalltalk.send($receiver, "__plus", [(4)]));}), "_valueWithPossibleArguments_", [[(3), (4)]]), (7)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +b : smalltalk.send($receiver, "__plus", [b]));}), "_valueWithPossibleArguments_", [[(3), (4), (5)]]), (7)]);
 return self;}
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testAtPut'),
+unescape('_testWhileFalse'),
 smalltalk.method({
-selector: unescape('testAtPut'),
+selector: unescape('testWhileFalse'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_at_put_", [(1), "a"]);}), (smalltalk.Error || Error)]);
+var i=nil;
+(i=(0));
+(function(){while(!(function(){return ((($receiver = i).klass === smalltalk.Number) ? $receiver >(5) : smalltalk.send($receiver, "__gt", [(5)]));})()) {(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
+smalltalk.send(self, "_assert_equals_", [i, (6)]);
+(i=(0));
+(function(){while(!(function(){(i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));return ((($receiver = i).klass === smalltalk.Number) ? $receiver >(5) : smalltalk.send($receiver, "__gt", [(5)]));})()) {}})();
+smalltalk.send(self, "_assert_equals_", [i, (6)]);
 return self;}
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testSize'),
+unescape('_testWhileTrue'),
 smalltalk.method({
-selector: unescape('testSize'),
+selector: unescape('testWhileTrue'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send("smalltalk", "_size", []), (9)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send("", "_size", []), (0)]);
+var i=nil;
+(i=(0));
+(function(){while((function(){return ((($receiver = i).klass === smalltalk.Number) ? $receiver <(5) : smalltalk.send($receiver, "__lt", [(5)]));})()) {(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
+smalltalk.send(self, "_assert_equals_", [i, (5)]);
+(i=(0));
+(function(){while((function(){(i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));return ((($receiver = i).klass === smalltalk.Number) ? $receiver <(5) : smalltalk.send($receiver, "__lt", [(5)]));})()) {}})();
+smalltalk.send(self, "_assert_equals_", [i, (5)]);
 return self;}
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
+
+
+smalltalk.addClass('BooleanTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testAddRemove'),
+unescape('_testEquality'),
 smalltalk.method({
-selector: unescape('testAddRemove'),
+selector: unescape('testEquality'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_add_", ["a"]);}), (smalltalk.Error || Error)]);
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_remove_", ["h"]);}), (smalltalk.Error || Error)]);
+smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [false])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [(0)])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [false])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [""])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(true, "__eq", [true])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [true])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(true, "__eq", [false])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(false, "__eq", [false])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(true, "_yourself", []), "__eq", [true])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(true, "_yourself", []), "__eq", [smalltalk.send(true, "_yourself", [])])]);
 return self;}
 }),
-smalltalk.StringTest);
+smalltalk.BooleanTest);
 
 smalltalk.addMethod(
-unescape('_testAsArray'),
+unescape('_testIfTrueIfFalse'),
 smalltalk.method({
-selector: unescape('testAsArray'),
+selector: unescape('testIfTrueIfFalse'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_asArray", []), "__eq", [["h", "e", "l", "l", "o"]])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return "alternative block";})])), "__eq", ["alternative block"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return "alternative block";})])), "__eq", [nil])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return "alternative block";})])), "__eq", [nil])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return "alternative block";})])), "__eq", ["alternative block"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block2"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block2"])]);
 return self;}
 }),
-smalltalk.StringTest);
+smalltalk.BooleanTest);
 
+smalltalk.addMethod(
+unescape('_testLogic'),
+smalltalk.method({
+selector: unescape('testLogic'),
+fn: function () {
+var self=this;
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_&", [true])]);smalltalk.send($rec, "_deny_", [smalltalk.send(true, "_&", [false])]);smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_&", [true])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_&", [false])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_|", [true])]);smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_|", [false])]);smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_|", [true])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_|", [false])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_&", [(1) > (0)])]);smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_&", [false])]);return smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_&", [(1) > (2)])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_|", [(1) > (0)])]);smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_|", [false])]);return smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_|", [(1) > (2)])]);})(self);
+return self;}
+}),
+smalltalk.BooleanTest);
+
+smalltalk.addMethod(
+unescape('_testLogicKeywords'),
+smalltalk.method({
+selector: unescape('testLogicKeywords'),
+fn: function () {
+var self=this;
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_and_", [(function(){return true;})])]);smalltalk.send($rec, "_deny_", [smalltalk.send(true, "_and_", [(function(){return false;})])]);smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_and_", [(function(){return true;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_and_", [(function(){return false;})])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_or_", [(function(){return true;})])]);smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_or_", [(function(){return false;})])]);smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_or_", [(function(){return true;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_or_", [(function(){return false;})])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_and_", [(function(){return (1) > (0);})])]);smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_and_", [(function(){return false;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_and_", [(function(){return (1) > (2);})])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_or_", [(function(){return (1) > (0);})])]);smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_or_", [(function(){return false;})])]);return smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_or_", [(function(){return (1) > (2);})])]);})(self);
+return self;}
+}),
+smalltalk.BooleanTest);
 
 
-smalltalk.addClass('DictionaryTest', smalltalk.TestCase, [], 'Kernel-Tests');
+
+smalltalk.addClass('ClassBuilderTest', smalltalk.TestCase, ['builder', 'theClass'], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testPrintString'),
+unescape('_setUp'),
 smalltalk.method({
-selector: unescape('testPrintString'),
+selector: unescape('setUp'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("a%20Dictionary%28%27firstname%27%20-%3E%20%27James%27%20%2C%20%27lastname%27%20-%3E%20%27Bond%27%29"), (function($rec){smalltalk.send($rec, "_at_put_", ["firstname", "James"]);smalltalk.send($rec, "_at_put_", ["lastname", "Bond"]);return smalltalk.send($rec, "_printString", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []))]);
+(self['@builder']=smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []));
 return self;}
 }),
-smalltalk.DictionaryTest);
+smalltalk.ClassBuilderTest);
 
 smalltalk.addMethod(
-unescape('_testEquality'),
+unescape('_tearDown'),
 smalltalk.method({
-selector: unescape('testEquality'),
+selector: unescape('tearDown'),
 fn: function () {
 var self=this;
-var d1=nil;
-var d2=nil;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []), "__eq", [smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])])]);
-(d1=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
-(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
-smalltalk.send(self, "_assert_", [smalltalk.send(d1, "__eq", [d2])]);
-(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (3)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
-smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
-(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(2), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
-smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
-(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);smalltalk.send($rec, "_at_put_", [(3), (4)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
-smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
+(($receiver = self['@theClass']) != nil && $receiver != undefined) ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removeClass_", [self['@theClass']]);return (self['@theClass']=nil);})() : nil;
 return self;}
 }),
-smalltalk.DictionaryTest);
+smalltalk.ClassBuilderTest);
 
 smalltalk.addMethod(
-unescape('_testDynamicDictionaries'),
+unescape('_testClassCopy'),
 smalltalk.method({
-selector: unescape('testDynamicDictionaries'),
+selector: unescape('testClassCopy'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.HashedCollection._fromPairs_([smalltalk.send("hello", "__minus_gt", [(1)])]), "_asDictionary", []), "__eq", [smalltalk.send((smalltalk.Dictionary || Dictionary), "_with_", [smalltalk.send("hello", "__minus_gt", [(1)])])])]);
+(self['@theClass']=smalltalk.send(self['@builder'], "_copyClass_named_", [(smalltalk.ObjectMock || ObjectMock), "ObjectMock2"]));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_superclass", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_superclass", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_instanceVariableNames", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_instanceVariableNames", [])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(self['@theClass'], "_name", []), "ObjectMock2"]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_package", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_package", [])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self['@theClass'], "_methodDictionary", []), "_keys", []), smalltalk.send(smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_methodDictionary", []), "_keys", [])]);
 return self;}
 }),
-smalltalk.DictionaryTest);
+smalltalk.ClassBuilderTest);
+
+smalltalk.addMethod(
+unescape('_testInstanceVariableNames'),
+smalltalk.method({
+selector: unescape('testInstanceVariableNames'),
+fn: function () {
+var self=this;
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(self['@builder'], "_instanceVariableNamesFor_", ["  hello   world   "]), ["hello", "world"]]);
+return self;}
+}),
+smalltalk.ClassBuilderTest);
+
 
+
+smalltalk.addClass('DictionaryTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
 unescape('_testAccessing'),
 smalltalk.method({
@@ -212,34 +276,34 @@ return self;}
 smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
-unescape('_testSize'),
+unescape('_testDynamicDictionaries'),
 smalltalk.method({
-selector: unescape('testSize'),
+selector: unescape('testDynamicDictionaries'),
 fn: function () {
 var self=this;
-var d=nil;
-(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(0)])]);
-smalltalk.send(d, "_at_put_", [(1), (2)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(1)])]);
-smalltalk.send(d, "_at_put_", [(2), (3)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(2)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.HashedCollection._fromPairs_([smalltalk.send("hello", "__minus_gt", [(1)])]), "_asDictionary", []), "__eq", [smalltalk.send((smalltalk.Dictionary || Dictionary), "_with_", [smalltalk.send("hello", "__minus_gt", [(1)])])])]);
 return self;}
 }),
 smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
-unescape('_testValues'),
+unescape('_testEquality'),
 smalltalk.method({
-selector: unescape('testValues'),
+selector: unescape('testEquality'),
 fn: function () {
 var self=this;
-var d=nil;
-(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
-smalltalk.send(d, "_at_put_", [(1), (2)]);
-smalltalk.send(d, "_at_put_", [(2), (3)]);
-smalltalk.send(d, "_at_put_", [(3), (4)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_values", []), "__eq", [[(2), (3), (4)]])]);
+var d1=nil;
+var d2=nil;
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []), "__eq", [smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])])]);
+(d1=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
+(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
+smalltalk.send(self, "_assert_", [smalltalk.send(d1, "__eq", [d2])]);
+(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (3)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
+smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
+(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(2), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
+smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
+(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);smalltalk.send($rec, "_at_put_", [(3), (4)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
+smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
 return self;}
 }),
 smalltalk.DictionaryTest);
@@ -260,575 +324,479 @@ return self;}
 }),
 smalltalk.DictionaryTest);
 
-
-
-smalltalk.addClass('BooleanTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testLogic'),
+unescape('_testPrintString'),
 smalltalk.method({
-selector: unescape('testLogic'),
+selector: unescape('testPrintString'),
 fn: function () {
 var self=this;
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_&", [true])]);smalltalk.send($rec, "_deny_", [smalltalk.send(true, "_&", [false])]);smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_&", [true])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_&", [false])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_|", [true])]);smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_|", [false])]);smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_|", [true])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_|", [false])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_&", [(1) > (0)])]);smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_&", [false])]);return smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_&", [(1) > (2)])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_|", [(1) > (0)])]);smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_|", [false])]);return smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_|", [(1) > (2)])]);})(self);
+smalltalk.send(self, "_assert_equals_", [unescape("a%20Dictionary%28%27firstname%27%20-%3E%20%27James%27%20%2C%20%27lastname%27%20-%3E%20%27Bond%27%29"), (function($rec){smalltalk.send($rec, "_at_put_", ["firstname", "James"]);smalltalk.send($rec, "_at_put_", ["lastname", "Bond"]);return smalltalk.send($rec, "_printString", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []))]);
 return self;}
 }),
-smalltalk.BooleanTest);
+smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
-unescape('_testEquality'),
+unescape('_testRemoveKey'),
 smalltalk.method({
-selector: unescape('testEquality'),
-fn: function () {
+selector: unescape('testRemoveKey'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [false])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [(0)])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [false])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [""])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(true, "__eq", [true])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [true])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(true, "__eq", [false])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(false, "__eq", [false])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(true, "_yourself", []), "__eq", [true])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(true, "_yourself", []), "__eq", [smalltalk.send(true, "_yourself", [])])]);
+var d=nil;
+var key=nil;
+(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(d, "_at_put_", [(1), (2)]);
+smalltalk.send(d, "_at_put_", [(2), (3)]);
+smalltalk.send(d, "_at_put_", [(3), (4)]);
+(key=(2));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_keys", []), "__eq", [[(1), (2), (3)]])]);
+smalltalk.send(d, "_removeKey_", [key]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_keys", []), "__eq", [[(1), (3)]])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_values", []), "__eq", [[(2), (4)]])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(d, "_includesKey_", [(2)])]);
 return self;}
 }),
-smalltalk.BooleanTest);
+smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
-unescape('_testLogicKeywords'),
+unescape('_testRemoveKeyIfAbsent'),
 smalltalk.method({
-selector: unescape('testLogicKeywords'),
-fn: function () {
+selector: unescape('testRemoveKeyIfAbsent'),
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_and_", [(function(){return true;})])]);smalltalk.send($rec, "_deny_", [smalltalk.send(true, "_and_", [(function(){return false;})])]);smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_and_", [(function(){return true;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_and_", [(function(){return false;})])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_or_", [(function(){return true;})])]);smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_or_", [(function(){return false;})])]);smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_or_", [(function(){return true;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_or_", [(function(){return false;})])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_and_", [(function(){return (1) > (0);})])]);smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_and_", [(function(){return false;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_and_", [(function(){return (1) > (2);})])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_or_", [(function(){return (1) > (0);})])]);smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_or_", [(function(){return false;})])]);return smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_or_", [(function(){return (1) > (2);})])]);})(self);
+var d=nil;
+var key=nil;
+(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(d, "_at_put_", [(1), (2)]);
+smalltalk.send(d, "_at_put_", [(2), (3)]);
+smalltalk.send(d, "_at_put_", [(3), (4)]);
+(key=(2));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_removeKey_", [key]), "__eq", [(3)])]);
+(key=(3));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_removeKey_ifAbsent_", [key, (function(){return (42);})]), "__eq", [(4)])]);
+(key="why");
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_removeKey_ifAbsent_", [key, (function(){return (42);})]), "__eq", [(42)])]);
 return self;}
 }),
-smalltalk.BooleanTest);
+smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
-unescape('_testIfTrueIfFalse'),
+unescape('_testSize'),
 smalltalk.method({
-selector: unescape('testIfTrueIfFalse'),
+selector: unescape('testSize'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return "alternative block";})])), "__eq", ["alternative block"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return "alternative block";})])), "__eq", [nil])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return "alternative block";})])), "__eq", [nil])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return "alternative block";})])), "__eq", ["alternative block"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block2"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block2"])]);
+var d=nil;
+(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(0)])]);
+smalltalk.send(d, "_at_put_", [(1), (2)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(1)])]);
+smalltalk.send(d, "_at_put_", [(2), (3)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(2)])]);
 return self;}
 }),
-smalltalk.BooleanTest);
-
-
+smalltalk.DictionaryTest);
 
-smalltalk.addClass('NumberTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testPrintShowingDecimalPlaces'),
+unescape('_testValues'),
 smalltalk.method({
-selector: unescape('testPrintShowingDecimalPlaces'),
+selector: unescape('testValues'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", ["23.00", smalltalk.send((23), "_printShowingDecimalPlaces_", [(2)])]);
-smalltalk.send(self, "_assert_equals_", ["23.57", smalltalk.send((23.5698), "_printShowingDecimalPlaces_", [(2)])]);
-smalltalk.send(self, "_assert_equals_", [unescape("-234.56700"), smalltalk.send(smalltalk.send((234.567), "_negated", []), "_printShowingDecimalPlaces_", [(5)])]);
-smalltalk.send(self, "_assert_equals_", ["23", smalltalk.send((23.4567), "_printShowingDecimalPlaces_", [(0)])]);
-smalltalk.send(self, "_assert_equals_", ["24", smalltalk.send((23.5567), "_printShowingDecimalPlaces_", [(0)])]);
-smalltalk.send(self, "_assert_equals_", [unescape("-23"), smalltalk.send(smalltalk.send((23.4567), "_negated", []), "_printShowingDecimalPlaces_", [(0)])]);
-smalltalk.send(self, "_assert_equals_", [unescape("-24"), smalltalk.send(smalltalk.send((23.5567), "_negated", []), "_printShowingDecimalPlaces_", [(0)])]);
-smalltalk.send(self, "_assert_equals_", ["100000000.0", smalltalk.send((100000000), "_printShowingDecimalPlaces_", [(1)])]);
-smalltalk.send(self, "_assert_equals_", ["0.98000", smalltalk.send((0.98), "_printShowingDecimalPlaces_", [(5)])]);
-smalltalk.send(self, "_assert_equals_", [unescape("-0.98"), smalltalk.send(smalltalk.send((0.98), "_negated", []), "_printShowingDecimalPlaces_", [(2)])]);
-smalltalk.send(self, "_assert_equals_", ["2.57", smalltalk.send((2.567), "_printShowingDecimalPlaces_", [(2)])]);
-smalltalk.send(self, "_assert_equals_", [unescape("-2.57"), smalltalk.send((-2.567), "_printShowingDecimalPlaces_", [(2)])]);
-smalltalk.send(self, "_assert_equals_", ["0.00", smalltalk.send((0), "_printShowingDecimalPlaces_", [(2)])]);
+var d=nil;
+(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(d, "_at_put_", [(1), (2)]);
+smalltalk.send(d, "_at_put_", [(2), (3)]);
+smalltalk.send(d, "_at_put_", [(3), (4)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_values", []), "__eq", [[(2), (3), (4)]])]);
 return self;}
 }),
-smalltalk.NumberTest);
+smalltalk.DictionaryTest);
 
-smalltalk.addMethod(
-unescape('_testEquality'),
-smalltalk.method({
-selector: unescape('testEquality'),
-fn: function () {
-var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((0), "__eq", [(0)])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq", [(0)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq", [smalltalk.send((1), "_yourself", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq", [smalltalk.send((1), "_yourself", [])])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [false])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [(0)])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [(0)])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [""])]);
-return self;}
-}),
-smalltalk.NumberTest);
 
-smalltalk.addMethod(
-unescape('_testArithmetic'),
-smalltalk.method({
-selector: unescape('testArithmetic'),
-fn: function () {
-var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send((1.5) + (1), "__eq", [(2.5)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((2) - (1), "__eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((-2) - (1), "__eq", [(-3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((12) / (2), "__eq", [(6)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((3) * (4), "__eq", [(12)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = (1) + (2)).klass === smalltalk.Number) ? $receiver *(3) : smalltalk.send($receiver, "__star", [(3)])), "__eq", [(9)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((1) + (2) * (3), "__eq", [(7)])]);
-return self;}
-}),
-smalltalk.NumberTest);
 
+smalltalk.addClass('JSObjectProxyTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testRounded'),
+unescape('_jsObject'),
 smalltalk.method({
-selector: unescape('testRounded'),
+selector: unescape('jsObject'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_rounded", []), "__eq", [(3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.212), "_rounded", []), "__eq", [(3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.51), "_rounded", []), "__eq", [(4)])]);
+return jsObject = {a: 1, b: function() {return 2;}, c: function(object) {return object;}};
 return self;}
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
 smalltalk.addMethod(
-unescape('_testNegated'),
+unescape('_testDNU'),
 smalltalk.method({
-selector: unescape('testNegated'),
+selector: unescape('testDNU'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_negated", []), "__eq", [(-3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((-3), "_negated", []), "__eq", [(3)])]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send(self, "_jsObject", []), "_foo", []);}), (smalltalk.MessageNotUnderstood || MessageNotUnderstood)]);
 return self;}
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
 smalltalk.addMethod(
-unescape('_testComparison'),
+unescape('_testMessageSend'),
 smalltalk.method({
-selector: unescape('testComparison'),
+selector: unescape('testMessageSend'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [(3) > (2)]);
-smalltalk.send(self, "_assert_", [(2) < (3)]);
-smalltalk.send(self, "_deny_", [(3) < (2)]);
-smalltalk.send(self, "_deny_", [(2) > (3)]);
-smalltalk.send(self, "_assert_", [(3) >= (3)]);
-smalltalk.send(self, "_assert_", [(3.1) >= (3)]);
-smalltalk.send(self, "_assert_", [(3) <= (3)]);
-smalltalk.send(self, "_assert_", [(3) <= (3.1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_a", []), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_b", []), (2)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_c_", [(3)]), (3)]);
 return self;}
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
 smalltalk.addMethod(
-unescape('_testTruncated'),
+unescape('_testMethodWithArguments'),
 smalltalk.method({
-selector: unescape('testTruncated'),
+selector: unescape('testMethodWithArguments'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_truncated", []), "__eq", [(3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.212), "_truncated", []), "__eq", [(3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.51), "_truncated", []), "__eq", [(3)])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
+smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["amber"]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
+smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["amber"]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
 return self;}
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
 smalltalk.addMethod(
-unescape('_testCopying'),
+unescape('_testPrinting'),
 smalltalk.method({
-selector: unescape('testCopying'),
+selector: unescape('testPrinting'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_copy", []), "__eq_eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_deepCopy", []), "__eq_eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_jsObject", []), "_printString", []), "__eq", [unescape("%5Bobject%20Object%5D")])]);
 return self;}
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
 smalltalk.addMethod(
-unescape('_testMinMax'),
+unescape('_testPropertyThatReturnsEmptyString'),
 smalltalk.method({
-selector: unescape('testMinMax'),
+selector: unescape('testPropertyThatReturnsEmptyString'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((2), "_max_", [(5)]), (5)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((2), "_min_", [(5)]), (2)]);
+document.location.hash = '';
+smalltalk.send(self, "_assert_equals_", ["", smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash", [])]);
+smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash_", ["test"]);
+smalltalk.send(self, "_assert_equals_", [unescape("%23test"), smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash", [])]);
 return self;}
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
 smalltalk.addMethod(
-unescape('_testIdentity'),
+unescape('_testYourself'),
 smalltalk.method({
-selector: unescape('testIdentity'),
+selector: unescape('testYourself'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq_eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((0), "__eq_eq", [(0)])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq_eq", [(0)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq_eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq_eq", [smalltalk.send((1), "_yourself", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq_eq", [smalltalk.send((1), "_yourself", [])])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq_eq", [(2)])]);
+var body=nil;
+(body=(function($rec){smalltalk.send($rec, "_addClass_", ["amber"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send("body", "_asJQuery", [])));
+smalltalk.send(self, "_assert_", [smalltalk.send(body, "_hasClass_", ["amber"])]);
+smalltalk.send(body, "_removeClass_", ["amber"]);
+smalltalk.send(self, "_deny_", [smalltalk.send(body, "_hasClass_", ["amber"])]);
 return self;}
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
-smalltalk.addMethod(
-unescape('_testSqrt'),
-smalltalk.method({
-selector: unescape('testSqrt'),
-fn: function () {
-var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((4), "_sqrt", []), "__eq", [(2)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((16), "_sqrt", []), "__eq", [(4)])]);
-return self;}
-}),
-smalltalk.NumberTest);
 
-smalltalk.addMethod(
-unescape('_testSquared'),
-smalltalk.method({
-selector: unescape('testSquared'),
-fn: function () {
-var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((4), "_squared", []), "__eq", [(16)])]);
-return self;}
-}),
-smalltalk.NumberTest);
 
+smalltalk.addClass('NumberTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testTimesRepeat'),
+unescape('_testArithmetic'),
 smalltalk.method({
-selector: unescape('testTimesRepeat'),
+selector: unescape('testArithmetic'),
 fn: function () {
 var self=this;
-var i=nil;
-(i=(0));
-smalltalk.send((0), "_timesRepeat_", [(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})]);
-smalltalk.send(self, "_assert_equals_", [i, (0)]);
-smalltalk.send((5), "_timesRepeat_", [(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})]);
-smalltalk.send(self, "_assert_equals_", [i, (5)]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1.5) + (1), "__eq", [(2.5)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((2) - (1), "__eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((-2) - (1), "__eq", [(-3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((12) / (2), "__eq", [(6)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((3) * (4), "__eq", [(12)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = (1) + (2)).klass === smalltalk.Number) ? $receiver *(3) : smalltalk.send($receiver, "__star", [(3)])), "__eq", [(9)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1) + (2) * (3), "__eq", [(7)])]);
 return self;}
 }),
 smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testTo'),
+unescape('_testComparison'),
 smalltalk.method({
-selector: unescape('testTo'),
+selector: unescape('testComparison'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((1), "_to_", [(5)]), [(1), (2), (3), (4), (5)]]);
+smalltalk.send(self, "_assert_", [(3) > (2)]);
+smalltalk.send(self, "_assert_", [(2) < (3)]);
+smalltalk.send(self, "_deny_", [(3) < (2)]);
+smalltalk.send(self, "_deny_", [(2) > (3)]);
+smalltalk.send(self, "_assert_", [(3) >= (3)]);
+smalltalk.send(self, "_assert_", [(3.1) >= (3)]);
+smalltalk.send(self, "_assert_", [(3) <= (3)]);
+smalltalk.send(self, "_assert_", [(3) <= (3.1)]);
 return self;}
 }),
 smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testToBy'),
+unescape('_testCopying'),
 smalltalk.method({
-selector: unescape('testToBy'),
+selector: unescape('testCopying'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((0), "_to_by_", [(6), (2)]), [(0), (2), (4), (6)]]);
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send((1), "_to_by_", [(4), (0)]);}), (smalltalk.Error || Error)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_copy", []), "__eq_eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_deepCopy", []), "__eq_eq", [(1)])]);
 return self;}
 }),
 smalltalk.NumberTest);
 
-
-
-smalltalk.addClass('JSObjectProxyTest', smalltalk.TestCase, [], 'Kernel-Tests');
-smalltalk.addMethod(
-unescape('_jsObject'),
-smalltalk.method({
-selector: unescape('jsObject'),
-fn: function () {
-var self=this;
-return jsObject = {a: 1, b: function() {return 2;}, c: function(object) {return object;}};
-return self;}
-}),
-smalltalk.JSObjectProxyTest);
-
-smalltalk.addMethod(
-unescape('_testMethodWithArguments'),
-smalltalk.method({
-selector: unescape('testMethodWithArguments'),
-fn: function () {
-var self=this;
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
-smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["amber"]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
-smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["amber"]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
-return self;}
-}),
-smalltalk.JSObjectProxyTest);
-
-smalltalk.addMethod(
-unescape('_testYourself'),
-smalltalk.method({
-selector: unescape('testYourself'),
-fn: function () {
-var self=this;
-var body=nil;
-(body=(function($rec){smalltalk.send($rec, "_addClass_", ["amber"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send("body", "_asJQuery", [])));
-smalltalk.send(self, "_assert_", [smalltalk.send(body, "_hasClass_", ["amber"])]);
-smalltalk.send(body, "_removeClass_", ["amber"]);
-smalltalk.send(self, "_deny_", [smalltalk.send(body, "_hasClass_", ["amber"])]);
-return self;}
-}),
-smalltalk.JSObjectProxyTest);
-
-smalltalk.addMethod(
-unescape('_testPropertyThatReturnsEmptyString'),
-smalltalk.method({
-selector: unescape('testPropertyThatReturnsEmptyString'),
-fn: function () {
-var self=this;
-document.location.hash = '';
-smalltalk.send(self, "_assert_equals_", ["", smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash", [])]);
-smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash_", ["test"]);
-smalltalk.send(self, "_assert_equals_", [unescape("%23test"), smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash", [])]);
-return self;}
-}),
-smalltalk.JSObjectProxyTest);
-
 smalltalk.addMethod(
-unescape('_testDNU'),
+unescape('_testEquality'),
 smalltalk.method({
-selector: unescape('testDNU'),
+selector: unescape('testEquality'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send(self, "_jsObject", []), "_foo", []);}), (smalltalk.MessageNotUnderstood || MessageNotUnderstood)]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((0), "__eq", [(0)])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq", [(0)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq", [smalltalk.send((1), "_yourself", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq", [smalltalk.send((1), "_yourself", [])])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [false])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [(0)])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [(0)])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [""])]);
 return self;}
 }),
-smalltalk.JSObjectProxyTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testMessageSend'),
+unescape('_testIdentity'),
 smalltalk.method({
-selector: unescape('testMessageSend'),
+selector: unescape('testIdentity'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_a", []), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_b", []), (2)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_c_", [(3)]), (3)]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq_eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((0), "__eq_eq", [(0)])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq_eq", [(0)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq_eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq_eq", [smalltalk.send((1), "_yourself", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq_eq", [smalltalk.send((1), "_yourself", [])])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq_eq", [(2)])]);
 return self;}
 }),
-smalltalk.JSObjectProxyTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testPrinting'),
+unescape('_testMinMax'),
 smalltalk.method({
-selector: unescape('testPrinting'),
+selector: unescape('testMinMax'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_jsObject", []), "_printString", []), "__eq", [unescape("%5Bobject%20Object%5D")])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((2), "_max_", [(5)]), (5)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((2), "_min_", [(5)]), (2)]);
 return self;}
 }),
-smalltalk.JSObjectProxyTest);
-
-
+smalltalk.NumberTest);
 
-smalltalk.addClass('PackageTest', smalltalk.TestCase, ['zorkPackage', 'grulPackage', 'backUpCommitPathJs', 'backUpCommitPathSt'], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_setUp'),
+unescape('_testNegated'),
 smalltalk.method({
-selector: unescape('setUp'),
+selector: unescape('testNegated'),
 fn: function () {
 var self=this;
-(self['@backUpCommitPathJs']=smalltalk.send((smalltalk.Package || Package), "_defaultCommitPathJs", []));
-(self['@backUpCommitPathSt']=smalltalk.send((smalltalk.Package || Package), "_defaultCommitPathSt", []));
-smalltalk.send((smalltalk.Package || Package), "_resetCommitPaths", []);
-(self['@zorkPackage']=smalltalk.send(smalltalk.send((smalltalk.Package || Package), "_new", []), "_name_", ["Zork"]));
-(self['@grulPackage']=(function($rec){smalltalk.send($rec, "_name_", ["Grul"]);smalltalk.send($rec, "_commitPathJs_", [unescape("server/grul/js")]);smalltalk.send($rec, "_commitPathSt_", [unescape("grul/st")]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Package || Package), "_new", [])));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_negated", []), "__eq", [(-3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((-3), "_negated", []), "__eq", [(3)])]);
 return self;}
 }),
-smalltalk.PackageTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_tearDown'),
+unescape('_testPrintShowingDecimalPlaces'),
 smalltalk.method({
-selector: unescape('tearDown'),
+selector: unescape('testPrintShowingDecimalPlaces'),
 fn: function () {
 var self=this;
-(function($rec){smalltalk.send($rec, "_defaultCommitPathJs_", [self['@backUpCommitPathJs']]);return smalltalk.send($rec, "_defaultCommitPathSt_", [self['@backUpCommitPathSt']]);})((smalltalk.Package || Package));
+smalltalk.send(self, "_assert_equals_", ["23.00", smalltalk.send((23), "_printShowingDecimalPlaces_", [(2)])]);
+smalltalk.send(self, "_assert_equals_", ["23.57", smalltalk.send((23.5698), "_printShowingDecimalPlaces_", [(2)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("-234.56700"), smalltalk.send(smalltalk.send((234.567), "_negated", []), "_printShowingDecimalPlaces_", [(5)])]);
+smalltalk.send(self, "_assert_equals_", ["23", smalltalk.send((23.4567), "_printShowingDecimalPlaces_", [(0)])]);
+smalltalk.send(self, "_assert_equals_", ["24", smalltalk.send((23.5567), "_printShowingDecimalPlaces_", [(0)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("-23"), smalltalk.send(smalltalk.send((23.4567), "_negated", []), "_printShowingDecimalPlaces_", [(0)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("-24"), smalltalk.send(smalltalk.send((23.5567), "_negated", []), "_printShowingDecimalPlaces_", [(0)])]);
+smalltalk.send(self, "_assert_equals_", ["100000000.0", smalltalk.send((100000000), "_printShowingDecimalPlaces_", [(1)])]);
+smalltalk.send(self, "_assert_equals_", ["0.98000", smalltalk.send((0.98), "_printShowingDecimalPlaces_", [(5)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("-0.98"), smalltalk.send(smalltalk.send((0.98), "_negated", []), "_printShowingDecimalPlaces_", [(2)])]);
+smalltalk.send(self, "_assert_equals_", ["2.57", smalltalk.send((2.567), "_printShowingDecimalPlaces_", [(2)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("-2.57"), smalltalk.send((-2.567), "_printShowingDecimalPlaces_", [(2)])]);
+smalltalk.send(self, "_assert_equals_", ["0.00", smalltalk.send((0), "_printShowingDecimalPlaces_", [(2)])]);
 return self;}
 }),
-smalltalk.PackageTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testGrulCommitPathStShouldBeGrulSt'),
+unescape('_testRounded'),
 smalltalk.method({
-selector: unescape('testGrulCommitPathStShouldBeGrulSt'),
+selector: unescape('testRounded'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("grul/st"), smalltalk.send(self['@grulPackage'], "_commitPathSt", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_rounded", []), "__eq", [(3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.212), "_rounded", []), "__eq", [(3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.51), "_rounded", []), "__eq", [(4)])]);
 return self;}
 }),
-smalltalk.PackageTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testZorkCommitPathStShouldBeSt'),
+unescape('_testSqrt'),
 smalltalk.method({
-selector: unescape('testZorkCommitPathStShouldBeSt'),
+selector: unescape('testSqrt'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", ["st", smalltalk.send(self['@zorkPackage'], "_commitPathSt", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((4), "_sqrt", []), "__eq", [(2)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((16), "_sqrt", []), "__eq", [(4)])]);
 return self;}
 }),
-smalltalk.PackageTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testZorkCommitPathJsShouldBeJs'),
+unescape('_testSquared'),
 smalltalk.method({
-selector: unescape('testZorkCommitPathJsShouldBeJs'),
+selector: unescape('testSquared'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", ["js", smalltalk.send(self['@zorkPackage'], "_commitPathJs", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((4), "_squared", []), "__eq", [(16)])]);
 return self;}
 }),
-smalltalk.PackageTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testGrulCommitPathJsShouldBeServerGrulJs'),
+unescape('_testTimesRepeat'),
 smalltalk.method({
-selector: unescape('testGrulCommitPathJsShouldBeServerGrulJs'),
+selector: unescape('testTimesRepeat'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("server/grul/js"), smalltalk.send(self['@grulPackage'], "_commitPathJs", [])]);
+var i=nil;
+(i=(0));
+smalltalk.send((0), "_timesRepeat_", [(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})]);
+smalltalk.send(self, "_assert_equals_", [i, (0)]);
+smalltalk.send((5), "_timesRepeat_", [(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})]);
+smalltalk.send(self, "_assert_equals_", [i, (5)]);
 return self;}
 }),
-smalltalk.PackageTest);
-
-
+smalltalk.NumberTest);
 
-smalltalk.addClass('BlockClosureTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testValue'),
+unescape('_testTo'),
 smalltalk.method({
-selector: unescape('testValue'),
+selector: unescape('testTo'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return (1) + (1);}), "_value", []), (2)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(x){return ((($receiver = x).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]));}), "_value_", [(2)]), (3)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(x, y){return ((($receiver = x).klass === smalltalk.Number) ? $receiver *y : smalltalk.send($receiver, "__star", [y]));}), "_value_value_", [(2), (4)]), (8)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b, c){return (1);}), "_value", []), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((1), "_to_", [(5)]), [(1), (2), (3), (4), (5)]]);
 return self;}
 }),
-smalltalk.BlockClosureTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testOnDo'),
+unescape('_testToBy'),
 smalltalk.method({
-selector: unescape('testOnDo'),
+selector: unescape('testToBy'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send((function(){return smalltalk.send(smalltalk.send((smalltalk.Error || Error), "_new", []), "_signal", []);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return true;})])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((0), "_to_by_", [(6), (2)]), [(0), (2), (4), (6)]]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send((1), "_to_by_", [(4), (0)]);}), (smalltalk.Error || Error)]);
 return self;}
 }),
-smalltalk.BlockClosureTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testEnsure'),
+unescape('_testTruncated'),
 smalltalk.method({
-selector: unescape('testEnsure'),
+selector: unescape('testTruncated'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send((function(){return smalltalk.send((smalltalk.Error || Error), "_new", []);}), "_ensure_", [(function(){return true;})])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_truncated", []), "__eq", [(3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.212), "_truncated", []), "__eq", [(3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.51), "_truncated", []), "__eq", [(3)])]);
 return self;}
 }),
-smalltalk.BlockClosureTest);
+smalltalk.NumberTest);
+
 
+
+smalltalk.addClass('ObjectMock', smalltalk.Object, ['foo', 'bar'], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testNumArgs'),
+unescape('_foo'),
 smalltalk.method({
-selector: unescape('testNumArgs'),
+selector: unescape('foo'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return nil;}), "_numArgs", []), (0)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b){return nil;}), "_numArgs", []), (2)]);
+return self['@foo'];
 return self;}
 }),
-smalltalk.BlockClosureTest);
+smalltalk.ObjectMock);
 
 smalltalk.addMethod(
-unescape('_testValueWithPossibleArguments'),
+unescape('_foo_'),
 smalltalk.method({
-selector: unescape('testValueWithPossibleArguments'),
-fn: function () {
+selector: unescape('foo%3A'),
+fn: function (anObject) {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return (1);}), "_valueWithPossibleArguments_", [[(3), (4)]]), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +(4) : smalltalk.send($receiver, "__plus", [(4)]));}), "_valueWithPossibleArguments_", [[(3), (4)]]), (7)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +b : smalltalk.send($receiver, "__plus", [b]));}), "_valueWithPossibleArguments_", [[(3), (4), (5)]]), (7)]);
+(self['@foo']=anObject);
 return self;}
 }),
-smalltalk.BlockClosureTest);
+smalltalk.ObjectMock);
+
 
+
+smalltalk.addClass('ObjectTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testWhileTrue'),
+unescape('_testBasicAccess'),
 smalltalk.method({
-selector: unescape('testWhileTrue'),
+selector: unescape('testBasicAccess'),
 fn: function () {
 var self=this;
-var i=nil;
-(i=(0));
-(function(){while((function(){return ((($receiver = i).klass === smalltalk.Number) ? $receiver <(5) : smalltalk.send($receiver, "__lt", [(5)]));})()) {(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
-smalltalk.send(self, "_assert_equals_", [i, (5)]);
-(i=(0));
-(function(){while((function(){(i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));return ((($receiver = i).klass === smalltalk.Number) ? $receiver <(5) : smalltalk.send($receiver, "__lt", [(5)]));})()) {}})();
-smalltalk.send(self, "_assert_equals_", [i, (5)]);
+var o=nil;
+(o=smalltalk.send((smalltalk.Object || Object), "_new", []));
+smalltalk.send(o, "_basicAt_put_", ["a", (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicAt_", ["a"]), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicAt_", ["b"]), nil]);
 return self;}
 }),
-smalltalk.BlockClosureTest);
+smalltalk.ObjectTest);
 
 smalltalk.addMethod(
-unescape('_testWhileFalse'),
+unescape('_testBasicPerform'),
 smalltalk.method({
-selector: unescape('testWhileFalse'),
+selector: unescape('testBasicPerform'),
 fn: function () {
 var self=this;
-var i=nil;
-(i=(0));
-(function(){while(!(function(){return ((($receiver = i).klass === smalltalk.Number) ? $receiver >(5) : smalltalk.send($receiver, "__gt", [(5)]));})()) {(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
-smalltalk.send(self, "_assert_equals_", [i, (6)]);
-(i=(0));
-(function(){while(!(function(){(i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));return ((($receiver = i).klass === smalltalk.Number) ? $receiver >(5) : smalltalk.send($receiver, "__gt", [(5)]));})()) {}})();
-smalltalk.send(self, "_assert_equals_", [i, (6)]);
+var o=nil;
+(o=smalltalk.send((smalltalk.Object || Object), "_new", []));
+smalltalk.send(o, "_basicAt_put_", ["func", (function(){return "hello";})]);
+smalltalk.send(o, "_basicAt_put_", ["func2", (function(a){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]));})]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicPerform_", ["func"]), "hello"]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicPerform_withArguments_", ["func2", [(3)]]), (4)]);
 return self;}
 }),
-smalltalk.BlockClosureTest);
+smalltalk.ObjectTest);
 
 smalltalk.addMethod(
-unescape('_testCompiledSource'),
+unescape('_testDNU'),
 smalltalk.method({
-selector: unescape('testCompiledSource'),
+selector: unescape('testDNU'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((function(){return (1) + (1);}), "_compiledSource", []), "_includesSubString_", ["function"])]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_foo", []);}), (smalltalk.MessageNotUnderstood || MessageNotUnderstood)]);
 return self;}
 }),
-smalltalk.BlockClosureTest);
-
-
+smalltalk.ObjectTest);
 
-smalltalk.addClass('ObjectTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
 unescape('_testEquality'),
 smalltalk.method({
@@ -845,6 +813,17 @@ return self;}
 }),
 smalltalk.ObjectTest);
 
+smalltalk.addMethod(
+unescape('_testHalt'),
+smalltalk.method({
+selector: unescape('testHalt'),
+fn: function () {
+var self=this;
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_halt", []);}), (smalltalk.Error || Error)]);
+return self;}
+}),
+smalltalk.ObjectTest);
+
 smalltalk.addMethod(
 unescape('_testIdentity'),
 smalltalk.method({
@@ -860,27 +839,32 @@ return self;}
 smalltalk.ObjectTest);
 
 smalltalk.addMethod(
-unescape('_testHalt'),
+unescape('_testIfNil'),
 smalltalk.method({
-selector: unescape('testHalt'),
+selector: unescape('testIfNil'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_halt", []);}), (smalltalk.Error || Error)]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_isNil", [])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver, "__eq", [true])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) != nil && $receiver != undefined) ? (function(){return true;})() : nil, "__eq", [true])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
 return self;}
 }),
 smalltalk.ObjectTest);
 
 smalltalk.addMethod(
-unescape('_testBasicAccess'),
+unescape('_testInstVars'),
 smalltalk.method({
-selector: unescape('testBasicAccess'),
+selector: unescape('testInstVars'),
 fn: function () {
 var self=this;
 var o=nil;
-(o=smalltalk.send((smalltalk.Object || Object), "_new", []));
-smalltalk.send(o, "_basicAt_put_", ["a", (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicAt_", ["a"]), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicAt_", ["b"]), nil]);
+(o=smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_new", []));
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", [smalltalk.symbolFor("foo")]), nil]);
+smalltalk.send(o, "_instVarAt_put_", [smalltalk.symbolFor("foo"), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", [smalltalk.symbolFor("foo")]), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", ["foo"]), (1)]);
 return self;}
 }),
 smalltalk.ObjectTest);
@@ -896,6 +880,19 @@ return self;}
 }),
 smalltalk.ObjectTest);
 
+smalltalk.addMethod(
+unescape('_testYourself'),
+smalltalk.method({
+selector: unescape('testYourself'),
+fn: function () {
+var self=this;
+var o=nil;
+(o=smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_new", []));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(o, "_yourself", []), "__eq_eq", [o])]);
+return self;}
+}),
+smalltalk.ObjectTest);
+
 smalltalk.addMethod(
 unescape('_testidentityHash'),
 smalltalk.method({
@@ -912,558 +909,605 @@ return self;}
 }),
 smalltalk.ObjectTest);
 
+
+
+smalltalk.addClass('PackageTest', smalltalk.TestCase, ['zorkPackage', 'grulPackage', 'backUpCommitPathJs', 'backUpCommitPathSt'], 'Kernel-Tests');
+smalltalk.addMethod(
+unescape('_setUp'),
+smalltalk.method({
+selector: unescape('setUp'),
+fn: function () {
+var self=this;
+(self['@backUpCommitPathJs']=smalltalk.send((smalltalk.Package || Package), "_defaultCommitPathJs", []));
+(self['@backUpCommitPathSt']=smalltalk.send((smalltalk.Package || Package), "_defaultCommitPathSt", []));
+smalltalk.send((smalltalk.Package || Package), "_resetCommitPaths", []);
+(self['@zorkPackage']=smalltalk.send(smalltalk.send((smalltalk.Package || Package), "_new", []), "_name_", ["Zork"]));
+(self['@grulPackage']=(function($rec){smalltalk.send($rec, "_name_", ["Grul"]);smalltalk.send($rec, "_commitPathJs_", [unescape("server/grul/js")]);smalltalk.send($rec, "_commitPathSt_", [unescape("grul/st")]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Package || Package), "_new", [])));
+return self;}
+}),
+smalltalk.PackageTest);
+
 smalltalk.addMethod(
-unescape('_testBasicPerform'),
+unescape('_tearDown'),
 smalltalk.method({
-selector: unescape('testBasicPerform'),
+selector: unescape('tearDown'),
 fn: function () {
 var self=this;
-var o=nil;
-(o=smalltalk.send((smalltalk.Object || Object), "_new", []));
-smalltalk.send(o, "_basicAt_put_", ["func", (function(){return "hello";})]);
-smalltalk.send(o, "_basicAt_put_", ["func2", (function(a){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]));})]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicPerform_", ["func"]), "hello"]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicPerform_withArguments_", ["func2", [(3)]]), (4)]);
+(function($rec){smalltalk.send($rec, "_defaultCommitPathJs_", [self['@backUpCommitPathJs']]);return smalltalk.send($rec, "_defaultCommitPathSt_", [self['@backUpCommitPathSt']]);})((smalltalk.Package || Package));
+return self;}
+}),
+smalltalk.PackageTest);
+
+smalltalk.addMethod(
+unescape('_testGrulCommitPathJsShouldBeServerGrulJs'),
+smalltalk.method({
+selector: unescape('testGrulCommitPathJsShouldBeServerGrulJs'),
+fn: function () {
+var self=this;
+smalltalk.send(self, "_assert_equals_", [unescape("server/grul/js"), smalltalk.send(self['@grulPackage'], "_commitPathJs", [])]);
+return self;}
+}),
+smalltalk.PackageTest);
+
+smalltalk.addMethod(
+unescape('_testGrulCommitPathStShouldBeGrulSt'),
+smalltalk.method({
+selector: unescape('testGrulCommitPathStShouldBeGrulSt'),
+fn: function () {
+var self=this;
+smalltalk.send(self, "_assert_equals_", [unescape("grul/st"), smalltalk.send(self['@grulPackage'], "_commitPathSt", [])]);
+return self;}
+}),
+smalltalk.PackageTest);
+
+smalltalk.addMethod(
+unescape('_testZorkCommitPathJsShouldBeJs'),
+smalltalk.method({
+selector: unescape('testZorkCommitPathJsShouldBeJs'),
+fn: function () {
+var self=this;
+smalltalk.send(self, "_assert_equals_", ["js", smalltalk.send(self['@zorkPackage'], "_commitPathJs", [])]);
+return self;}
+}),
+smalltalk.PackageTest);
+
+smalltalk.addMethod(
+unescape('_testZorkCommitPathStShouldBeSt'),
+smalltalk.method({
+selector: unescape('testZorkCommitPathStShouldBeSt'),
+fn: function () {
+var self=this;
+smalltalk.send(self, "_assert_equals_", ["st", smalltalk.send(self['@zorkPackage'], "_commitPathSt", [])]);
 return self;}
 }),
-smalltalk.ObjectTest);
+smalltalk.PackageTest);
 
+
+
+smalltalk.addClass('PackageWithDefaultCommitPathChangedTest', smalltalk.PackageTest, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testIfNil'),
+unescape('_setUp'),
 smalltalk.method({
-selector: unescape('testIfNil'),
+selector: unescape('setUp'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_isNil", [])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver, "__eq", [true])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) != nil && $receiver != undefined) ? (function(){return true;})() : nil, "__eq", [true])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
+smalltalk.send(self, "_setUp", [], smalltalk.PackageTest);
+(function($rec){smalltalk.send($rec, "_defaultCommitPathJs_", [unescape("javascripts/")]);return smalltalk.send($rec, "_defaultCommitPathSt_", [unescape("smalltalk/")]);})((smalltalk.Package || Package));
 return self;}
 }),
-smalltalk.ObjectTest);
+smalltalk.PackageWithDefaultCommitPathChangedTest);
 
 smalltalk.addMethod(
-unescape('_testInstVars'),
+unescape('_testGrulCommitPathJsShouldBeServerGrulJs'),
 smalltalk.method({
-selector: unescape('testInstVars'),
+selector: unescape('testGrulCommitPathJsShouldBeServerGrulJs'),
 fn: function () {
 var self=this;
-var o=nil;
-(o=smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_new", []));
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", [smalltalk.symbolFor("foo")]), nil]);
-smalltalk.send(o, "_instVarAt_put_", [smalltalk.symbolFor("foo"), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", [smalltalk.symbolFor("foo")]), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", ["foo"]), (1)]);
+smalltalk.send(self, "_assert_equals_", [unescape("server/grul/js"), smalltalk.send(self['@grulPackage'], "_commitPathJs", [])]);
 return self;}
 }),
-smalltalk.ObjectTest);
+smalltalk.PackageWithDefaultCommitPathChangedTest);
 
 smalltalk.addMethod(
-unescape('_testYourself'),
+unescape('_testGrulCommitPathStShouldBeGrulSt'),
 smalltalk.method({
-selector: unescape('testYourself'),
+selector: unescape('testGrulCommitPathStShouldBeGrulSt'),
 fn: function () {
 var self=this;
-var o=nil;
-(o=smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_new", []));
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(o, "_yourself", []), "__eq_eq", [o])]);
+smalltalk.send(self, "_assert_equals_", [unescape("grul/st"), smalltalk.send(self['@grulPackage'], "_commitPathSt", [])]);
 return self;}
 }),
-smalltalk.ObjectTest);
+smalltalk.PackageWithDefaultCommitPathChangedTest);
 
 smalltalk.addMethod(
-unescape('_testDNU'),
+unescape('_testZorkCommitPathJsShouldBeJavascript'),
 smalltalk.method({
-selector: unescape('testDNU'),
+selector: unescape('testZorkCommitPathJsShouldBeJavascript'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_foo", []);}), (smalltalk.MessageNotUnderstood || MessageNotUnderstood)]);
+smalltalk.send(self, "_assert_equals_", [unescape("javascripts/"), smalltalk.send(self['@zorkPackage'], "_commitPathJs", [])]);
 return self;}
 }),
-smalltalk.ObjectTest);
-
-
+smalltalk.PackageWithDefaultCommitPathChangedTest);
 
-smalltalk.addClass('SymbolTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testEquality'),
+unescape('_testZorkCommitPathStShouldBeSmalltalk'),
 smalltalk.method({
-selector: unescape('testEquality'),
+selector: unescape('testZorkCommitPathStShouldBeSmalltalk'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.symbolFor("hello")])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.symbolFor("world")])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", []), "__eq", [smalltalk.symbolFor("hello")])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", ["hello"])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("hello", "__eq", [smalltalk.symbolFor("hello")])]);
+smalltalk.send(self, "_assert_equals_", [unescape("smalltalk/"), smalltalk.send(self['@zorkPackage'], "_commitPathSt", [])]);
 return self;}
 }),
-smalltalk.SymbolTest);
+smalltalk.PackageWithDefaultCommitPathChangedTest);
+
 
 smalltalk.addMethod(
-unescape('_testAt'),
+unescape('_shouldInheritSelectors'),
 smalltalk.method({
-selector: unescape('testAt'),
+selector: unescape('shouldInheritSelectors'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_", [(1)]), "__eq", ["h"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_", [(5)]), "__eq", ["o"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_ifAbsent_", [(6), (function(){return nil;})]), "__eq", [nil])]);
+return false;
 return self;}
 }),
-smalltalk.SymbolTest);
+smalltalk.PackageWithDefaultCommitPathChangedTest.klass);
 
+
+smalltalk.addClass('PointTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testAtPut'),
+unescape('_testAccessing'),
 smalltalk.method({
-selector: unescape('testAtPut'),
+selector: unescape('testAccessing'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_at_put_", [(1), "a"]);}), (smalltalk.Error || Error)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)]), "_x", []), (3)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)]), "_y", []), (4)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_new", []), "_x_", [(3)]), "_x", []), (3)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_new", []), "_y_", [(4)]), "_y", []), (4)]);
 return self;}
 }),
-smalltalk.SymbolTest);
+smalltalk.PointTest);
 
 smalltalk.addMethod(
-unescape('_testIdentity'),
+unescape('_testArithmetic'),
 smalltalk.method({
-selector: unescape('testIdentity'),
+selector: unescape('testArithmetic'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.symbolFor("hello")])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.symbolFor("world")])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", []), "__eq", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_asString", []), "_asSymbol", [])])]);
+smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver *smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__star", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(9), (16)])]);
+smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver +smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__plus", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(6), (8)])]);
+smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver -smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__minus", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(0), (0)])]);
+smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((6), "__at", [(8)])).klass === smalltalk.Number) ? $receiver /smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__slash", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(2), (2)])]);
 return self;}
 }),
-smalltalk.SymbolTest);
+smalltalk.PointTest);
 
 smalltalk.addMethod(
-unescape('_testComparing'),
+unescape('_testAt'),
 smalltalk.method({
-selector: unescape('testComparing'),
+selector: unescape('testAt'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >smalltalk.symbolFor("aa") : smalltalk.send($receiver, "__gt", [smalltalk.symbolFor("aa")]))]);
-smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__gt", [smalltalk.symbolFor("ba")]))]);
-smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver <smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt", [smalltalk.symbolFor("ba")]))]);
-smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("bb")).klass === smalltalk.Number) ? $receiver <smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt", [smalltalk.symbolFor("ba")]))]);
-smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >=smalltalk.symbolFor("aa") : smalltalk.send($receiver, "__gt_eq", [smalltalk.symbolFor("aa")]))]);
-smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__gt_eq", [smalltalk.symbolFor("ba")]))]);
-smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver <=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt_eq", [smalltalk.symbolFor("ba")]))]);
-smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("bb")).klass === smalltalk.Number) ? $receiver <=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt_eq", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(4)]), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)])]);
 return self;}
 }),
-smalltalk.SymbolTest);
+smalltalk.PointTest);
 
 smalltalk.addMethod(
-unescape('_testSize'),
+unescape('_testEgality'),
 smalltalk.method({
-selector: unescape('testSize'),
+selector: unescape('testEgality'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("a"), "_size", []), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("aaaaa"), "_size", []), (5)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "__at", [(4)]), "__eq", [smalltalk.send((3), "__at", [(4)])])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send((3), "__at", [(5)]), "__eq", [smalltalk.send((3), "__at", [(6)])])]);
 return self;}
 }),
-smalltalk.SymbolTest);
+smalltalk.PointTest);
 
 smalltalk.addMethod(
-unescape('_testAsString'),
+unescape('_testTranslateBy'),
 smalltalk.method({
-selector: unescape('testAsString'),
-fn: function () {
+selector: unescape('testTranslateBy'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("hello"), "_asString", []), "hello"]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(4)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((0), "__at", [(1)])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(2)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((0), "__at", [smalltalk.send((1), "_negated", [])])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((5), "__at", [(6)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((2), "__at", [(3)])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((0), "__at", [(3)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send(smalltalk.send((3), "_negated", []), "__at", [(0)])])]);
 return self;}
 }),
-smalltalk.SymbolTest);
+smalltalk.PointTest);
+
 
+
+smalltalk.addClass('RandomTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testAsSymbol'),
+unescape('_textNext'),
 smalltalk.method({
-selector: unescape('testAsSymbol'),
+selector: unescape('textNext'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_asSymbol", [])])]);
+smalltalk.send((10000), "_timesRepeat_", [(function(){var current=nil;
+var next=nil;
+(next=smalltalk.send(smalltalk.send((smalltalk.Random || Random), "_new", []), "_next", []));smalltalk.send(self, "_assert_", [((($receiver = next).klass === smalltalk.Number) ? $receiver >=(0) : smalltalk.send($receiver, "__gt_eq", [(0)]))]);smalltalk.send(self, "_assert_", [((($receiver = next).klass === smalltalk.Number) ? $receiver <(1) : smalltalk.send($receiver, "__lt", [(1)]))]);smalltalk.send(self, "_deny_", [smalltalk.send(current, "__eq", [next])]);return smalltalk.send(next, "__eq", [current]);})]);
 return self;}
 }),
-smalltalk.SymbolTest);
+smalltalk.RandomTest);
 
+
+
+smalltalk.addClass('SetTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testCopying'),
+unescape('_testAddRemove'),
 smalltalk.method({
-selector: unescape('testCopying'),
+selector: unescape('testAddRemove'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_copy", []), "__eq_eq", [smalltalk.symbolFor("hello")])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_deepCopy", []), "__eq_eq", [smalltalk.symbolFor("hello")])]);
+var set=nil;
+(set=smalltalk.send((smalltalk.Set || Set), "_new", []));
+smalltalk.send(self, "_assert_", [smalltalk.send(set, "_isEmpty", [])]);
+smalltalk.send(set, "_add_", [(3)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(set, "_includes_", [(3)])]);
+smalltalk.send(set, "_add_", [(5)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(set, "_includes_", [(5)])]);
+smalltalk.send(set, "_remove_", [(3)]);
+smalltalk.send(self, "_deny_", [smalltalk.send(set, "_includes_", [(3)])]);
 return self;}
 }),
-smalltalk.SymbolTest);
+smalltalk.SetTest);
 
 smalltalk.addMethod(
-unescape('_testIsSymbolIsString'),
+unescape('_testAt'),
 smalltalk.method({
-selector: unescape('testIsSymbolIsString'),
+selector: unescape('testAt'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "_isSymbol", [])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("hello", "_isSymbol", [])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "_isString", [])]);
-smalltalk.send(self, "_assert_", [smalltalk.send("hello", "_isString", [])]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_new", []), "_at_put_", [(1), (2)]);}), (smalltalk.Error || Error)]);
 return self;}
 }),
-smalltalk.SymbolTest);
-
-
+smalltalk.SetTest);
 
-smalltalk.addClass('ObjectMock', smalltalk.Object, ['foo', 'bar'], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_foo'),
+unescape('_testSize'),
 smalltalk.method({
-selector: unescape('foo'),
+selector: unescape('testSize'),
 fn: function () {
 var self=this;
-return self['@foo'];
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_new", []), "_size", []), (0)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_withAll_", [[(1), (2), (3), (4)]]), "_size", []), (4)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_withAll_", [[(1), (1), (1), (1)]]), "_size", []), (1)]);
 return self;}
 }),
-smalltalk.ObjectMock);
+smalltalk.SetTest);
 
 smalltalk.addMethod(
-unescape('_foo_'),
+unescape('_testUnicity'),
 smalltalk.method({
-selector: unescape('foo%3A'),
-fn: function (anObject) {
+selector: unescape('testUnicity'),
+fn: function () {
 var self=this;
-(self['@foo']=anObject);
+var set=nil;
+(set=smalltalk.send((smalltalk.Set || Set), "_new", []));
+smalltalk.send(set, "_add_", [(21)]);
+smalltalk.send(set, "_add_", ["hello"]);
+smalltalk.send(set, "_add_", [(21)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(set, "_size", []), "__eq", [(2)])]);
+smalltalk.send(set, "_add_", ["hello"]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(set, "_size", []), "__eq", [(2)])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(set, "_asArray", []), [(21), "hello"]]);
 return self;}
 }),
-smalltalk.ObjectMock);
+smalltalk.SetTest);
 
 
 
-smalltalk.addClass('UndefinedTest', smalltalk.TestCase, [], 'Kernel-Tests');
+smalltalk.addClass('StringTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testIsNil'),
+unescape('_testAddRemove'),
 smalltalk.method({
-selector: unescape('testIsNil'),
+selector: unescape('testAddRemove'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(nil, "_isNil", [])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(nil, "_notNil", [])]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_add_", ["a"]);}), (smalltalk.Error || Error)]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_remove_", ["h"]);}), (smalltalk.Error || Error)]);
 return self;}
 }),
-smalltalk.UndefinedTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testIfNil'),
+unescape('_testAsArray'),
 smalltalk.method({
-selector: unescape('testIfNil'),
+selector: unescape('testAsArray'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [(($receiver = nil) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver, true]);
-smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = nil) != nil && $receiver != undefined) ? (function(){return true;})() : nil, "__eq", [true])]);
-smalltalk.send(self, "_assert_equals_", [(($receiver = nil) == nil || $receiver == undefined) ? (function(){return true;})() : (function(){return false;})(), true]);
-smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = nil) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_asArray", []), "__eq", [["h", "e", "l", "l", "o"]])]);
 return self;}
 }),
-smalltalk.UndefinedTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testCopying'),
+unescape('_testAt'),
 smalltalk.method({
-selector: unescape('testCopying'),
+selector: unescape('testAt'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(nil, "_copy", []), nil]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_", [(1)]), "__eq", ["h"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_", [(5)]), "__eq", ["o"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_ifAbsent_", [(6), (function(){return nil;})]), "__eq", [nil])]);
 return self;}
 }),
-smalltalk.UndefinedTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testDeepCopy'),
+unescape('_testAtPut'),
 smalltalk.method({
-selector: unescape('testDeepCopy'),
+selector: unescape('testAtPut'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(nil, "_deepCopy", []), "__eq", [nil])]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_at_put_", [(1), "a"]);}), (smalltalk.Error || Error)]);
 return self;}
 }),
-smalltalk.UndefinedTest);
-
-
+smalltalk.StringTest);
 
-smalltalk.addClass('PointTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testAccessing'),
+unescape('_testCopyWithoutAll'),
 smalltalk.method({
-selector: unescape('testAccessing'),
+selector: unescape('testCopyWithoutAll'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)]), "_x", []), (3)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)]), "_y", []), (4)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_new", []), "_x_", [(3)]), "_x", []), (3)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_new", []), "_y_", [(4)]), "_y", []), (4)]);
+smalltalk.send(self, "_assert_equals_", ["hello world", smalltalk.send(unescape("*hello*%20*world*"), "_copyWithoutAll_", [unescape("*")])]);
 return self;}
 }),
-smalltalk.PointTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testAt'),
+unescape('_testEquality'),
 smalltalk.method({
-selector: unescape('testAt'),
+selector: unescape('testEquality'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(4)]), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send("hello", "__eq", ["hello"])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("hello", "__eq", ["world"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send("hello", "__eq", [smalltalk.send("hello", "_yourself", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_yourself", []), "__eq", ["hello"])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [(0)])]);
 return self;}
 }),
-smalltalk.PointTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testEgality'),
+unescape('_testIncludesSubString'),
 smalltalk.method({
-selector: unescape('testEgality'),
+selector: unescape('testIncludesSubString'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "__at", [(4)]), "__eq", [smalltalk.send((3), "__at", [(4)])])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send((3), "__at", [(5)]), "__eq", [smalltalk.send((3), "__at", [(6)])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send("amber", "_includesSubString_", ["ber"])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("amber", "_includesSubString_", ["zork"])]);
 return self;}
 }),
-smalltalk.PointTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testArithmetic'),
+unescape('_testJoin'),
 smalltalk.method({
-selector: unescape('testArithmetic'),
+selector: unescape('testJoin'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver *smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__star", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(9), (16)])]);
-smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver +smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__plus", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(6), (8)])]);
-smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver -smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__minus", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(0), (0)])]);
-smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((6), "__at", [(8)])).klass === smalltalk.Number) ? $receiver /smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__slash", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(2), (2)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("hello%2Cworld"), smalltalk.send(unescape("%2C"), "_join_", [["hello", "world"]])]);
 return self;}
 }),
-smalltalk.PointTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testTranslateBy'),
+unescape('_testSize'),
 smalltalk.method({
-selector: unescape('testTranslateBy'),
-fn: function (){
+selector: unescape('testSize'),
+fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(4)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((0), "__at", [(1)])])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(2)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((0), "__at", [smalltalk.send((1), "_negated", [])])])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((5), "__at", [(6)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((2), "__at", [(3)])])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((0), "__at", [(3)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send(smalltalk.send((3), "_negated", []), "__at", [(0)])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send("smalltalk", "_size", []), (9)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send("", "_size", []), (0)]);
 return self;}
 }),
-smalltalk.PointTest);
-
-
+smalltalk.StringTest);
 
-smalltalk.addClass('RandomTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_textNext'),
+unescape('_testStreamContents'),
 smalltalk.method({
-selector: unescape('textNext'),
+selector: unescape('testStreamContents'),
 fn: function () {
 var self=this;
-smalltalk.send((10000), "_timesRepeat_", [(function(){var current=nil;
-var next=nil;
-(next=smalltalk.send(smalltalk.send((smalltalk.Random || Random), "_new", []), "_next", []));smalltalk.send(self, "_assert_", [((($receiver = next).klass === smalltalk.Number) ? $receiver >=(0) : smalltalk.send($receiver, "__gt_eq", [(0)]))]);smalltalk.send(self, "_assert_", [((($receiver = next).klass === smalltalk.Number) ? $receiver <(1) : smalltalk.send($receiver, "__lt", [(1)]))]);smalltalk.send(self, "_deny_", [smalltalk.send(current, "__eq", [next])]);return smalltalk.send(next, "__eq", [current]);})]);
+smalltalk.send(self, "_assert_equals_", ["hello world", smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(aStream){return (function($rec){smalltalk.send($rec, "_nextPutAll_", ["hello"]);smalltalk.send($rec, "_space", []);return smalltalk.send($rec, "_nextPutAll_", ["world"]);})(aStream);})])]);
 return self;}
 }),
-smalltalk.RandomTest);
+smalltalk.StringTest);
 
 
 
-smalltalk.addClass('ClassBuilderTest', smalltalk.TestCase, ['builder', 'theClass'], 'Kernel-Tests');
+smalltalk.addClass('SymbolTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_setUp'),
+unescape('_testAsString'),
 smalltalk.method({
-selector: unescape('setUp'),
+selector: unescape('testAsString'),
 fn: function () {
 var self=this;
-(self['@builder']=smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []));
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("hello"), "_asString", []), "hello"]);
 return self;}
 }),
-smalltalk.ClassBuilderTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_tearDown'),
+unescape('_testAsSymbol'),
 smalltalk.method({
-selector: unescape('tearDown'),
+selector: unescape('testAsSymbol'),
 fn: function () {
 var self=this;
-(($receiver = self['@theClass']) != nil && $receiver != undefined) ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removeClass_", [self['@theClass']]);return (self['@theClass']=nil);})() : nil;
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_asSymbol", [])])]);
 return self;}
 }),
-smalltalk.ClassBuilderTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testClassCopy'),
+unescape('_testAt'),
 smalltalk.method({
-selector: unescape('testClassCopy'),
+selector: unescape('testAt'),
 fn: function () {
 var self=this;
-(self['@theClass']=smalltalk.send(self['@builder'], "_copyClass_named_", [(smalltalk.ObjectMock || ObjectMock), "ObjectMock2"]));
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_superclass", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_superclass", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_instanceVariableNames", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_instanceVariableNames", [])])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(self['@theClass'], "_name", []), "ObjectMock2"]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_package", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_package", [])])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self['@theClass'], "_methodDictionary", []), "_keys", []), smalltalk.send(smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_methodDictionary", []), "_keys", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_", [(1)]), "__eq", ["h"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_", [(5)]), "__eq", ["o"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_ifAbsent_", [(6), (function(){return nil;})]), "__eq", [nil])]);
 return self;}
 }),
-smalltalk.ClassBuilderTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testInstanceVariableNames'),
+unescape('_testAtPut'),
 smalltalk.method({
-selector: unescape('testInstanceVariableNames'),
+selector: unescape('testAtPut'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(self['@builder'], "_instanceVariableNamesFor_", ["  hello   world   "]), ["hello", "world"]]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_at_put_", [(1), "a"]);}), (smalltalk.Error || Error)]);
 return self;}
 }),
-smalltalk.ClassBuilderTest);
-
-
+smalltalk.SymbolTest);
 
-smalltalk.addClass('SetTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testUnicity'),
+unescape('_testComparing'),
 smalltalk.method({
-selector: unescape('testUnicity'),
+selector: unescape('testComparing'),
 fn: function () {
 var self=this;
-var set=nil;
-(set=smalltalk.send((smalltalk.Set || Set), "_new", []));
-smalltalk.send(set, "_add_", [(21)]);
-smalltalk.send(set, "_add_", ["hello"]);
-smalltalk.send(set, "_add_", [(21)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(set, "_size", []), "__eq", [(2)])]);
-smalltalk.send(set, "_add_", ["hello"]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(set, "_size", []), "__eq", [(2)])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(set, "_asArray", []), [(21), "hello"]]);
+smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >smalltalk.symbolFor("aa") : smalltalk.send($receiver, "__gt", [smalltalk.symbolFor("aa")]))]);
+smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__gt", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver <smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("bb")).klass === smalltalk.Number) ? $receiver <smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >=smalltalk.symbolFor("aa") : smalltalk.send($receiver, "__gt_eq", [smalltalk.symbolFor("aa")]))]);
+smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__gt_eq", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver <=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt_eq", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("bb")).klass === smalltalk.Number) ? $receiver <=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt_eq", [smalltalk.symbolFor("ba")]))]);
 return self;}
 }),
-smalltalk.SetTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testAt'),
+unescape('_testCopying'),
 smalltalk.method({
-selector: unescape('testAt'),
+selector: unescape('testCopying'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_new", []), "_at_put_", [(1), (2)]);}), (smalltalk.Error || Error)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_copy", []), "__eq_eq", [smalltalk.symbolFor("hello")])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_deepCopy", []), "__eq_eq", [smalltalk.symbolFor("hello")])]);
 return self;}
 }),
-smalltalk.SetTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testAddRemove'),
+unescape('_testEquality'),
 smalltalk.method({
-selector: unescape('testAddRemove'),
+selector: unescape('testEquality'),
 fn: function () {
 var self=this;
-var set=nil;
-(set=smalltalk.send((smalltalk.Set || Set), "_new", []));
-smalltalk.send(self, "_assert_", [smalltalk.send(set, "_isEmpty", [])]);
-smalltalk.send(set, "_add_", [(3)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(set, "_includes_", [(3)])]);
-smalltalk.send(set, "_add_", [(5)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(set, "_includes_", [(5)])]);
-smalltalk.send(set, "_remove_", [(3)]);
-smalltalk.send(self, "_deny_", [smalltalk.send(set, "_includes_", [(3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.symbolFor("hello")])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.symbolFor("world")])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", []), "__eq", [smalltalk.symbolFor("hello")])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", ["hello"])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("hello", "__eq", [smalltalk.symbolFor("hello")])]);
 return self;}
 }),
-smalltalk.SetTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testSize'),
+unescape('_testIdentity'),
 smalltalk.method({
-selector: unescape('testSize'),
+selector: unescape('testIdentity'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_new", []), "_size", []), (0)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_withAll_", [[(1), (2), (3), (4)]]), "_size", []), (4)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_withAll_", [[(1), (1), (1), (1)]]), "_size", []), (1)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.symbolFor("hello")])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.symbolFor("world")])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", []), "__eq", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_asString", []), "_asSymbol", [])])]);
 return self;}
 }),
-smalltalk.SetTest);
-
-
+smalltalk.SymbolTest);
 
-smalltalk.addClass('PackageWithDefaultCommitPathChangedTest', smalltalk.PackageTest, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_setUp'),
+unescape('_testIsSymbolIsString'),
 smalltalk.method({
-selector: unescape('setUp'),
+selector: unescape('testIsSymbolIsString'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_setUp", [], smalltalk.PackageTest);
-(function($rec){smalltalk.send($rec, "_defaultCommitPathJs_", [unescape("javascripts/")]);return smalltalk.send($rec, "_defaultCommitPathSt_", [unescape("smalltalk/")]);})((smalltalk.Package || Package));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "_isSymbol", [])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("hello", "_isSymbol", [])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "_isString", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send("hello", "_isString", [])]);
 return self;}
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testGrulCommitPathJsShouldBeServerGrulJs'),
+unescape('_testSize'),
 smalltalk.method({
-selector: unescape('testGrulCommitPathJsShouldBeServerGrulJs'),
+selector: unescape('testSize'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("server/grul/js"), smalltalk.send(self['@grulPackage'], "_commitPathJs", [])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("a"), "_size", []), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("aaaaa"), "_size", []), (5)]);
 return self;}
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest);
+smalltalk.SymbolTest);
+
 
+
+smalltalk.addClass('UndefinedTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testGrulCommitPathStShouldBeGrulSt'),
+unescape('_testCopying'),
 smalltalk.method({
-selector: unescape('testGrulCommitPathStShouldBeGrulSt'),
+selector: unescape('testCopying'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("grul/st"), smalltalk.send(self['@grulPackage'], "_commitPathSt", [])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(nil, "_copy", []), nil]);
 return self;}
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest);
+smalltalk.UndefinedTest);
 
 smalltalk.addMethod(
-unescape('_testZorkCommitPathJsShouldBeJavascript'),
+unescape('_testDeepCopy'),
 smalltalk.method({
-selector: unescape('testZorkCommitPathJsShouldBeJavascript'),
+selector: unescape('testDeepCopy'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("javascripts/"), smalltalk.send(self['@zorkPackage'], "_commitPathJs", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(nil, "_deepCopy", []), "__eq", [nil])]);
 return self;}
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest);
+smalltalk.UndefinedTest);
 
 smalltalk.addMethod(
-unescape('_testZorkCommitPathStShouldBeSmalltalk'),
+unescape('_testIfNil'),
 smalltalk.method({
-selector: unescape('testZorkCommitPathStShouldBeSmalltalk'),
+selector: unescape('testIfNil'),
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("smalltalk/"), smalltalk.send(self['@zorkPackage'], "_commitPathSt", [])]);
+smalltalk.send(self, "_assert_equals_", [(($receiver = nil) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver, true]);
+smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = nil) != nil && $receiver != undefined) ? (function(){return true;})() : nil, "__eq", [true])]);
+smalltalk.send(self, "_assert_equals_", [(($receiver = nil) == nil || $receiver == undefined) ? (function(){return true;})() : (function(){return false;})(), true]);
+smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = nil) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
 return self;}
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest);
-
+smalltalk.UndefinedTest);
 
 smalltalk.addMethod(
-unescape('_shouldInheritSelectors'),
+unescape('_testIsNil'),
 smalltalk.method({
-selector: unescape('shouldInheritSelectors'),
+selector: unescape('testIsNil'),
 fn: function () {
 var self=this;
-return false;
+smalltalk.send(self, "_assert_", [smalltalk.send(nil, "_isNil", [])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(nil, "_notNil", [])]);
 return self;}
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest.klass);
+smalltalk.UndefinedTest);
+
 
 
diff --git a/amber/src/js/Kernel-Tests.js b/amber/src/js/Kernel-Tests.js
index 1ee5cf12f7f..dc760504174 100644
--- a/amber/src/js/Kernel-Tests.js
+++ b/amber/src/js/Kernel-Tests.js
@@ -34,446 +34,357 @@ smalltalk.ArrayTest);
 
 
 
-smalltalk.addClass('StringTest', smalltalk.TestCase, [], 'Kernel-Tests');
+smalltalk.addClass('BlockClosureTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testJoin'),
+unescape('_testCompiledSource'),
 smalltalk.method({
-selector: unescape('testJoin'),
+selector: unescape('testCompiledSource'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("hello%2Cworld"), smalltalk.send(unescape("%2C"), "_join_", [["hello", "world"]])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((function(){return (1) + (1);}), "_compiledSource", []), "_includesSubString_", ["function"])]);
 return self;},
 args: [],
-source: unescape('testJoin%0A%09self%20assert%3A%20%27hello%2Cworld%27%20equals%3A%20%28%27%2C%27%20join%3A%20%23%28%27hello%27%20%27world%27%29%29'),
-messageSends: ["assert:equals:", "join:"],
+source: unescape('testCompiledSource%0A%09self%20assert%3A%20%28%5B1+1%5D%20compiledSource%20includesSubString%3A%20%27function%27%29'),
+messageSends: ["assert:", "includesSubString:", "compiledSource", unescape("+")],
 referencedClasses: []
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testStreamContents'),
+unescape('_testEnsure'),
 smalltalk.method({
-selector: unescape('testStreamContents'),
+selector: unescape('testEnsure'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", ["hello world", smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(aStream){return (function($rec){smalltalk.send($rec, "_nextPutAll_", ["hello"]);smalltalk.send($rec, "_space", []);return smalltalk.send($rec, "_nextPutAll_", ["world"]);})(aStream);})])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((function(){return smalltalk.send((smalltalk.Error || Error), "_new", []);}), "_ensure_", [(function(){return true;})])]);
 return self;},
 args: [],
-source: unescape('testStreamContents%0A%09self%20%0A%09%09assert%3A%20%27hello%20world%27%20%0A%09%09equals%3A%20%28String%20streamContents%3A%20%5B%3AaStream%7C%20aStream%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27hello%27%3B%20space%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27world%27%5D%29'),
-messageSends: ["assert:equals:", "streamContents:", "nextPutAll:", "space"],
-referencedClasses: ["String"]
+source: unescape('testEnsure%0A%09self%20assert%3A%20%28%5BError%20new%5D%20ensure%3A%20%5Btrue%5D%29'),
+messageSends: ["assert:", "ensure:", "new"],
+referencedClasses: ["Error"]
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testIncludesSubString'),
+unescape('_testNumArgs'),
 smalltalk.method({
-selector: unescape('testIncludesSubString'),
+selector: unescape('testNumArgs'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send("amber", "_includesSubString_", ["ber"])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("amber", "_includesSubString_", ["zork"])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return nil;}), "_numArgs", []), (0)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b){return nil;}), "_numArgs", []), (2)]);
 return self;},
 args: [],
-source: unescape('testIncludesSubString%0A%09self%20assert%3A%20%28%27amber%27%20includesSubString%3A%20%27ber%27%29.%0A%09self%20deny%3A%20%28%27amber%27%20includesSubString%3A%20%27zork%27%29.'),
-messageSends: ["assert:", "includesSubString:", "deny:"],
+source: unescape('testNumArgs%0A%09self%20assert%3A%20%5B%5D%20numArgs%20equals%3A%200.%0A%09self%20assert%3A%20%5B%3Aa%20%3Ab%20%7C%20%5D%20numArgs%20equals%3A%202'),
+messageSends: ["assert:equals:", "numArgs"],
 referencedClasses: []
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testEquality'),
+unescape('_testOnDo'),
 smalltalk.method({
-selector: unescape('testEquality'),
+selector: unescape('testOnDo'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send("hello", "__eq", ["hello"])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("hello", "__eq", ["world"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send("hello", "__eq", [smalltalk.send("hello", "_yourself", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_yourself", []), "__eq", ["hello"])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [(0)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((function(){return smalltalk.send(smalltalk.send((smalltalk.Error || Error), "_new", []), "_signal", []);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return true;})])]);
 return self;},
 args: [],
-source: unescape('testEquality%0A%09self%20assert%3A%20%27hello%27%20%3D%20%27hello%27.%0A%09self%20deny%3A%20%27hello%27%20%3D%20%27world%27.%0A%0A%09self%20assert%3A%20%27hello%27%20%20%3D%20%27hello%27%20yourself.%0A%09self%20assert%3A%20%27hello%27%20yourself%20%3D%20%27hello%27.%0A%0A%09%22test%20JS%20falsy%20value%22%0A%09self%20deny%3A%20%27%27%20%3D%200'),
-messageSends: ["assert:", unescape("%3D"), "deny:", "yourself"],
-referencedClasses: []
+source: unescape('testOnDo%0A%09self%20assert%3A%20%28%5BError%20new%20signal%5D%20on%3A%20Error%20do%3A%20%5B%3Aex%20%7C%20true%5D%29'),
+messageSends: ["assert:", "on:do:", "signal", "new"],
+referencedClasses: ["Error"]
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testCopyWithoutAll'),
+unescape('_testValue'),
 smalltalk.method({
-selector: unescape('testCopyWithoutAll'),
+selector: unescape('testValue'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", ["hello world", smalltalk.send(unescape("*hello*%20*world*"), "_copyWithoutAll_", [unescape("*")])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return (1) + (1);}), "_value", []), (2)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(x){return ((($receiver = x).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]));}), "_value_", [(2)]), (3)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(x, y){return ((($receiver = x).klass === smalltalk.Number) ? $receiver *y : smalltalk.send($receiver, "__star", [y]));}), "_value_value_", [(2), (4)]), (8)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b, c){return (1);}), "_value", []), (1)]);
 return self;},
 args: [],
-source: unescape('testCopyWithoutAll%0A%09self%20%0A%09%09assert%3A%20%27hello%20world%27%20%0A%09%09equals%3A%20%28%27*hello*%20*world*%27%20copyWithoutAll%3A%20%27*%27%29'),
-messageSends: ["assert:equals:", "copyWithoutAll:"],
+source: unescape('testValue%0A%09self%20assert%3A%20%28%5B1+1%5D%20value%29%20equals%3A%202.%0A%09self%20assert%3A%20%28%5B%3Ax%20%7C%20x%20+1%5D%20value%3A%202%29%20equals%3A%203.%0A%09self%20assert%3A%20%28%5B%3Ax%20%3Ay%20%7C%20x*y%5D%20value%3A%202%20value%3A%204%29%20equals%3A%208.%20%0A%0A%09%22Arguments%20are%20optional%20in%20Amber.%20This%20isn%27t%20ANSI%20compliant.%22%0A%0A%09self%20assert%3A%20%28%5B%3Aa%20%3Ab%20%3Ac%20%7C%201%5D%20value%29%20equals%3A%201'),
+messageSends: ["assert:equals:", "value", unescape("+"), "value:", "value:value:", unescape("*")],
 referencedClasses: []
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testAt'),
+unescape('_testValueWithPossibleArguments'),
 smalltalk.method({
-selector: unescape('testAt'),
+selector: unescape('testValueWithPossibleArguments'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_", [(1)]), "__eq", ["h"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_", [(5)]), "__eq", ["o"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_ifAbsent_", [(6), (function(){return nil;})]), "__eq", [nil])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return (1);}), "_valueWithPossibleArguments_", [[(3), (4)]]), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +(4) : smalltalk.send($receiver, "__plus", [(4)]));}), "_valueWithPossibleArguments_", [[(3), (4)]]), (7)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +b : smalltalk.send($receiver, "__plus", [b]));}), "_valueWithPossibleArguments_", [[(3), (4), (5)]]), (7)]);
 return self;},
 args: [],
-source: unescape('testAt%0A%09self%20assert%3A%20%28%27hello%27%20at%3A%201%29%20%3D%20%27h%27.%0A%09self%20assert%3A%20%28%27hello%27%20at%3A%205%29%20%3D%20%27o%27.%0A%09self%20assert%3A%20%28%27hello%27%20at%3A%206%20ifAbsent%3A%20%5Bnil%5D%29%20%3D%20nil'),
-messageSends: ["assert:", unescape("%3D"), "at:", "at:ifAbsent:"],
+source: unescape('testValueWithPossibleArguments%0A%09self%20assert%3A%20%28%5B1%5D%20valueWithPossibleArguments%3A%20%23%283%204%29%29%20equals%3A%201.%0A%09self%20assert%3A%20%28%5B%3Aa%20%7C%20a%20+%204%5D%20valueWithPossibleArguments%3A%20%23%283%204%29%29%20equals%3A%207.%0A%09self%20assert%3A%20%28%5B%3Aa%20%3Ab%20%7C%20a%20+%20b%5D%20valueWithPossibleArguments%3A%20%23%283%204%205%29%29%20equals%3A%207.'),
+messageSends: ["assert:equals:", "valueWithPossibleArguments:", unescape("+")],
 referencedClasses: []
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testAtPut'),
+unescape('_testWhileFalse'),
 smalltalk.method({
-selector: unescape('testAtPut'),
+selector: unescape('testWhileFalse'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_at_put_", [(1), "a"]);}), (smalltalk.Error || Error)]);
+var i=nil;
+(i=(0));
+(function(){while(!(function(){return ((($receiver = i).klass === smalltalk.Number) ? $receiver >(5) : smalltalk.send($receiver, "__gt", [(5)]));})()) {(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
+smalltalk.send(self, "_assert_equals_", [i, (6)]);
+(i=(0));
+(function(){while(!(function(){(i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));return ((($receiver = i).klass === smalltalk.Number) ? $receiver >(5) : smalltalk.send($receiver, "__gt", [(5)]));})()) {}})();
+smalltalk.send(self, "_assert_equals_", [i, (6)]);
 return self;},
 args: [],
-source: unescape('testAtPut%0A%09%22String%20instances%20are%20read-only%22%0A%09self%20should%3A%20%5B%27hello%27%20at%3A%201%20put%3A%20%27a%27%5D%20raise%3A%20Error'),
-messageSends: ["should:raise:", "at:put:"],
-referencedClasses: ["Error"]
+source: unescape('testWhileFalse%0A%09%7C%20i%20%7C%0A%09i%20%3A%3D%200.%0A%09%5Bi%20%3E%205%5D%20whileFalse%3A%20%5Bi%20%3A%3D%20i%20+%201%5D.%0A%09self%20assert%3A%20i%20equals%3A%206.%0A%0A%09i%20%3A%3D%200.%0A%09%5Bi%20%3A%3D%20i%20+%201.%20i%20%3E%205%5D%20whileFalse.%0A%09self%20assert%3A%20i%20equals%3A%206'),
+messageSends: ["whileFalse:", unescape("%3E"), unescape("+"), "assert:equals:", "whileFalse"],
+referencedClasses: []
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
 
 smalltalk.addMethod(
-unescape('_testSize'),
+unescape('_testWhileTrue'),
 smalltalk.method({
-selector: unescape('testSize'),
+selector: unescape('testWhileTrue'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send("smalltalk", "_size", []), (9)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send("", "_size", []), (0)]);
+var i=nil;
+(i=(0));
+(function(){while((function(){return ((($receiver = i).klass === smalltalk.Number) ? $receiver <(5) : smalltalk.send($receiver, "__lt", [(5)]));})()) {(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
+smalltalk.send(self, "_assert_equals_", [i, (5)]);
+(i=(0));
+(function(){while((function(){(i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));return ((($receiver = i).klass === smalltalk.Number) ? $receiver <(5) : smalltalk.send($receiver, "__lt", [(5)]));})()) {}})();
+smalltalk.send(self, "_assert_equals_", [i, (5)]);
 return self;},
 args: [],
-source: unescape('testSize%0A%09self%20assert%3A%20%27smalltalk%27%20size%20equals%3A%209.%0A%09self%20assert%3A%20%27%27%20size%20equals%3A%200'),
-messageSends: ["assert:equals:", "size"],
+source: unescape('testWhileTrue%0A%09%7C%20i%20%7C%0A%09i%20%3A%3D%200.%0A%09%5Bi%20%3C%205%5D%20whileTrue%3A%20%5Bi%20%3A%3D%20i%20+%201%5D.%0A%09self%20assert%3A%20i%20equals%3A%205.%0A%0A%09i%20%3A%3D%200.%0A%09%5Bi%20%3A%3D%20i%20+%201.%20i%20%3C%205%5D%20whileTrue.%0A%09self%20assert%3A%20i%20equals%3A%205'),
+messageSends: ["whileTrue:", unescape("%3C"), unescape("+"), "assert:equals:", "whileTrue"],
 referencedClasses: []
 }),
-smalltalk.StringTest);
+smalltalk.BlockClosureTest);
+
+
 
+smalltalk.addClass('BooleanTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testAddRemove'),
+unescape('_testEquality'),
 smalltalk.method({
-selector: unescape('testAddRemove'),
+selector: unescape('testEquality'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_add_", ["a"]);}), (smalltalk.Error || Error)]);
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_remove_", ["h"]);}), (smalltalk.Error || Error)]);
+smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [false])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [(0)])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [false])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [""])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(true, "__eq", [true])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [true])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(true, "__eq", [false])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(false, "__eq", [false])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(true, "_yourself", []), "__eq", [true])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(true, "_yourself", []), "__eq", [smalltalk.send(true, "_yourself", [])])]);
 return self;},
 args: [],
-source: unescape('testAddRemove%0A%09self%20should%3A%20%5B%27hello%27%20add%3A%20%27a%27%5D%20raise%3A%20Error.%0A%09self%20should%3A%20%5B%27hello%27%20remove%3A%20%27h%27%5D%20raise%3A%20Error'),
-messageSends: ["should:raise:", "add:", "remove:"],
-referencedClasses: ["Error"]
+source: unescape('testEquality%0A%09%22We%27re%20on%20top%20of%20JS...just%20be%20sure%20to%20check%20the%20basics%21%22%0A%0A%09self%20deny%3A%200%20%3D%20false.%20%0A%09self%20deny%3A%20false%20%3D%200.%0A%09self%20deny%3A%20%27%27%20%3D%20false.%0A%09self%20deny%3A%20false%20%3D%20%27%27.%0A%0A%09self%20assert%3A%20true%20%3D%20true.%0A%09self%20deny%3A%20false%20%3D%20true.%0A%09self%20deny%3A%20true%20%3D%20false.%0A%09self%20assert%3A%20false%20%3D%20false.%0A%0A%09%22JS%20may%20do%20some%20type%20coercing%20after%20sending%20a%20message%22%0A%09self%20assert%3A%20true%20yourself%20%3D%20true.%0A%09self%20assert%3A%20true%20yourself%20%3D%20true%20yourself'),
+messageSends: ["deny:", unescape("%3D"), "assert:", "yourself"],
+referencedClasses: []
 }),
-smalltalk.StringTest);
+smalltalk.BooleanTest);
 
 smalltalk.addMethod(
-unescape('_testAsArray'),
+unescape('_testIfTrueIfFalse'),
 smalltalk.method({
-selector: unescape('testAsArray'),
+selector: unescape('testIfTrueIfFalse'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_asArray", []), "__eq", [["h", "e", "l", "l", "o"]])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return "alternative block";})])), "__eq", ["alternative block"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return "alternative block";})])), "__eq", [nil])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return "alternative block";})])), "__eq", [nil])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return "alternative block";})])), "__eq", ["alternative block"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block2"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block2"])]);
 return self;},
 args: [],
-source: unescape('testAsArray%0A%09self%20assert%3A%20%27hello%27%20asArray%20%3D%20%23%28%27h%27%20%27e%27%20%27l%27%20%27l%27%20%27o%27%29.'),
-messageSends: ["assert:", unescape("%3D"), "asArray"],
+source: unescape('testIfTrueIfFalse%0A%20%0A%09self%20assert%3A%20%28true%20ifTrue%3A%20%5B%27alternative%20block%27%5D%29%20%3D%20%27alternative%20block%27.%0A%09self%20assert%3A%20%28true%20ifFalse%3A%20%5B%27alternative%20block%27%5D%29%20%3D%20nil.%0A%0A%09self%20assert%3A%20%28false%20ifTrue%3A%20%5B%27alternative%20block%27%5D%29%20%3D%20nil.%0A%09self%20assert%3A%20%28false%20ifFalse%3A%20%5B%27alternative%20block%27%5D%29%20%3D%20%27alternative%20block%27.%0A%0A%09self%20assert%3A%20%28false%20ifTrue%3A%20%5B%27alternative%20block%27%5D%20ifFalse%3A%20%5B%27alternative%20block2%27%5D%29%20%3D%20%27alternative%20block2%27.%0A%09self%20assert%3A%20%28false%20ifFalse%3A%20%5B%27alternative%20block%27%5D%20ifTrue%3A%20%5B%27alternative%20block2%27%5D%29%20%3D%20%27alternative%20block%27.%0A%0A%09self%20assert%3A%20%28true%20ifTrue%3A%20%5B%27alternative%20block%27%5D%20ifFalse%3A%20%5B%27alternative%20block2%27%5D%29%20%3D%20%27alternative%20block%27.%0A%09self%20assert%3A%20%28true%20ifFalse%3A%20%5B%27alternative%20block%27%5D%20ifTrue%3A%20%5B%27alternative%20block2%27%5D%29%20%3D%20%27alternative%20block2%27.'),
+messageSends: ["assert:", unescape("%3D"), "ifTrue:", "ifFalse:", "ifTrue:ifFalse:", "ifFalse:ifTrue:"],
 referencedClasses: []
 }),
-smalltalk.StringTest);
-
-
+smalltalk.BooleanTest);
 
-smalltalk.addClass('DictionaryTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testPrintString'),
+unescape('_testLogic'),
 smalltalk.method({
-selector: unescape('testPrintString'),
+selector: unescape('testLogic'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("a%20Dictionary%28%27firstname%27%20-%3E%20%27James%27%20%2C%20%27lastname%27%20-%3E%20%27Bond%27%29"), (function($rec){smalltalk.send($rec, "_at_put_", ["firstname", "James"]);smalltalk.send($rec, "_at_put_", ["lastname", "Bond"]);return smalltalk.send($rec, "_printString", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []))]);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_&", [true])]);smalltalk.send($rec, "_deny_", [smalltalk.send(true, "_&", [false])]);smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_&", [true])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_&", [false])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_|", [true])]);smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_|", [false])]);smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_|", [true])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_|", [false])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_&", [(1) > (0)])]);smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_&", [false])]);return smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_&", [(1) > (2)])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_|", [(1) > (0)])]);smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_|", [false])]);return smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_|", [(1) > (2)])]);})(self);
 return self;},
 args: [],
-source: unescape('testPrintString%0A%09self%0A%09%09assert%3A%20%27a%20Dictionary%28%27%27firstname%27%27%20-%3E%20%27%27James%27%27%20%2C%20%27%27lastname%27%27%20-%3E%20%27%27Bond%27%27%29%27%20%0A%09%09equals%3A%20%28Dictionary%20new%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09at%3A%27firstname%27%20put%3A%20%27James%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09at%3A%27lastname%27%20put%3A%20%27Bond%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09printString%29'),
-messageSends: ["assert:equals:", "at:put:", "printString", "new"],
-referencedClasses: ["Dictionary"]
+source: unescape('testLogic%0A%20%0A%09%22Trivial%20logic%20table%22%0A%09self%20assert%3A%20%28true%20%26%20true%29%3B%20deny%3A%20%28true%20%26%20false%29%3B%20deny%3A%20%28false%20%26%20true%29%3B%20deny%3A%20%28false%20%26%20false%29.%0A%09self%20assert%3A%20%28true%20%7C%20true%29%3B%20assert%3A%20%28true%20%7C%20false%29%3B%20assert%3A%20%28false%20%7C%20true%29%3B%20deny%3A%20%28false%20%7C%20false%29.%0A%20%20%20%20%20%20%20%20%22Checking%20that%20expressions%20work%20fine%20too%22%0A%09self%20assert%3A%20%28true%20%26%20%281%20%3E%200%29%29%3B%20deny%3A%20%28%281%20%3E%200%29%20%26%20false%29%3B%20deny%3A%20%28%281%20%3E%200%29%20%26%20%281%20%3E%202%29%29.%0A%20%20%20%20%20%20%20%20self%20assert%3A%20%28false%20%7C%20%281%20%3E%200%29%29%3B%20assert%3A%20%28%281%20%3E%200%29%20%7C%20false%29%3B%20assert%3A%20%28%281%20%3E%200%29%20%7C%20%281%20%3E%202%29%29'),
+messageSends: ["assert:", unescape("%26"), "deny:", unescape("%7C"), unescape("%3E")],
+referencedClasses: []
 }),
-smalltalk.DictionaryTest);
+smalltalk.BooleanTest);
 
 smalltalk.addMethod(
-unescape('_testEquality'),
+unescape('_testLogicKeywords'),
 smalltalk.method({
-selector: unescape('testEquality'),
+selector: unescape('testLogicKeywords'),
 category: 'tests',
 fn: function () {
 var self=this;
-var d1=nil;
-var d2=nil;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []), "__eq", [smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])])]);
-(d1=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
-(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
-smalltalk.send(self, "_assert_", [smalltalk.send(d1, "__eq", [d2])]);
-(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (3)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
-smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
-(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(2), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
-smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
-(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);smalltalk.send($rec, "_at_put_", [(3), (4)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
-smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_and_", [(function(){return true;})])]);smalltalk.send($rec, "_deny_", [smalltalk.send(true, "_and_", [(function(){return false;})])]);smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_and_", [(function(){return true;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_and_", [(function(){return false;})])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_or_", [(function(){return true;})])]);smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_or_", [(function(){return false;})])]);smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_or_", [(function(){return true;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_or_", [(function(){return false;})])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_and_", [(function(){return (1) > (0);})])]);smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_and_", [(function(){return false;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_and_", [(function(){return (1) > (2);})])]);})(self);
+(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_or_", [(function(){return (1) > (0);})])]);smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_or_", [(function(){return false;})])]);return smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_or_", [(function(){return (1) > (2);})])]);})(self);
 return self;},
 args: [],
-source: unescape('testEquality%0A%09%7C%20d1%20d2%20%7C%0A%0A%09self%20assert%3A%20Dictionary%20new%20%3D%20Dictionary%20new.%0A%09%09%0A%09d1%20%3A%3D%20Dictionary%20new%20at%3A%201%20put%3A%202%3B%20yourself.%0A%09d2%20%3A%3D%20Dictionary%20new%20at%3A%201%20put%3A%202%3B%20yourself.%0A%09self%20assert%3A%20d1%20%3D%20d2.%0A%0A%09d2%20%3A%3D%20Dictionary%20new%20at%3A%201%20put%3A%203%3B%20yourself.%0A%09self%20deny%3A%20d1%20%3D%20d2.%0A%0A%09d2%20%3A%3D%20Dictionary%20new%20at%3A%202%20put%3A%202%3B%20yourself.%0A%09self%20deny%3A%20d1%20%3D%20d2.%0A%0A%09d2%20%3A%3D%20Dictionary%20new%20at%3A%201%20put%3A%202%3B%20at%3A%203%20put%3A%204%3B%20yourself.%0A%09self%20deny%3A%20d1%20%3D%20d2.'),
-messageSends: ["assert:", unescape("%3D"), "new", "at:put:", "yourself", "deny:"],
-referencedClasses: ["Dictionary"]
+source: unescape('testLogicKeywords%0A%20%0A%09%22Trivial%20logic%20table%22%0A%09self%20%0A%09%09assert%3A%20%28true%20and%3A%20%5B%20true%5D%29%3B%20%0A%09%09deny%3A%20%28true%20and%3A%20%5B%20false%20%5D%29%3B%20%0A%09%09deny%3A%20%28false%20and%3A%20%5B%20true%20%5D%29%3B%20%0A%09%09deny%3A%20%28false%20and%3A%20%5B%20false%20%5D%29.%0A%09self%20%0A%09%09assert%3A%20%28true%20or%3A%20%5B%20true%20%5D%29%3B%20%0A%09%09assert%3A%20%28true%20or%3A%20%5B%20false%20%5D%29%3B%20%0A%09%09assert%3A%20%28false%20or%3A%20%5B%20true%20%5D%29%3B%20%0A%09%09deny%3A%20%28false%20or%3A%20%5B%20false%20%5D%29.%0A%20%20%20%20%20%20%20%20%0A%09%22Checking%20that%20expressions%20work%20fine%20too%22%0A%09self%20%0A%09%09assert%3A%20%28true%20and%3A%20%5B%201%20%3E%200%20%5D%29%3B%20%0A%09%09deny%3A%20%28%281%20%3E%200%29%20and%3A%20%5B%20false%20%5D%29%3B%20%0A%09%09deny%3A%20%28%281%20%3E%200%29%20and%3A%20%5B%201%20%3E%202%20%5D%29.%0A%20%20%20%20%20%20%20%20self%20%0A%09%09assert%3A%20%28false%20or%3A%20%5B%201%20%3E%200%20%5D%29%3B%20%0A%09%09assert%3A%20%28%281%20%3E%200%29%20or%3A%20%5B%20false%20%5D%29%3B%20%0A%09%09assert%3A%20%28%281%20%3E%200%29%20or%3A%20%5B%201%20%3E%202%20%5D%29'),
+messageSends: ["assert:", "and:", "deny:", "or:", unescape("%3E")],
+referencedClasses: []
 }),
-smalltalk.DictionaryTest);
+smalltalk.BooleanTest);
 
+
+
+smalltalk.addClass('ClassBuilderTest', smalltalk.TestCase, ['builder', 'theClass'], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testDynamicDictionaries'),
+unescape('_setUp'),
 smalltalk.method({
-selector: unescape('testDynamicDictionaries'),
-category: 'tests',
+selector: unescape('setUp'),
+category: 'running',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.HashedCollection._fromPairs_([smalltalk.send("hello", "__minus_gt", [(1)])]), "_asDictionary", []), "__eq", [smalltalk.send((smalltalk.Dictionary || Dictionary), "_with_", [smalltalk.send("hello", "__minus_gt", [(1)])])])]);
+(self['@builder']=smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []));
 return self;},
 args: [],
-source: unescape('testDynamicDictionaries%0A%09self%20assert%3A%20%23%7B%27hello%27%20-%3E%201%7D%20asDictionary%20%3D%20%28Dictionary%20with%3A%20%27hello%27%20-%3E%201%29'),
-messageSends: ["assert:", unescape("%3D"), "asDictionary", unescape("-%3E"), "with:"],
-referencedClasses: ["Dictionary"]
+source: unescape('setUp%0A%09builder%20%3A%3D%20ClassBuilder%20new'),
+messageSends: ["new"],
+referencedClasses: ["ClassBuilder"]
 }),
-smalltalk.DictionaryTest);
+smalltalk.ClassBuilderTest);
 
 smalltalk.addMethod(
-unescape('_testAccessing'),
+unescape('_tearDown'),
 smalltalk.method({
-selector: unescape('testAccessing'),
-category: 'tests',
+selector: unescape('tearDown'),
+category: 'running',
 fn: function () {
 var self=this;
-var d=nil;
-(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
-smalltalk.send(d, "_at_put_", ["hello", "world"]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_at_", ["hello"]), "__eq", ["world"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_at_ifAbsent_", ["hello", (function(){return nil;})]), "__eq", ["world"])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send(d, "_at_ifAbsent_", ["foo", (function(){return nil;})]), "__eq", ["world"])]);
-smalltalk.send(d, "_at_put_", [(1), (2)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_at_", [(1)]), "__eq", [(2)])]);
-smalltalk.send(d, "_at_put_", [smalltalk.send((1), "__at", [(3)]), (3)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_at_", [smalltalk.send((1), "__at", [(3)])]), "__eq", [(3)])]);
+(($receiver = self['@theClass']) != nil && $receiver != undefined) ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removeClass_", [self['@theClass']]);return (self['@theClass']=nil);})() : nil;
 return self;},
 args: [],
-source: unescape('testAccessing%0A%09%7C%20d%20%7C%0A%0A%09d%20%3A%3D%20Dictionary%20new.%0A%0A%09d%20at%3A%20%27hello%27%20put%3A%20%27world%27.%0A%09self%20assert%3A%20%28d%20at%3A%20%27hello%27%29%20%3D%20%27world%27.%0A%09self%20assert%3A%20%28d%20at%3A%20%27hello%27%20ifAbsent%3A%20%5Bnil%5D%29%20%3D%20%27world%27.%0A%09self%20deny%3A%20%28d%20at%3A%20%27foo%27%20ifAbsent%3A%20%5Bnil%5D%29%20%3D%20%27world%27.%0A%0A%09d%20at%3A%201%20put%3A%202.%0A%09self%20assert%3A%20%28d%20at%3A%201%29%20%3D%202.%0A%0A%09d%20at%3A%201@3%20put%3A%203.%0A%09self%20assert%3A%20%28d%20at%3A%201@3%29%20%3D%203'),
-messageSends: ["new", "at:put:", "assert:", unescape("%3D"), "at:", "at:ifAbsent:", "deny:", unescape("@")],
-referencedClasses: ["Dictionary"]
+source: unescape('tearDown%0A%09theClass%20ifNotNil%3A%20%5BSmalltalk%20current%20removeClass%3A%20theClass.%20theClass%20%3A%3D%20nil%5D'),
+messageSends: ["ifNotNil:", "removeClass:", "current"],
+referencedClasses: ["Smalltalk"]
 }),
-smalltalk.DictionaryTest);
+smalltalk.ClassBuilderTest);
 
 smalltalk.addMethod(
-unescape('_testSize'),
+unescape('_testClassCopy'),
 smalltalk.method({
-selector: unescape('testSize'),
-category: 'tests',
+selector: unescape('testClassCopy'),
+category: 'running',
 fn: function () {
 var self=this;
-var d=nil;
-(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(0)])]);
-smalltalk.send(d, "_at_put_", [(1), (2)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(1)])]);
-smalltalk.send(d, "_at_put_", [(2), (3)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(2)])]);
+(self['@theClass']=smalltalk.send(self['@builder'], "_copyClass_named_", [(smalltalk.ObjectMock || ObjectMock), "ObjectMock2"]));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_superclass", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_superclass", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_instanceVariableNames", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_instanceVariableNames", [])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(self['@theClass'], "_name", []), "ObjectMock2"]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_package", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_package", [])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self['@theClass'], "_methodDictionary", []), "_keys", []), smalltalk.send(smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_methodDictionary", []), "_keys", [])]);
 return self;},
 args: [],
-source: unescape('testSize%0A%09%7C%20d%20%7C%0A%0A%09d%20%3A%3D%20Dictionary%20new.%0A%09self%20assert%3A%20d%20size%20%3D%200.%0A%0A%09d%20at%3A%201%20put%3A%202.%0A%09self%20assert%3A%20d%20size%20%3D%201.%0A%0A%09d%20at%3A%202%20put%3A%203.%0A%09self%20assert%3A%20d%20size%20%3D%202.'),
-messageSends: ["new", "assert:", unescape("%3D"), "size", "at:put:"],
-referencedClasses: ["Dictionary"]
+source: unescape('testClassCopy%0A%09theClass%20%3A%3D%20builder%20copyClass%3A%20ObjectMock%20named%3A%20%27ObjectMock2%27.%0A%09self%20assert%3A%20theClass%20superclass%20%3D%3D%20ObjectMock%20superclass.%0A%09self%20assert%3A%20theClass%20instanceVariableNames%20%3D%3D%20ObjectMock%20instanceVariableNames.%0A%09self%20assert%3A%20theClass%20name%20equals%3A%20%27ObjectMock2%27.%0A%09self%20assert%3A%20theClass%20package%20%3D%3D%20ObjectMock%20package.%0A%09self%20assert%3A%20theClass%20methodDictionary%20keys%20equals%3A%20ObjectMock%20methodDictionary%20keys'),
+messageSends: ["copyClass:named:", "assert:", unescape("%3D%3D"), "superclass", "instanceVariableNames", "assert:equals:", "name", "package", "keys", "methodDictionary"],
+referencedClasses: ["ObjectMock"]
 }),
-smalltalk.DictionaryTest);
+smalltalk.ClassBuilderTest);
 
 smalltalk.addMethod(
-unescape('_testValues'),
+unescape('_testInstanceVariableNames'),
 smalltalk.method({
-selector: unescape('testValues'),
-category: 'tests',
+selector: unescape('testInstanceVariableNames'),
+category: 'running',
 fn: function () {
 var self=this;
-var d=nil;
-(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
-smalltalk.send(d, "_at_put_", [(1), (2)]);
-smalltalk.send(d, "_at_put_", [(2), (3)]);
-smalltalk.send(d, "_at_put_", [(3), (4)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_values", []), "__eq", [[(2), (3), (4)]])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(self['@builder'], "_instanceVariableNamesFor_", ["  hello   world   "]), ["hello", "world"]]);
 return self;},
 args: [],
-source: unescape('testValues%0A%09%7C%20d%20%7C%0A%0A%09d%20%3A%3D%20Dictionary%20new.%0A%09d%20at%3A%201%20put%3A%202.%0A%09d%20at%3A%202%20put%3A%203.%0A%09d%20at%3A%203%20put%3A%204.%0A%0A%09self%20assert%3A%20d%20values%20%3D%20%23%282%203%204%29'),
-messageSends: ["new", "at:put:", "assert:", unescape("%3D"), "values"],
-referencedClasses: ["Dictionary"]
+source: unescape('testInstanceVariableNames%0A%09self%20assert%3A%20%28builder%20instanceVariableNamesFor%3A%20%27%20%20hello%20%20%20world%20%20%20%27%29%20equals%3A%20%23%28%27hello%27%20%27world%27%29'),
+messageSends: ["assert:equals:", "instanceVariableNamesFor:"],
+referencedClasses: []
 }),
-smalltalk.DictionaryTest);
+smalltalk.ClassBuilderTest);
+
 
+
+smalltalk.addClass('DictionaryTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testKeys'),
+unescape('_testAccessing'),
 smalltalk.method({
-selector: unescape('testKeys'),
+selector: unescape('testAccessing'),
 category: 'tests',
 fn: function () {
 var self=this;
 var d=nil;
 (d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(d, "_at_put_", ["hello", "world"]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_at_", ["hello"]), "__eq", ["world"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_at_ifAbsent_", ["hello", (function(){return nil;})]), "__eq", ["world"])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send(d, "_at_ifAbsent_", ["foo", (function(){return nil;})]), "__eq", ["world"])]);
 smalltalk.send(d, "_at_put_", [(1), (2)]);
-smalltalk.send(d, "_at_put_", [(2), (3)]);
-smalltalk.send(d, "_at_put_", [(3), (4)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_keys", []), "__eq", [[(1), (2), (3)]])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_at_", [(1)]), "__eq", [(2)])]);
+smalltalk.send(d, "_at_put_", [smalltalk.send((1), "__at", [(3)]), (3)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_at_", [smalltalk.send((1), "__at", [(3)])]), "__eq", [(3)])]);
 return self;},
 args: [],
-source: unescape('testKeys%0A%09%7C%20d%20%7C%0A%0A%09d%20%3A%3D%20Dictionary%20new.%0A%09d%20at%3A%201%20put%3A%202.%0A%09d%20at%3A%202%20put%3A%203.%0A%09d%20at%3A%203%20put%3A%204.%0A%0A%09self%20assert%3A%20d%20keys%20%3D%20%23%281%202%203%29'),
-messageSends: ["new", "at:put:", "assert:", unescape("%3D"), "keys"],
+source: unescape('testAccessing%0A%09%7C%20d%20%7C%0A%0A%09d%20%3A%3D%20Dictionary%20new.%0A%0A%09d%20at%3A%20%27hello%27%20put%3A%20%27world%27.%0A%09self%20assert%3A%20%28d%20at%3A%20%27hello%27%29%20%3D%20%27world%27.%0A%09self%20assert%3A%20%28d%20at%3A%20%27hello%27%20ifAbsent%3A%20%5Bnil%5D%29%20%3D%20%27world%27.%0A%09self%20deny%3A%20%28d%20at%3A%20%27foo%27%20ifAbsent%3A%20%5Bnil%5D%29%20%3D%20%27world%27.%0A%0A%09d%20at%3A%201%20put%3A%202.%0A%09self%20assert%3A%20%28d%20at%3A%201%29%20%3D%202.%0A%0A%09d%20at%3A%201@3%20put%3A%203.%0A%09self%20assert%3A%20%28d%20at%3A%201@3%29%20%3D%203'),
+messageSends: ["new", "at:put:", "assert:", unescape("%3D"), "at:", "at:ifAbsent:", "deny:", unescape("@")],
 referencedClasses: ["Dictionary"]
 }),
 smalltalk.DictionaryTest);
 
-
-
-smalltalk.addClass('BooleanTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testLogic'),
-smalltalk.method({
-selector: unescape('testLogic'),
-category: 'tests',
-fn: function () {
-var self=this;
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_&", [true])]);smalltalk.send($rec, "_deny_", [smalltalk.send(true, "_&", [false])]);smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_&", [true])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_&", [false])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_|", [true])]);smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_|", [false])]);smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_|", [true])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_|", [false])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_&", [(1) > (0)])]);smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_&", [false])]);return smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_&", [(1) > (2)])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_|", [(1) > (0)])]);smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_|", [false])]);return smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_|", [(1) > (2)])]);})(self);
-return self;},
-args: [],
-source: unescape('testLogic%0A%20%0A%09%22Trivial%20logic%20table%22%0A%09self%20assert%3A%20%28true%20%26%20true%29%3B%20deny%3A%20%28true%20%26%20false%29%3B%20deny%3A%20%28false%20%26%20true%29%3B%20deny%3A%20%28false%20%26%20false%29.%0A%09self%20assert%3A%20%28true%20%7C%20true%29%3B%20assert%3A%20%28true%20%7C%20false%29%3B%20assert%3A%20%28false%20%7C%20true%29%3B%20deny%3A%20%28false%20%7C%20false%29.%0A%20%20%20%20%20%20%20%20%22Checking%20that%20expressions%20work%20fine%20too%22%0A%09self%20assert%3A%20%28true%20%26%20%281%20%3E%200%29%29%3B%20deny%3A%20%28%281%20%3E%200%29%20%26%20false%29%3B%20deny%3A%20%28%281%20%3E%200%29%20%26%20%281%20%3E%202%29%29.%0A%20%20%20%20%20%20%20%20self%20assert%3A%20%28false%20%7C%20%281%20%3E%200%29%29%3B%20assert%3A%20%28%281%20%3E%200%29%20%7C%20false%29%3B%20assert%3A%20%28%281%20%3E%200%29%20%7C%20%281%20%3E%202%29%29'),
-messageSends: ["assert:", unescape("%26"), "deny:", unescape("%7C"), unescape("%3E")],
-referencedClasses: []
-}),
-smalltalk.BooleanTest);
-
-smalltalk.addMethod(
-unescape('_testEquality'),
-smalltalk.method({
-selector: unescape('testEquality'),
-category: 'tests',
-fn: function () {
-var self=this;
-smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [false])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [(0)])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [false])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [""])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(true, "__eq", [true])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [true])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(true, "__eq", [false])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(false, "__eq", [false])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(true, "_yourself", []), "__eq", [true])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(true, "_yourself", []), "__eq", [smalltalk.send(true, "_yourself", [])])]);
-return self;},
-args: [],
-source: unescape('testEquality%0A%09%22We%27re%20on%20top%20of%20JS...just%20be%20sure%20to%20check%20the%20basics%21%22%0A%0A%09self%20deny%3A%200%20%3D%20false.%20%0A%09self%20deny%3A%20false%20%3D%200.%0A%09self%20deny%3A%20%27%27%20%3D%20false.%0A%09self%20deny%3A%20false%20%3D%20%27%27.%0A%0A%09self%20assert%3A%20true%20%3D%20true.%0A%09self%20deny%3A%20false%20%3D%20true.%0A%09self%20deny%3A%20true%20%3D%20false.%0A%09self%20assert%3A%20false%20%3D%20false.%0A%0A%09%22JS%20may%20do%20some%20type%20coercing%20after%20sending%20a%20message%22%0A%09self%20assert%3A%20true%20yourself%20%3D%20true.%0A%09self%20assert%3A%20true%20yourself%20%3D%20true%20yourself'),
-messageSends: ["deny:", unescape("%3D"), "assert:", "yourself"],
-referencedClasses: []
-}),
-smalltalk.BooleanTest);
-
-smalltalk.addMethod(
-unescape('_testLogicKeywords'),
-smalltalk.method({
-selector: unescape('testLogicKeywords'),
-category: 'tests',
-fn: function () {
-var self=this;
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_and_", [(function(){return true;})])]);smalltalk.send($rec, "_deny_", [smalltalk.send(true, "_and_", [(function(){return false;})])]);smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_and_", [(function(){return true;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_and_", [(function(){return false;})])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_or_", [(function(){return true;})])]);smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_or_", [(function(){return false;})])]);smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_or_", [(function(){return true;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send(false, "_or_", [(function(){return false;})])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(true, "_and_", [(function(){return (1) > (0);})])]);smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_and_", [(function(){return false;})])]);return smalltalk.send($rec, "_deny_", [smalltalk.send((1) > (0), "_and_", [(function(){return (1) > (2);})])]);})(self);
-(function($rec){smalltalk.send($rec, "_assert_", [smalltalk.send(false, "_or_", [(function(){return (1) > (0);})])]);smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_or_", [(function(){return false;})])]);return smalltalk.send($rec, "_assert_", [smalltalk.send((1) > (0), "_or_", [(function(){return (1) > (2);})])]);})(self);
-return self;},
-args: [],
-source: unescape('testLogicKeywords%0A%20%0A%09%22Trivial%20logic%20table%22%0A%09self%20%0A%09%09assert%3A%20%28true%20and%3A%20%5B%20true%5D%29%3B%20%0A%09%09deny%3A%20%28true%20and%3A%20%5B%20false%20%5D%29%3B%20%0A%09%09deny%3A%20%28false%20and%3A%20%5B%20true%20%5D%29%3B%20%0A%09%09deny%3A%20%28false%20and%3A%20%5B%20false%20%5D%29.%0A%09self%20%0A%09%09assert%3A%20%28true%20or%3A%20%5B%20true%20%5D%29%3B%20%0A%09%09assert%3A%20%28true%20or%3A%20%5B%20false%20%5D%29%3B%20%0A%09%09assert%3A%20%28false%20or%3A%20%5B%20true%20%5D%29%3B%20%0A%09%09deny%3A%20%28false%20or%3A%20%5B%20false%20%5D%29.%0A%20%20%20%20%20%20%20%20%0A%09%22Checking%20that%20expressions%20work%20fine%20too%22%0A%09self%20%0A%09%09assert%3A%20%28true%20and%3A%20%5B%201%20%3E%200%20%5D%29%3B%20%0A%09%09deny%3A%20%28%281%20%3E%200%29%20and%3A%20%5B%20false%20%5D%29%3B%20%0A%09%09deny%3A%20%28%281%20%3E%200%29%20and%3A%20%5B%201%20%3E%202%20%5D%29.%0A%20%20%20%20%20%20%20%20self%20%0A%09%09assert%3A%20%28false%20or%3A%20%5B%201%20%3E%200%20%5D%29%3B%20%0A%09%09assert%3A%20%28%281%20%3E%200%29%20or%3A%20%5B%20false%20%5D%29%3B%20%0A%09%09assert%3A%20%28%281%20%3E%200%29%20or%3A%20%5B%201%20%3E%202%20%5D%29'),
-messageSends: ["assert:", "and:", "deny:", "or:", unescape("%3E")],
-referencedClasses: []
-}),
-smalltalk.BooleanTest);
-
-smalltalk.addMethod(
-unescape('_testIfTrueIfFalse'),
-smalltalk.method({
-selector: unescape('testIfTrueIfFalse'),
-category: 'tests',
-fn: function () {
-var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return "alternative block";})])), "__eq", ["alternative block"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return "alternative block";})])), "__eq", [nil])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return "alternative block";})])), "__eq", [nil])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return "alternative block";})])), "__eq", ["alternative block"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block2"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = false).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = true).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return "alternative block";})() : (function(){return "alternative block2";})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return "alternative block";}), (function(){return "alternative block2";})])), "__eq", ["alternative block2"])]);
-return self;},
-args: [],
-source: unescape('testIfTrueIfFalse%0A%20%0A%09self%20assert%3A%20%28true%20ifTrue%3A%20%5B%27alternative%20block%27%5D%29%20%3D%20%27alternative%20block%27.%0A%09self%20assert%3A%20%28true%20ifFalse%3A%20%5B%27alternative%20block%27%5D%29%20%3D%20nil.%0A%0A%09self%20assert%3A%20%28false%20ifTrue%3A%20%5B%27alternative%20block%27%5D%29%20%3D%20nil.%0A%09self%20assert%3A%20%28false%20ifFalse%3A%20%5B%27alternative%20block%27%5D%29%20%3D%20%27alternative%20block%27.%0A%0A%09self%20assert%3A%20%28false%20ifTrue%3A%20%5B%27alternative%20block%27%5D%20ifFalse%3A%20%5B%27alternative%20block2%27%5D%29%20%3D%20%27alternative%20block2%27.%0A%09self%20assert%3A%20%28false%20ifFalse%3A%20%5B%27alternative%20block%27%5D%20ifTrue%3A%20%5B%27alternative%20block2%27%5D%29%20%3D%20%27alternative%20block%27.%0A%0A%09self%20assert%3A%20%28true%20ifTrue%3A%20%5B%27alternative%20block%27%5D%20ifFalse%3A%20%5B%27alternative%20block2%27%5D%29%20%3D%20%27alternative%20block%27.%0A%09self%20assert%3A%20%28true%20ifFalse%3A%20%5B%27alternative%20block%27%5D%20ifTrue%3A%20%5B%27alternative%20block2%27%5D%29%20%3D%20%27alternative%20block2%27.'),
-messageSends: ["assert:", unescape("%3D"), "ifTrue:", "ifFalse:", "ifTrue:ifFalse:", "ifFalse:ifTrue:"],
-referencedClasses: []
-}),
-smalltalk.BooleanTest);
-
-
-
-smalltalk.addClass('NumberTest', smalltalk.TestCase, [], 'Kernel-Tests');
-smalltalk.addMethod(
-unescape('_testPrintShowingDecimalPlaces'),
+unescape('_testDynamicDictionaries'),
 smalltalk.method({
-selector: unescape('testPrintShowingDecimalPlaces'),
+selector: unescape('testDynamicDictionaries'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", ["23.00", smalltalk.send((23), "_printShowingDecimalPlaces_", [(2)])]);
-smalltalk.send(self, "_assert_equals_", ["23.57", smalltalk.send((23.5698), "_printShowingDecimalPlaces_", [(2)])]);
-smalltalk.send(self, "_assert_equals_", [unescape("-234.56700"), smalltalk.send(smalltalk.send((234.567), "_negated", []), "_printShowingDecimalPlaces_", [(5)])]);
-smalltalk.send(self, "_assert_equals_", ["23", smalltalk.send((23.4567), "_printShowingDecimalPlaces_", [(0)])]);
-smalltalk.send(self, "_assert_equals_", ["24", smalltalk.send((23.5567), "_printShowingDecimalPlaces_", [(0)])]);
-smalltalk.send(self, "_assert_equals_", [unescape("-23"), smalltalk.send(smalltalk.send((23.4567), "_negated", []), "_printShowingDecimalPlaces_", [(0)])]);
-smalltalk.send(self, "_assert_equals_", [unescape("-24"), smalltalk.send(smalltalk.send((23.5567), "_negated", []), "_printShowingDecimalPlaces_", [(0)])]);
-smalltalk.send(self, "_assert_equals_", ["100000000.0", smalltalk.send((100000000), "_printShowingDecimalPlaces_", [(1)])]);
-smalltalk.send(self, "_assert_equals_", ["0.98000", smalltalk.send((0.98), "_printShowingDecimalPlaces_", [(5)])]);
-smalltalk.send(self, "_assert_equals_", [unescape("-0.98"), smalltalk.send(smalltalk.send((0.98), "_negated", []), "_printShowingDecimalPlaces_", [(2)])]);
-smalltalk.send(self, "_assert_equals_", ["2.57", smalltalk.send((2.567), "_printShowingDecimalPlaces_", [(2)])]);
-smalltalk.send(self, "_assert_equals_", [unescape("-2.57"), smalltalk.send((-2.567), "_printShowingDecimalPlaces_", [(2)])]);
-smalltalk.send(self, "_assert_equals_", ["0.00", smalltalk.send((0), "_printShowingDecimalPlaces_", [(2)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.HashedCollection._fromPairs_([smalltalk.send("hello", "__minus_gt", [(1)])]), "_asDictionary", []), "__eq", [smalltalk.send((smalltalk.Dictionary || Dictionary), "_with_", [smalltalk.send("hello", "__minus_gt", [(1)])])])]);
 return self;},
 args: [],
-source: unescape('testPrintShowingDecimalPlaces%0A%09self%20assert%3A%20%2723.00%27%20equals%3A%20%2823%20printShowingDecimalPlaces%3A%202%29.%0A%09self%20assert%3A%20%2723.57%27%20equals%3A%20%2823.5698%20printShowingDecimalPlaces%3A%202%29.%0A%09self%20assert%3A%20%27-234.56700%27%20equals%3A%28%20234.567%20negated%20printShowingDecimalPlaces%3A%205%29.%0A%09self%20assert%3A%20%2723%27%20equals%3A%20%2823.4567%20printShowingDecimalPlaces%3A%200%29.%0A%09self%20assert%3A%20%2724%27%20equals%3A%20%2823.5567%20printShowingDecimalPlaces%3A%200%29.%0A%09self%20assert%3A%20%27-23%27%20equals%3A%20%2823.4567%20negated%20printShowingDecimalPlaces%3A%200%29.%0A%09self%20assert%3A%20%27-24%27%20equals%3A%20%2823.5567%20negated%20printShowingDecimalPlaces%3A%200%29.%0A%09self%20assert%3A%20%27100000000.0%27%20equals%3A%20%28100000000%20printShowingDecimalPlaces%3A%201%29.%0A%09self%20assert%3A%20%270.98000%27%20equals%3A%20%280.98%20printShowingDecimalPlaces%3A%205%29.%0A%09self%20assert%3A%20%27-0.98%27%20equals%3A%20%280.98%20negated%20printShowingDecimalPlaces%3A%202%29.%0A%09self%20assert%3A%20%272.57%27%20equals%3A%20%282.567%20printShowingDecimalPlaces%3A%202%29.%0A%09self%20assert%3A%20%27-2.57%27%20equals%3A%20%28-2.567%20printShowingDecimalPlaces%3A%202%29.%0A%09self%20assert%3A%20%270.00%27%20equals%3A%20%280%20printShowingDecimalPlaces%3A%202%29.'),
-messageSends: ["assert:equals:", "printShowingDecimalPlaces:", "negated"],
-referencedClasses: []
+source: unescape('testDynamicDictionaries%0A%09self%20assert%3A%20%23%7B%27hello%27%20-%3E%201%7D%20asDictionary%20%3D%20%28Dictionary%20with%3A%20%27hello%27%20-%3E%201%29'),
+messageSends: ["assert:", unescape("%3D"), "asDictionary", unescape("-%3E"), "with:"],
+referencedClasses: ["Dictionary"]
 }),
-smalltalk.NumberTest);
+smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
 unescape('_testEquality'),
@@ -482,648 +393,680 @@ selector: unescape('testEquality'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((0), "__eq", [(0)])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq", [(0)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq", [smalltalk.send((1), "_yourself", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq", [smalltalk.send((1), "_yourself", [])])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [false])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [(0)])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [(0)])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [""])]);
-return self;},
-args: [],
-source: unescape('testEquality%0A%09self%20assert%3A%201%20%3D%201.%0A%09self%20assert%3A%200%20%3D%200.%0A%09self%20deny%3A%201%20%3D%200.%0A%0A%09self%20assert%3A%201%20yourself%20%3D%201.%0A%09self%20assert%3A%201%20%3D%201%20yourself.%0A%09self%20assert%3A%201%20yourself%20%3D%201%20yourself.%0A%09%0A%09self%20deny%3A%200%20%3D%20false.%0A%09self%20deny%3A%20false%20%3D%200.%0A%09self%20deny%3A%20%27%27%20%3D%200.%0A%09self%20deny%3A%200%20%3D%20%27%27'),
-messageSends: ["assert:", unescape("%3D"), "deny:", "yourself"],
-referencedClasses: []
-}),
-smalltalk.NumberTest);
-
-smalltalk.addMethod(
-unescape('_testArithmetic'),
-smalltalk.method({
-selector: unescape('testArithmetic'),
-category: 'tests',
-fn: function () {
-var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send((1.5) + (1), "__eq", [(2.5)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((2) - (1), "__eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((-2) - (1), "__eq", [(-3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((12) / (2), "__eq", [(6)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((3) * (4), "__eq", [(12)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = (1) + (2)).klass === smalltalk.Number) ? $receiver *(3) : smalltalk.send($receiver, "__star", [(3)])), "__eq", [(9)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((1) + (2) * (3), "__eq", [(7)])]);
+var d1=nil;
+var d2=nil;
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []), "__eq", [smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])])]);
+(d1=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
+(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
+smalltalk.send(self, "_assert_", [smalltalk.send(d1, "__eq", [d2])]);
+(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (3)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
+smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
+(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(2), (2)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
+smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
+(d2=(function($rec){smalltalk.send($rec, "_at_put_", [(1), (2)]);smalltalk.send($rec, "_at_put_", [(3), (4)]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", [])));
+smalltalk.send(self, "_deny_", [smalltalk.send(d1, "__eq", [d2])]);
 return self;},
 args: [],
-source: unescape('testArithmetic%0A%09%0A%09%22We%20rely%20on%20JS%20here%2C%20so%20we%20won%27t%20test%20complex%20behavior%2C%20just%20check%20if%20%0A%09message%20sends%20are%20corrects%22%0A%0A%09self%20assert%3A%201.5%20+%201%20%3D%202.5.%0A%09self%20assert%3A%202%20-%201%20%3D%201.%0A%09self%20assert%3A%20-2%20-%201%20%3D%20-3.%0A%09self%20assert%3A%2012%20/%202%20%3D%206.%0A%09self%20assert%3A%203%20*%204%20%3D%2012.%0A%0A%09%22Simple%20parenthesis%20and%20execution%20order%22%0A%0A%09self%20assert%3A%201%20+%202%20*%203%20%3D%209.%0A%09self%20assert%3A%201%20+%20%282%20*%203%29%20%3D%207'),
-messageSends: ["assert:", unescape("%3D"), unescape("+"), unescape("-"), unescape("/"), unescape("*")],
-referencedClasses: []
+source: unescape('testEquality%0A%09%7C%20d1%20d2%20%7C%0A%0A%09self%20assert%3A%20Dictionary%20new%20%3D%20Dictionary%20new.%0A%09%09%0A%09d1%20%3A%3D%20Dictionary%20new%20at%3A%201%20put%3A%202%3B%20yourself.%0A%09d2%20%3A%3D%20Dictionary%20new%20at%3A%201%20put%3A%202%3B%20yourself.%0A%09self%20assert%3A%20d1%20%3D%20d2.%0A%0A%09d2%20%3A%3D%20Dictionary%20new%20at%3A%201%20put%3A%203%3B%20yourself.%0A%09self%20deny%3A%20d1%20%3D%20d2.%0A%0A%09d2%20%3A%3D%20Dictionary%20new%20at%3A%202%20put%3A%202%3B%20yourself.%0A%09self%20deny%3A%20d1%20%3D%20d2.%0A%0A%09d2%20%3A%3D%20Dictionary%20new%20at%3A%201%20put%3A%202%3B%20at%3A%203%20put%3A%204%3B%20yourself.%0A%09self%20deny%3A%20d1%20%3D%20d2.'),
+messageSends: ["assert:", unescape("%3D"), "new", "at:put:", "yourself", "deny:"],
+referencedClasses: ["Dictionary"]
 }),
-smalltalk.NumberTest);
+smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
-unescape('_testRounded'),
+unescape('_testKeys'),
 smalltalk.method({
-selector: unescape('testRounded'),
+selector: unescape('testKeys'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_rounded", []), "__eq", [(3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.212), "_rounded", []), "__eq", [(3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.51), "_rounded", []), "__eq", [(4)])]);
+var d=nil;
+(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(d, "_at_put_", [(1), (2)]);
+smalltalk.send(d, "_at_put_", [(2), (3)]);
+smalltalk.send(d, "_at_put_", [(3), (4)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_keys", []), "__eq", [[(1), (2), (3)]])]);
 return self;},
 args: [],
-source: unescape('testRounded%0A%09%0A%09self%20assert%3A%203%20rounded%20%3D%203.%0A%09self%20assert%3A%203.212%20rounded%20%3D%203.%0A%09self%20assert%3A%203.51%20rounded%20%3D%204'),
-messageSends: ["assert:", unescape("%3D"), "rounded"],
-referencedClasses: []
+source: unescape('testKeys%0A%09%7C%20d%20%7C%0A%0A%09d%20%3A%3D%20Dictionary%20new.%0A%09d%20at%3A%201%20put%3A%202.%0A%09d%20at%3A%202%20put%3A%203.%0A%09d%20at%3A%203%20put%3A%204.%0A%0A%09self%20assert%3A%20d%20keys%20%3D%20%23%281%202%203%29'),
+messageSends: ["new", "at:put:", "assert:", unescape("%3D"), "keys"],
+referencedClasses: ["Dictionary"]
 }),
-smalltalk.NumberTest);
+smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
-unescape('_testNegated'),
+unescape('_testPrintString'),
 smalltalk.method({
-selector: unescape('testNegated'),
+selector: unescape('testPrintString'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_negated", []), "__eq", [(-3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((-3), "_negated", []), "__eq", [(3)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("a%20Dictionary%28%27firstname%27%20-%3E%20%27James%27%20%2C%20%27lastname%27%20-%3E%20%27Bond%27%29"), (function($rec){smalltalk.send($rec, "_at_put_", ["firstname", "James"]);smalltalk.send($rec, "_at_put_", ["lastname", "Bond"]);return smalltalk.send($rec, "_printString", []);})(smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []))]);
 return self;},
 args: [],
-source: unescape('testNegated%0A%09self%20assert%3A%203%20negated%20%3D%20-3.%0A%09self%20assert%3A%20-3%20negated%20%3D%203'),
-messageSends: ["assert:", unescape("%3D"), "negated"],
-referencedClasses: []
+source: unescape('testPrintString%0A%09self%0A%09%09assert%3A%20%27a%20Dictionary%28%27%27firstname%27%27%20-%3E%20%27%27James%27%27%20%2C%20%27%27lastname%27%27%20-%3E%20%27%27Bond%27%27%29%27%20%0A%09%09equals%3A%20%28Dictionary%20new%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09at%3A%27firstname%27%20put%3A%20%27James%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09at%3A%27lastname%27%20put%3A%20%27Bond%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09printString%29'),
+messageSends: ["assert:equals:", "at:put:", "printString", "new"],
+referencedClasses: ["Dictionary"]
 }),
-smalltalk.NumberTest);
+smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
-unescape('_testComparison'),
+unescape('_testRemoveKey'),
 smalltalk.method({
-selector: unescape('testComparison'),
+selector: unescape('testRemoveKey'),
 category: 'tests',
-fn: function () {
+fn: function (){
 var self=this;
-smalltalk.send(self, "_assert_", [(3) > (2)]);
-smalltalk.send(self, "_assert_", [(2) < (3)]);
-smalltalk.send(self, "_deny_", [(3) < (2)]);
-smalltalk.send(self, "_deny_", [(2) > (3)]);
-smalltalk.send(self, "_assert_", [(3) >= (3)]);
-smalltalk.send(self, "_assert_", [(3.1) >= (3)]);
-smalltalk.send(self, "_assert_", [(3) <= (3)]);
-smalltalk.send(self, "_assert_", [(3) <= (3.1)]);
+var d=nil;
+var key=nil;
+(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(d, "_at_put_", [(1), (2)]);
+smalltalk.send(d, "_at_put_", [(2), (3)]);
+smalltalk.send(d, "_at_put_", [(3), (4)]);
+(key=(2));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_keys", []), "__eq", [[(1), (2), (3)]])]);
+smalltalk.send(d, "_removeKey_", [key]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_keys", []), "__eq", [[(1), (3)]])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_values", []), "__eq", [[(2), (4)]])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(d, "_includesKey_", [(2)])]);
 return self;},
 args: [],
-source: unescape('testComparison%0A%0A%09self%20assert%3A%203%20%3E%202.%0A%09self%20assert%3A%202%20%3C%203.%0A%09%0A%09self%20deny%3A%203%20%3C%202.%0A%09self%20deny%3A%202%20%3E%203.%0A%0A%09self%20assert%3A%203%20%3E%3D%203.%0A%09self%20assert%3A%203.1%20%3E%3D%203.%0A%09self%20assert%3A%203%20%3C%3D%203.%0A%09self%20assert%3A%203%20%3C%3D%203.1'),
-messageSends: ["assert:", unescape("%3E"), unescape("%3C"), "deny:", unescape("%3E%3D"), unescape("%3C%3D")],
-referencedClasses: []
+source: unescape('testRemoveKey%0A%20%20%20%20%7C%20d%20key%20%7C%0A%0A%20%20%20%20d%20%3A%3D%20Dictionary%20new.%0A%20%20%20%20d%20at%3A%201%20put%3A%202.%0A%20%20%20%20d%20at%3A%202%20put%3A%203.%0A%20%20%20%20d%20at%3A%203%20put%3A%204.%0A%0A%20%20%20%20key%20%3A%3D%202.%0A%0A%20%20%20%20self%20assert%3A%20d%20keys%20%3D%20%23%281%202%203%29.%0A%0A%20%20%20%20d%20removeKey%3A%20key.%0A%20%20%20%20self%20assert%3A%20d%20keys%20%3D%20%23%281%203%29.%0A%20%20%20%20self%20assert%3A%20d%20values%20%3D%20%23%282%204%29.%0A%20%20%20%20self%20deny%3A%20%28d%20includesKey%3A%202%29'),
+messageSends: ["new", "at:put:", "assert:", unescape("%3D"), "keys", "removeKey:", "values", "deny:", "includesKey:"],
+referencedClasses: ["Dictionary"]
 }),
-smalltalk.NumberTest);
+smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
-unescape('_testTruncated'),
+unescape('_testRemoveKeyIfAbsent'),
 smalltalk.method({
-selector: unescape('testTruncated'),
+selector: unescape('testRemoveKeyIfAbsent'),
 category: 'tests',
-fn: function () {
+fn: function (){
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_truncated", []), "__eq", [(3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.212), "_truncated", []), "__eq", [(3)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.51), "_truncated", []), "__eq", [(3)])]);
+var d=nil;
+var key=nil;
+(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(d, "_at_put_", [(1), (2)]);
+smalltalk.send(d, "_at_put_", [(2), (3)]);
+smalltalk.send(d, "_at_put_", [(3), (4)]);
+(key=(2));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_removeKey_", [key]), "__eq", [(3)])]);
+(key=(3));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_removeKey_ifAbsent_", [key, (function(){return (42);})]), "__eq", [(4)])]);
+(key="why");
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_removeKey_ifAbsent_", [key, (function(){return (42);})]), "__eq", [(42)])]);
 return self;},
 args: [],
-source: unescape('testTruncated%0A%09%0A%09self%20assert%3A%203%20truncated%20%3D%203.%0A%09self%20assert%3A%203.212%20truncated%20%3D%203.%0A%09self%20assert%3A%203.51%20truncated%20%3D%203'),
-messageSends: ["assert:", unescape("%3D"), "truncated"],
-referencedClasses: []
+source: unescape('testRemoveKeyIfAbsent%0A%20%20%20%20%7C%20d%20key%20%7C%0A%0A%20%20%20%20d%20%3A%3D%20Dictionary%20new.%0A%20%20%20%20d%20at%3A%201%20put%3A%202.%0A%20%20%20%20d%20at%3A%202%20put%3A%203.%0A%20%20%20%20d%20at%3A%203%20put%3A%204.%0A%0A%20%20%20%20key%20%3A%3D%202.%0A%20%20%20%20self%20assert%3A%20%28d%20removeKey%3A%20key%29%20%3D%203.%0A%0A%20%20%20%20key%20%3A%3D%203.%0A%20%20%20%20self%20assert%3A%20%28d%20removeKey%3A%20key%20ifAbsent%3A%20%5B42%5D%29%20%3D%204.%0A%0A%20%20%20%20key%20%3A%3D%20%27why%27.%0A%20%20%20%20self%20assert%3A%20%28d%20removeKey%3A%20key%20ifAbsent%3A%20%5B42%5D%20%29%20%3D%2042.'),
+messageSends: ["new", "at:put:", "assert:", unescape("%3D"), "removeKey:", "removeKey:ifAbsent:"],
+referencedClasses: ["Dictionary"]
 }),
-smalltalk.NumberTest);
+smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
-unescape('_testCopying'),
+unescape('_testSize'),
 smalltalk.method({
-selector: unescape('testCopying'),
+selector: unescape('testSize'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_copy", []), "__eq_eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_deepCopy", []), "__eq_eq", [(1)])]);
+var d=nil;
+(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(0)])]);
+smalltalk.send(d, "_at_put_", [(1), (2)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(1)])]);
+smalltalk.send(d, "_at_put_", [(2), (3)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_size", []), "__eq", [(2)])]);
 return self;},
 args: [],
-source: unescape('testCopying%0A%09self%20assert%3A%201%20copy%20%3D%3D%201.%0A%09self%20assert%3A%201%20deepCopy%20%3D%3D%201'),
-messageSends: ["assert:", unescape("%3D%3D"), "copy", "deepCopy"],
-referencedClasses: []
+source: unescape('testSize%0A%09%7C%20d%20%7C%0A%0A%09d%20%3A%3D%20Dictionary%20new.%0A%09self%20assert%3A%20d%20size%20%3D%200.%0A%0A%09d%20at%3A%201%20put%3A%202.%0A%09self%20assert%3A%20d%20size%20%3D%201.%0A%0A%09d%20at%3A%202%20put%3A%203.%0A%09self%20assert%3A%20d%20size%20%3D%202.'),
+messageSends: ["new", "assert:", unescape("%3D"), "size", "at:put:"],
+referencedClasses: ["Dictionary"]
 }),
-smalltalk.NumberTest);
+smalltalk.DictionaryTest);
 
 smalltalk.addMethod(
-unescape('_testMinMax'),
+unescape('_testValues'),
 smalltalk.method({
-selector: unescape('testMinMax'),
+selector: unescape('testValues'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((2), "_max_", [(5)]), (5)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((2), "_min_", [(5)]), (2)]);
+var d=nil;
+(d=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
+smalltalk.send(d, "_at_put_", [(1), (2)]);
+smalltalk.send(d, "_at_put_", [(2), (3)]);
+smalltalk.send(d, "_at_put_", [(3), (4)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(d, "_values", []), "__eq", [[(2), (3), (4)]])]);
 return self;},
 args: [],
-source: unescape('testMinMax%0A%09%0A%09self%20assert%3A%20%282%20max%3A%205%29%20equals%3A%205.%0A%09self%20assert%3A%20%282%20min%3A%205%29%20equals%3A%202'),
-messageSends: ["assert:equals:", "max:", "min:"],
-referencedClasses: []
+source: unescape('testValues%0A%09%7C%20d%20%7C%0A%0A%09d%20%3A%3D%20Dictionary%20new.%0A%09d%20at%3A%201%20put%3A%202.%0A%09d%20at%3A%202%20put%3A%203.%0A%09d%20at%3A%203%20put%3A%204.%0A%0A%09self%20assert%3A%20d%20values%20%3D%20%23%282%203%204%29'),
+messageSends: ["new", "at:put:", "assert:", unescape("%3D"), "values"],
+referencedClasses: ["Dictionary"]
 }),
-smalltalk.NumberTest);
+smalltalk.DictionaryTest);
+
 
+
+smalltalk.addClass('JSObjectProxyTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testIdentity'),
+unescape('_jsObject'),
 smalltalk.method({
-selector: unescape('testIdentity'),
-category: 'tests',
+selector: unescape('jsObject'),
+category: 'accessing',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq_eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((0), "__eq_eq", [(0)])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq_eq", [(0)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq_eq", [(1)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq_eq", [smalltalk.send((1), "_yourself", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq_eq", [smalltalk.send((1), "_yourself", [])])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq_eq", [(2)])]);
+return jsObject = {a: 1, b: function() {return 2;}, c: function(object) {return object;}};
 return self;},
 args: [],
-source: unescape('testIdentity%0A%09self%20assert%3A%201%20%3D%3D%201.%0A%09self%20assert%3A%200%20%3D%3D%200.%0A%09self%20deny%3A%201%20%3D%3D%200.%0A%0A%09self%20assert%3A%201%20yourself%20%3D%3D%201.%0A%09self%20assert%3A%201%20%3D%3D%201%20yourself.%0A%09self%20assert%3A%201%20yourself%20%3D%3D%201%20yourself.%0A%09%0A%09self%20deny%3A%201%20%3D%3D%202'),
-messageSends: ["assert:", unescape("%3D%3D"), "deny:", "yourself"],
+source: unescape('jsObject%0A%09%3Creturn%20jsObject%20%3D%20%7Ba%3A%201%2C%20b%3A%20function%28%29%20%7Breturn%202%3B%7D%2C%20c%3A%20function%28object%29%20%7Breturn%20object%3B%7D%7D%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
 smalltalk.addMethod(
-unescape('_testSqrt'),
+unescape('_testDNU'),
 smalltalk.method({
-selector: unescape('testSqrt'),
+selector: unescape('testDNU'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((4), "_sqrt", []), "__eq", [(2)])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((16), "_sqrt", []), "__eq", [(4)])]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send(self, "_jsObject", []), "_foo", []);}), (smalltalk.MessageNotUnderstood || MessageNotUnderstood)]);
 return self;},
 args: [],
-source: unescape('testSqrt%0A%09%0A%09self%20assert%3A%204%20sqrt%20%3D%202.%0A%09self%20assert%3A%2016%20sqrt%20%3D%204'),
-messageSends: ["assert:", unescape("%3D"), "sqrt"],
-referencedClasses: []
+source: unescape('testDNU%0A%09self%20should%3A%20%5Bself%20jsObject%20foo%5D%20raise%3A%20MessageNotUnderstood'),
+messageSends: ["should:raise:", "foo", "jsObject"],
+referencedClasses: ["MessageNotUnderstood"]
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
 smalltalk.addMethod(
-unescape('_testSquared'),
+unescape('_testMessageSend'),
 smalltalk.method({
-selector: unescape('testSquared'),
+selector: unescape('testMessageSend'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((4), "_squared", []), "__eq", [(16)])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_a", []), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_b", []), (2)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_c_", [(3)]), (3)]);
 return self;},
 args: [],
-source: unescape('testSquared%0A%09%0A%09self%20assert%3A%204%20squared%20%3D%2016'),
-messageSends: ["assert:", unescape("%3D"), "squared"],
+source: unescape('testMessageSend%0A%0A%09self%20assert%3A%20self%20jsObject%20a%20equals%3A%201.%0A%09self%20assert%3A%20self%20jsObject%20b%20equals%3A%202.%0A%09self%20assert%3A%20%28self%20jsObject%20c%3A%203%29%20equals%3A%203'),
+messageSends: ["assert:equals:", "a", "jsObject", "b", "c:"],
 referencedClasses: []
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
 smalltalk.addMethod(
-unescape('_testTimesRepeat'),
+unescape('_testMethodWithArguments'),
 smalltalk.method({
-selector: unescape('testTimesRepeat'),
+selector: unescape('testMethodWithArguments'),
 category: 'tests',
 fn: function () {
 var self=this;
-var i=nil;
-(i=(0));
-smalltalk.send((0), "_timesRepeat_", [(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})]);
-smalltalk.send(self, "_assert_equals_", [i, (0)]);
-smalltalk.send((5), "_timesRepeat_", [(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})]);
-smalltalk.send(self, "_assert_equals_", [i, (5)]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
+smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["amber"]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
+smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["amber"]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
 return self;},
 args: [],
-source: unescape('testTimesRepeat%0A%09%7C%20i%20%7C%0A%0A%09i%20%3A%3D%200.%0A%090%20timesRepeat%3A%20%5Bi%20%3A%3D%20i%20+%201%5D.%0A%09self%20assert%3A%20i%20equals%3A%200.%0A%0A%095%20timesRepeat%3A%20%5Bi%20%3A%3D%20i%20+%201%5D.%0A%09self%20assert%3A%20i%20equals%3A%205'),
-messageSends: ["timesRepeat:", unescape("+"), "assert:equals:"],
+source: unescape('testMethodWithArguments%0A%09self%20deny%3A%20%28%27body%27%20asJQuery%20hasClass%3A%20%27amber%27%29.%0A%0A%09%27body%27%20asJQuery%20addClass%3A%20%27amber%27.%0A%09self%20assert%3A%20%28%27body%27%20asJQuery%20hasClass%3A%20%27amber%27%29.%0A%0A%09%27body%27%20asJQuery%20removeClass%3A%20%27amber%27.%0A%09self%20deny%3A%20%28%27body%27%20asJQuery%20hasClass%3A%20%27amber%27%29.'),
+messageSends: ["deny:", "hasClass:", "asJQuery", "addClass:", "assert:", "removeClass:"],
 referencedClasses: []
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
 smalltalk.addMethod(
-unescape('_testTo'),
+unescape('_testPrinting'),
 smalltalk.method({
-selector: unescape('testTo'),
+selector: unescape('testPrinting'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((1), "_to_", [(5)]), [(1), (2), (3), (4), (5)]]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_jsObject", []), "_printString", []), "__eq", [unescape("%5Bobject%20Object%5D")])]);
 return self;},
 args: [],
-source: unescape('testTo%0A%09self%20assert%3A%20%281%20to%3A%205%29%20equals%3A%20%23%281%202%203%204%205%29'),
-messageSends: ["assert:equals:", "to:"],
+source: unescape('testPrinting%0A%09self%20assert%3A%20self%20jsObject%20printString%20%3D%20%27%5Bobject%20Object%5D%27'),
+messageSends: ["assert:", unescape("%3D"), "printString", "jsObject"],
 referencedClasses: []
 }),
-smalltalk.NumberTest);
+smalltalk.JSObjectProxyTest);
 
 smalltalk.addMethod(
-unescape('_testToBy'),
+unescape('_testPropertyThatReturnsEmptyString'),
 smalltalk.method({
-selector: unescape('testToBy'),
+selector: unescape('testPropertyThatReturnsEmptyString'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((0), "_to_by_", [(6), (2)]), [(0), (2), (4), (6)]]);
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send((1), "_to_by_", [(4), (0)]);}), (smalltalk.Error || Error)]);
+document.location.hash = '';
+smalltalk.send(self, "_assert_equals_", ["", smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash", [])]);
+smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash_", ["test"]);
+smalltalk.send(self, "_assert_equals_", [unescape("%23test"), smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash", [])]);
 return self;},
 args: [],
-source: unescape('testToBy%0A%09self%20assert%3A%20%280%20to%3A%206%20by%3A%202%29%20equals%3A%20%23%280%202%204%206%29.%0A%0A%09self%20should%3A%20%5B1%20to%3A%204%20by%3A%200%5D%20raise%3A%20Error'),
-messageSends: ["assert:equals:", "to:by:", "should:raise:"],
-referencedClasses: ["Error"]
+source: unescape('testPropertyThatReturnsEmptyString%0A%09%3Cdocument.location.hash%20%3D%20%27%27%3E.%0A%09self%20assert%3A%20%27%27%20equals%3A%20document%20location%20hash.%0A%0A%09document%20location%20hash%3A%20%27test%27.%0A%09self%20assert%3A%20%27%23test%27%20equals%3A%20document%20location%20hash.'),
+messageSends: ["assert:equals:", "hash", "location", "hash:"],
+referencedClasses: []
 }),
-smalltalk.NumberTest);
-
-
+smalltalk.JSObjectProxyTest);
 
-smalltalk.addClass('JSObjectProxyTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_jsObject'),
+unescape('_testYourself'),
 smalltalk.method({
-selector: unescape('jsObject'),
-category: 'accessing',
+selector: unescape('testYourself'),
+category: 'tests',
 fn: function () {
 var self=this;
-return jsObject = {a: 1, b: function() {return 2;}, c: function(object) {return object;}};
+var body=nil;
+(body=(function($rec){smalltalk.send($rec, "_addClass_", ["amber"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send("body", "_asJQuery", [])));
+smalltalk.send(self, "_assert_", [smalltalk.send(body, "_hasClass_", ["amber"])]);
+smalltalk.send(body, "_removeClass_", ["amber"]);
+smalltalk.send(self, "_deny_", [smalltalk.send(body, "_hasClass_", ["amber"])]);
 return self;},
 args: [],
-source: unescape('jsObject%0A%09%3Creturn%20jsObject%20%3D%20%7Ba%3A%201%2C%20b%3A%20function%28%29%20%7Breturn%202%3B%7D%2C%20c%3A%20function%28object%29%20%7Breturn%20object%3B%7D%7D%3E'),
-messageSends: [],
+source: unescape('testYourself%0A%09%7Cbody%7C%0A%09body%20%3A%3D%20%27body%27%20asJQuery%0A%09%09%09%09addClass%3A%20%27amber%27%3B%0A%09%09%09%09yourself.%0A%0A%09self%20assert%3A%20%28body%20hasClass%3A%20%27amber%27%29.%0A%0A%09body%20removeClass%3A%20%27amber%27.%0A%09self%20deny%3A%20%28body%20hasClass%3A%20%27amber%27%29.'),
+messageSends: ["addClass:", "yourself", "asJQuery", "assert:", "hasClass:", "removeClass:", "deny:"],
 referencedClasses: []
 }),
 smalltalk.JSObjectProxyTest);
 
+
+
+smalltalk.addClass('NumberTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testMethodWithArguments'),
+unescape('_testArithmetic'),
 smalltalk.method({
-selector: unescape('testMethodWithArguments'),
+selector: unescape('testArithmetic'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
-smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_addClass_", ["amber"]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
-smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_removeClass_", ["amber"]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send("body", "_asJQuery", []), "_hasClass_", ["amber"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1.5) + (1), "__eq", [(2.5)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((2) - (1), "__eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((-2) - (1), "__eq", [(-3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((12) / (2), "__eq", [(6)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((3) * (4), "__eq", [(12)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(((($receiver = (1) + (2)).klass === smalltalk.Number) ? $receiver *(3) : smalltalk.send($receiver, "__star", [(3)])), "__eq", [(9)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1) + (2) * (3), "__eq", [(7)])]);
 return self;},
 args: [],
-source: unescape('testMethodWithArguments%0A%09self%20deny%3A%20%28%27body%27%20asJQuery%20hasClass%3A%20%27amber%27%29.%0A%0A%09%27body%27%20asJQuery%20addClass%3A%20%27amber%27.%0A%09self%20assert%3A%20%28%27body%27%20asJQuery%20hasClass%3A%20%27amber%27%29.%0A%0A%09%27body%27%20asJQuery%20removeClass%3A%20%27amber%27.%0A%09self%20deny%3A%20%28%27body%27%20asJQuery%20hasClass%3A%20%27amber%27%29.'),
-messageSends: ["deny:", "hasClass:", "asJQuery", "addClass:", "assert:", "removeClass:"],
+source: unescape('testArithmetic%0A%09%0A%09%22We%20rely%20on%20JS%20here%2C%20so%20we%20won%27t%20test%20complex%20behavior%2C%20just%20check%20if%20%0A%09message%20sends%20are%20corrects%22%0A%0A%09self%20assert%3A%201.5%20+%201%20%3D%202.5.%0A%09self%20assert%3A%202%20-%201%20%3D%201.%0A%09self%20assert%3A%20-2%20-%201%20%3D%20-3.%0A%09self%20assert%3A%2012%20/%202%20%3D%206.%0A%09self%20assert%3A%203%20*%204%20%3D%2012.%0A%0A%09%22Simple%20parenthesis%20and%20execution%20order%22%0A%0A%09self%20assert%3A%201%20+%202%20*%203%20%3D%209.%0A%09self%20assert%3A%201%20+%20%282%20*%203%29%20%3D%207'),
+messageSends: ["assert:", unescape("%3D"), unescape("+"), unescape("-"), unescape("/"), unescape("*")],
 referencedClasses: []
 }),
-smalltalk.JSObjectProxyTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testYourself'),
+unescape('_testComparison'),
 smalltalk.method({
-selector: unescape('testYourself'),
+selector: unescape('testComparison'),
 category: 'tests',
 fn: function () {
 var self=this;
-var body=nil;
-(body=(function($rec){smalltalk.send($rec, "_addClass_", ["amber"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send("body", "_asJQuery", [])));
-smalltalk.send(self, "_assert_", [smalltalk.send(body, "_hasClass_", ["amber"])]);
-smalltalk.send(body, "_removeClass_", ["amber"]);
-smalltalk.send(self, "_deny_", [smalltalk.send(body, "_hasClass_", ["amber"])]);
+smalltalk.send(self, "_assert_", [(3) > (2)]);
+smalltalk.send(self, "_assert_", [(2) < (3)]);
+smalltalk.send(self, "_deny_", [(3) < (2)]);
+smalltalk.send(self, "_deny_", [(2) > (3)]);
+smalltalk.send(self, "_assert_", [(3) >= (3)]);
+smalltalk.send(self, "_assert_", [(3.1) >= (3)]);
+smalltalk.send(self, "_assert_", [(3) <= (3)]);
+smalltalk.send(self, "_assert_", [(3) <= (3.1)]);
 return self;},
 args: [],
-source: unescape('testYourself%0A%09%7Cbody%7C%0A%09body%20%3A%3D%20%27body%27%20asJQuery%0A%09%09%09%09addClass%3A%20%27amber%27%3B%0A%09%09%09%09yourself.%0A%0A%09self%20assert%3A%20%28body%20hasClass%3A%20%27amber%27%29.%0A%0A%09body%20removeClass%3A%20%27amber%27.%0A%09self%20deny%3A%20%28body%20hasClass%3A%20%27amber%27%29.'),
-messageSends: ["addClass:", "yourself", "asJQuery", "assert:", "hasClass:", "removeClass:", "deny:"],
+source: unescape('testComparison%0A%0A%09self%20assert%3A%203%20%3E%202.%0A%09self%20assert%3A%202%20%3C%203.%0A%09%0A%09self%20deny%3A%203%20%3C%202.%0A%09self%20deny%3A%202%20%3E%203.%0A%0A%09self%20assert%3A%203%20%3E%3D%203.%0A%09self%20assert%3A%203.1%20%3E%3D%203.%0A%09self%20assert%3A%203%20%3C%3D%203.%0A%09self%20assert%3A%203%20%3C%3D%203.1'),
+messageSends: ["assert:", unescape("%3E"), unescape("%3C"), "deny:", unescape("%3E%3D"), unescape("%3C%3D")],
 referencedClasses: []
 }),
-smalltalk.JSObjectProxyTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testPropertyThatReturnsEmptyString'),
+unescape('_testCopying'),
 smalltalk.method({
-selector: unescape('testPropertyThatReturnsEmptyString'),
+selector: unescape('testCopying'),
 category: 'tests',
 fn: function () {
 var self=this;
-document.location.hash = '';
-smalltalk.send(self, "_assert_equals_", ["", smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash", [])]);
-smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash_", ["test"]);
-smalltalk.send(self, "_assert_equals_", [unescape("%23test"), smalltalk.send(smalltalk.send((typeof document == 'undefined' ? nil : document), "_location", []), "_hash", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_copy", []), "__eq_eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_deepCopy", []), "__eq_eq", [(1)])]);
 return self;},
 args: [],
-source: unescape('testPropertyThatReturnsEmptyString%0A%09%3Cdocument.location.hash%20%3D%20%27%27%3E.%0A%09self%20assert%3A%20%27%27%20equals%3A%20document%20location%20hash.%0A%0A%09document%20location%20hash%3A%20%27test%27.%0A%09self%20assert%3A%20%27%23test%27%20equals%3A%20document%20location%20hash.'),
-messageSends: ["assert:equals:", "hash", "location", "hash:"],
+source: unescape('testCopying%0A%09self%20assert%3A%201%20copy%20%3D%3D%201.%0A%09self%20assert%3A%201%20deepCopy%20%3D%3D%201'),
+messageSends: ["assert:", unescape("%3D%3D"), "copy", "deepCopy"],
 referencedClasses: []
 }),
-smalltalk.JSObjectProxyTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testDNU'),
+unescape('_testEquality'),
 smalltalk.method({
-selector: unescape('testDNU'),
+selector: unescape('testEquality'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send(self, "_jsObject", []), "_foo", []);}), (smalltalk.MessageNotUnderstood || MessageNotUnderstood)]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((0), "__eq", [(0)])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq", [(0)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq", [smalltalk.send((1), "_yourself", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq", [smalltalk.send((1), "_yourself", [])])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [false])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(false, "__eq", [(0)])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [(0)])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((0), "__eq", [""])]);
 return self;},
 args: [],
-source: unescape('testDNU%0A%09self%20should%3A%20%5Bself%20jsObject%20foo%5D%20raise%3A%20MessageNotUnderstood'),
-messageSends: ["should:raise:", "foo", "jsObject"],
-referencedClasses: ["MessageNotUnderstood"]
+source: unescape('testEquality%0A%09self%20assert%3A%201%20%3D%201.%0A%09self%20assert%3A%200%20%3D%200.%0A%09self%20deny%3A%201%20%3D%200.%0A%0A%09self%20assert%3A%201%20yourself%20%3D%201.%0A%09self%20assert%3A%201%20%3D%201%20yourself.%0A%09self%20assert%3A%201%20yourself%20%3D%201%20yourself.%0A%09%0A%09self%20deny%3A%200%20%3D%20false.%0A%09self%20deny%3A%20false%20%3D%200.%0A%09self%20deny%3A%20%27%27%20%3D%200.%0A%09self%20deny%3A%200%20%3D%20%27%27'),
+messageSends: ["assert:", unescape("%3D"), "deny:", "yourself"],
+referencedClasses: []
 }),
-smalltalk.JSObjectProxyTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testMessageSend'),
+unescape('_testIdentity'),
 smalltalk.method({
-selector: unescape('testMessageSend'),
+selector: unescape('testIdentity'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_a", []), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_b", []), (2)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self, "_jsObject", []), "_c_", [(3)]), (3)]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq_eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((0), "__eq_eq", [(0)])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq_eq", [(0)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq_eq", [(1)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((1), "__eq_eq", [smalltalk.send((1), "_yourself", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((1), "_yourself", []), "__eq_eq", [smalltalk.send((1), "_yourself", [])])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((1), "__eq_eq", [(2)])]);
 return self;},
 args: [],
-source: unescape('testMessageSend%0A%0A%09self%20assert%3A%20self%20jsObject%20a%20equals%3A%201.%0A%09self%20assert%3A%20self%20jsObject%20b%20equals%3A%202.%0A%09self%20assert%3A%20%28self%20jsObject%20c%3A%203%29%20equals%3A%203'),
-messageSends: ["assert:equals:", "a", "jsObject", "b", "c:"],
+source: unescape('testIdentity%0A%09self%20assert%3A%201%20%3D%3D%201.%0A%09self%20assert%3A%200%20%3D%3D%200.%0A%09self%20deny%3A%201%20%3D%3D%200.%0A%0A%09self%20assert%3A%201%20yourself%20%3D%3D%201.%0A%09self%20assert%3A%201%20%3D%3D%201%20yourself.%0A%09self%20assert%3A%201%20yourself%20%3D%3D%201%20yourself.%0A%09%0A%09self%20deny%3A%201%20%3D%3D%202'),
+messageSends: ["assert:", unescape("%3D%3D"), "deny:", "yourself"],
 referencedClasses: []
 }),
-smalltalk.JSObjectProxyTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testPrinting'),
+unescape('_testMinMax'),
 smalltalk.method({
-selector: unescape('testPrinting'),
+selector: unescape('testMinMax'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_jsObject", []), "_printString", []), "__eq", [unescape("%5Bobject%20Object%5D")])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((2), "_max_", [(5)]), (5)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((2), "_min_", [(5)]), (2)]);
 return self;},
 args: [],
-source: unescape('testPrinting%0A%09self%20assert%3A%20self%20jsObject%20printString%20%3D%20%27%5Bobject%20Object%5D%27'),
-messageSends: ["assert:", unescape("%3D"), "printString", "jsObject"],
+source: unescape('testMinMax%0A%09%0A%09self%20assert%3A%20%282%20max%3A%205%29%20equals%3A%205.%0A%09self%20assert%3A%20%282%20min%3A%205%29%20equals%3A%202'),
+messageSends: ["assert:equals:", "max:", "min:"],
 referencedClasses: []
 }),
-smalltalk.JSObjectProxyTest);
-
-
+smalltalk.NumberTest);
 
-smalltalk.addClass('PackageTest', smalltalk.TestCase, ['zorkPackage', 'grulPackage', 'backUpCommitPathJs', 'backUpCommitPathSt'], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_setUp'),
+unescape('_testNegated'),
 smalltalk.method({
-selector: unescape('setUp'),
-category: 'running',
+selector: unescape('testNegated'),
+category: 'tests',
 fn: function () {
 var self=this;
-(self['@backUpCommitPathJs']=smalltalk.send((smalltalk.Package || Package), "_defaultCommitPathJs", []));
-(self['@backUpCommitPathSt']=smalltalk.send((smalltalk.Package || Package), "_defaultCommitPathSt", []));
-smalltalk.send((smalltalk.Package || Package), "_resetCommitPaths", []);
-(self['@zorkPackage']=smalltalk.send(smalltalk.send((smalltalk.Package || Package), "_new", []), "_name_", ["Zork"]));
-(self['@grulPackage']=(function($rec){smalltalk.send($rec, "_name_", ["Grul"]);smalltalk.send($rec, "_commitPathJs_", [unescape("server/grul/js")]);smalltalk.send($rec, "_commitPathSt_", [unescape("grul/st")]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Package || Package), "_new", [])));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_negated", []), "__eq", [(-3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((-3), "_negated", []), "__eq", [(3)])]);
 return self;},
 args: [],
-source: unescape('setUp%0A%09backUpCommitPathJs%20%3A%3D%20Package%20defaultCommitPathJs.%0A%09backUpCommitPathSt%20%3A%3D%20Package%20defaultCommitPathSt.%0A%0A%09Package%20resetCommitPaths.%0A%0A%09zorkPackage%20%3A%3D%20Package%20new%20name%3A%20%27Zork%27.%0A%09grulPackage%20%3A%3D%20Package%20new%20%0A%09%09%09%09%09name%3A%20%27Grul%27%3B%0A%09%09%09%09%09commitPathJs%3A%20%27server/grul/js%27%3B%0A%09%09%09%09%09commitPathSt%3A%20%27grul/st%27%3B%0A%09%09%09%09%09yourself'),
-messageSends: ["defaultCommitPathJs", "defaultCommitPathSt", "resetCommitPaths", "name:", "new", "commitPathJs:", "commitPathSt:", "yourself"],
-referencedClasses: ["Package"]
+source: unescape('testNegated%0A%09self%20assert%3A%203%20negated%20%3D%20-3.%0A%09self%20assert%3A%20-3%20negated%20%3D%203'),
+messageSends: ["assert:", unescape("%3D"), "negated"],
+referencedClasses: []
 }),
-smalltalk.PackageTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_tearDown'),
+unescape('_testPrintShowingDecimalPlaces'),
 smalltalk.method({
-selector: unescape('tearDown'),
-category: 'running',
+selector: unescape('testPrintShowingDecimalPlaces'),
+category: 'tests',
 fn: function () {
 var self=this;
-(function($rec){smalltalk.send($rec, "_defaultCommitPathJs_", [self['@backUpCommitPathJs']]);return smalltalk.send($rec, "_defaultCommitPathSt_", [self['@backUpCommitPathSt']]);})((smalltalk.Package || Package));
+smalltalk.send(self, "_assert_equals_", ["23.00", smalltalk.send((23), "_printShowingDecimalPlaces_", [(2)])]);
+smalltalk.send(self, "_assert_equals_", ["23.57", smalltalk.send((23.5698), "_printShowingDecimalPlaces_", [(2)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("-234.56700"), smalltalk.send(smalltalk.send((234.567), "_negated", []), "_printShowingDecimalPlaces_", [(5)])]);
+smalltalk.send(self, "_assert_equals_", ["23", smalltalk.send((23.4567), "_printShowingDecimalPlaces_", [(0)])]);
+smalltalk.send(self, "_assert_equals_", ["24", smalltalk.send((23.5567), "_printShowingDecimalPlaces_", [(0)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("-23"), smalltalk.send(smalltalk.send((23.4567), "_negated", []), "_printShowingDecimalPlaces_", [(0)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("-24"), smalltalk.send(smalltalk.send((23.5567), "_negated", []), "_printShowingDecimalPlaces_", [(0)])]);
+smalltalk.send(self, "_assert_equals_", ["100000000.0", smalltalk.send((100000000), "_printShowingDecimalPlaces_", [(1)])]);
+smalltalk.send(self, "_assert_equals_", ["0.98000", smalltalk.send((0.98), "_printShowingDecimalPlaces_", [(5)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("-0.98"), smalltalk.send(smalltalk.send((0.98), "_negated", []), "_printShowingDecimalPlaces_", [(2)])]);
+smalltalk.send(self, "_assert_equals_", ["2.57", smalltalk.send((2.567), "_printShowingDecimalPlaces_", [(2)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("-2.57"), smalltalk.send((-2.567), "_printShowingDecimalPlaces_", [(2)])]);
+smalltalk.send(self, "_assert_equals_", ["0.00", smalltalk.send((0), "_printShowingDecimalPlaces_", [(2)])]);
 return self;},
 args: [],
-source: unescape('tearDown%0A%09%20Package%20%0A%09%09defaultCommitPathJs%3A%20backUpCommitPathJs%3B%0A%09%09defaultCommitPathSt%3A%20backUpCommitPathSt'),
-messageSends: ["defaultCommitPathJs:", "defaultCommitPathSt:"],
-referencedClasses: ["Package"]
+source: unescape('testPrintShowingDecimalPlaces%0A%09self%20assert%3A%20%2723.00%27%20equals%3A%20%2823%20printShowingDecimalPlaces%3A%202%29.%0A%09self%20assert%3A%20%2723.57%27%20equals%3A%20%2823.5698%20printShowingDecimalPlaces%3A%202%29.%0A%09self%20assert%3A%20%27-234.56700%27%20equals%3A%28%20234.567%20negated%20printShowingDecimalPlaces%3A%205%29.%0A%09self%20assert%3A%20%2723%27%20equals%3A%20%2823.4567%20printShowingDecimalPlaces%3A%200%29.%0A%09self%20assert%3A%20%2724%27%20equals%3A%20%2823.5567%20printShowingDecimalPlaces%3A%200%29.%0A%09self%20assert%3A%20%27-23%27%20equals%3A%20%2823.4567%20negated%20printShowingDecimalPlaces%3A%200%29.%0A%09self%20assert%3A%20%27-24%27%20equals%3A%20%2823.5567%20negated%20printShowingDecimalPlaces%3A%200%29.%0A%09self%20assert%3A%20%27100000000.0%27%20equals%3A%20%28100000000%20printShowingDecimalPlaces%3A%201%29.%0A%09self%20assert%3A%20%270.98000%27%20equals%3A%20%280.98%20printShowingDecimalPlaces%3A%205%29.%0A%09self%20assert%3A%20%27-0.98%27%20equals%3A%20%280.98%20negated%20printShowingDecimalPlaces%3A%202%29.%0A%09self%20assert%3A%20%272.57%27%20equals%3A%20%282.567%20printShowingDecimalPlaces%3A%202%29.%0A%09self%20assert%3A%20%27-2.57%27%20equals%3A%20%28-2.567%20printShowingDecimalPlaces%3A%202%29.%0A%09self%20assert%3A%20%270.00%27%20equals%3A%20%280%20printShowingDecimalPlaces%3A%202%29.'),
+messageSends: ["assert:equals:", "printShowingDecimalPlaces:", "negated"],
+referencedClasses: []
 }),
-smalltalk.PackageTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testGrulCommitPathStShouldBeGrulSt'),
+unescape('_testRounded'),
 smalltalk.method({
-selector: unescape('testGrulCommitPathStShouldBeGrulSt'),
+selector: unescape('testRounded'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("grul/st"), smalltalk.send(self['@grulPackage'], "_commitPathSt", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_rounded", []), "__eq", [(3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.212), "_rounded", []), "__eq", [(3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.51), "_rounded", []), "__eq", [(4)])]);
 return self;},
 args: [],
-source: unescape('testGrulCommitPathStShouldBeGrulSt%0A%09self%20assert%3A%20%27grul/st%27%20equals%3A%20grulPackage%20commitPathSt'),
-messageSends: ["assert:equals:", "commitPathSt"],
+source: unescape('testRounded%0A%09%0A%09self%20assert%3A%203%20rounded%20%3D%203.%0A%09self%20assert%3A%203.212%20rounded%20%3D%203.%0A%09self%20assert%3A%203.51%20rounded%20%3D%204'),
+messageSends: ["assert:", unescape("%3D"), "rounded"],
 referencedClasses: []
 }),
-smalltalk.PackageTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testZorkCommitPathStShouldBeSt'),
+unescape('_testSqrt'),
 smalltalk.method({
-selector: unescape('testZorkCommitPathStShouldBeSt'),
+selector: unescape('testSqrt'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", ["st", smalltalk.send(self['@zorkPackage'], "_commitPathSt", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((4), "_sqrt", []), "__eq", [(2)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((16), "_sqrt", []), "__eq", [(4)])]);
 return self;},
 args: [],
-source: unescape('testZorkCommitPathStShouldBeSt%0A%09self%20assert%3A%20%27st%27%20equals%3A%20zorkPackage%20commitPathSt'),
-messageSends: ["assert:equals:", "commitPathSt"],
+source: unescape('testSqrt%0A%09%0A%09self%20assert%3A%204%20sqrt%20%3D%202.%0A%09self%20assert%3A%2016%20sqrt%20%3D%204'),
+messageSends: ["assert:", unescape("%3D"), "sqrt"],
 referencedClasses: []
 }),
-smalltalk.PackageTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testZorkCommitPathJsShouldBeJs'),
+unescape('_testSquared'),
 smalltalk.method({
-selector: unescape('testZorkCommitPathJsShouldBeJs'),
+selector: unescape('testSquared'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", ["js", smalltalk.send(self['@zorkPackage'], "_commitPathJs", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((4), "_squared", []), "__eq", [(16)])]);
 return self;},
 args: [],
-source: unescape('testZorkCommitPathJsShouldBeJs%0A%09self%20assert%3A%20%27js%27%20equals%3A%20zorkPackage%20commitPathJs'),
-messageSends: ["assert:equals:", "commitPathJs"],
+source: unescape('testSquared%0A%09%0A%09self%20assert%3A%204%20squared%20%3D%2016'),
+messageSends: ["assert:", unescape("%3D"), "squared"],
 referencedClasses: []
 }),
-smalltalk.PackageTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testGrulCommitPathJsShouldBeServerGrulJs'),
+unescape('_testTimesRepeat'),
 smalltalk.method({
-selector: unescape('testGrulCommitPathJsShouldBeServerGrulJs'),
+selector: unescape('testTimesRepeat'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("server/grul/js"), smalltalk.send(self['@grulPackage'], "_commitPathJs", [])]);
+var i=nil;
+(i=(0));
+smalltalk.send((0), "_timesRepeat_", [(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})]);
+smalltalk.send(self, "_assert_equals_", [i, (0)]);
+smalltalk.send((5), "_timesRepeat_", [(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})]);
+smalltalk.send(self, "_assert_equals_", [i, (5)]);
 return self;},
 args: [],
-source: unescape('testGrulCommitPathJsShouldBeServerGrulJs%0A%09self%20assert%3A%20%27server/grul/js%27%20equals%3A%20grulPackage%20commitPathJs'),
-messageSends: ["assert:equals:", "commitPathJs"],
+source: unescape('testTimesRepeat%0A%09%7C%20i%20%7C%0A%0A%09i%20%3A%3D%200.%0A%090%20timesRepeat%3A%20%5Bi%20%3A%3D%20i%20+%201%5D.%0A%09self%20assert%3A%20i%20equals%3A%200.%0A%0A%095%20timesRepeat%3A%20%5Bi%20%3A%3D%20i%20+%201%5D.%0A%09self%20assert%3A%20i%20equals%3A%205'),
+messageSends: ["timesRepeat:", unescape("+"), "assert:equals:"],
 referencedClasses: []
 }),
-smalltalk.PackageTest);
-
-
+smalltalk.NumberTest);
 
-smalltalk.addClass('BlockClosureTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testValue'),
+unescape('_testTo'),
 smalltalk.method({
-selector: unescape('testValue'),
+selector: unescape('testTo'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return (1) + (1);}), "_value", []), (2)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(x){return ((($receiver = x).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]));}), "_value_", [(2)]), (3)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(x, y){return ((($receiver = x).klass === smalltalk.Number) ? $receiver *y : smalltalk.send($receiver, "__star", [y]));}), "_value_value_", [(2), (4)]), (8)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b, c){return (1);}), "_value", []), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((1), "_to_", [(5)]), [(1), (2), (3), (4), (5)]]);
 return self;},
 args: [],
-source: unescape('testValue%0A%09self%20assert%3A%20%28%5B1+1%5D%20value%29%20equals%3A%202.%0A%09self%20assert%3A%20%28%5B%3Ax%20%7C%20x%20+1%5D%20value%3A%202%29%20equals%3A%203.%0A%09self%20assert%3A%20%28%5B%3Ax%20%3Ay%20%7C%20x*y%5D%20value%3A%202%20value%3A%204%29%20equals%3A%208.%20%0A%0A%09%22Arguments%20are%20optional%20in%20Amber.%20This%20isn%27t%20ANSI%20compliant.%22%0A%0A%09self%20assert%3A%20%28%5B%3Aa%20%3Ab%20%3Ac%20%7C%201%5D%20value%29%20equals%3A%201'),
-messageSends: ["assert:equals:", "value", unescape("+"), "value:", "value:value:", unescape("*")],
+source: unescape('testTo%0A%09self%20assert%3A%20%281%20to%3A%205%29%20equals%3A%20%23%281%202%203%204%205%29'),
+messageSends: ["assert:equals:", "to:"],
 referencedClasses: []
 }),
-smalltalk.BlockClosureTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testOnDo'),
+unescape('_testToBy'),
 smalltalk.method({
-selector: unescape('testOnDo'),
+selector: unescape('testToBy'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send((function(){return smalltalk.send(smalltalk.send((smalltalk.Error || Error), "_new", []), "_signal", []);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return true;})])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((0), "_to_by_", [(6), (2)]), [(0), (2), (4), (6)]]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send((1), "_to_by_", [(4), (0)]);}), (smalltalk.Error || Error)]);
 return self;},
 args: [],
-source: unescape('testOnDo%0A%09self%20assert%3A%20%28%5BError%20new%20signal%5D%20on%3A%20Error%20do%3A%20%5B%3Aex%20%7C%20true%5D%29'),
-messageSends: ["assert:", "on:do:", "signal", "new"],
+source: unescape('testToBy%0A%09self%20assert%3A%20%280%20to%3A%206%20by%3A%202%29%20equals%3A%20%23%280%202%204%206%29.%0A%0A%09self%20should%3A%20%5B1%20to%3A%204%20by%3A%200%5D%20raise%3A%20Error'),
+messageSends: ["assert:equals:", "to:by:", "should:raise:"],
 referencedClasses: ["Error"]
 }),
-smalltalk.BlockClosureTest);
+smalltalk.NumberTest);
 
 smalltalk.addMethod(
-unescape('_testEnsure'),
+unescape('_testTruncated'),
 smalltalk.method({
-selector: unescape('testEnsure'),
+selector: unescape('testTruncated'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send((function(){return smalltalk.send((smalltalk.Error || Error), "_new", []);}), "_ensure_", [(function(){return true;})])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "_truncated", []), "__eq", [(3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.212), "_truncated", []), "__eq", [(3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3.51), "_truncated", []), "__eq", [(3)])]);
 return self;},
 args: [],
-source: unescape('testEnsure%0A%09self%20assert%3A%20%28%5BError%20new%5D%20ensure%3A%20%5Btrue%5D%29'),
-messageSends: ["assert:", "ensure:", "new"],
-referencedClasses: ["Error"]
+source: unescape('testTruncated%0A%09%0A%09self%20assert%3A%203%20truncated%20%3D%203.%0A%09self%20assert%3A%203.212%20truncated%20%3D%203.%0A%09self%20assert%3A%203.51%20truncated%20%3D%203'),
+messageSends: ["assert:", unescape("%3D"), "truncated"],
+referencedClasses: []
 }),
-smalltalk.BlockClosureTest);
+smalltalk.NumberTest);
 
+
+
+smalltalk.addClass('ObjectMock', smalltalk.Object, ['foo', 'bar'], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testNumArgs'),
+unescape('_foo'),
 smalltalk.method({
-selector: unescape('testNumArgs'),
-category: 'tests',
+selector: unescape('foo'),
+category: 'not yet classified',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return nil;}), "_numArgs", []), (0)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b){return nil;}), "_numArgs", []), (2)]);
+return self['@foo'];
 return self;},
 args: [],
-source: unescape('testNumArgs%0A%09self%20assert%3A%20%5B%5D%20numArgs%20equals%3A%200.%0A%09self%20assert%3A%20%5B%3Aa%20%3Ab%20%7C%20%5D%20numArgs%20equals%3A%202'),
-messageSends: ["assert:equals:", "numArgs"],
+source: unescape('foo%0A%09%5Efoo'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.BlockClosureTest);
+smalltalk.ObjectMock);
 
 smalltalk.addMethod(
-unescape('_testValueWithPossibleArguments'),
+unescape('_foo_'),
 smalltalk.method({
-selector: unescape('testValueWithPossibleArguments'),
-category: 'tests',
-fn: function () {
+selector: unescape('foo%3A'),
+category: 'not yet classified',
+fn: function (anObject) {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(){return (1);}), "_valueWithPossibleArguments_", [[(3), (4)]]), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +(4) : smalltalk.send($receiver, "__plus", [(4)]));}), "_valueWithPossibleArguments_", [[(3), (4)]]), (7)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((function(a, b){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +b : smalltalk.send($receiver, "__plus", [b]));}), "_valueWithPossibleArguments_", [[(3), (4), (5)]]), (7)]);
+(self['@foo']=anObject);
 return self;},
-args: [],
-source: unescape('testValueWithPossibleArguments%0A%09self%20assert%3A%20%28%5B1%5D%20valueWithPossibleArguments%3A%20%23%283%204%29%29%20equals%3A%201.%0A%09self%20assert%3A%20%28%5B%3Aa%20%7C%20a%20+%204%5D%20valueWithPossibleArguments%3A%20%23%283%204%29%29%20equals%3A%207.%0A%09self%20assert%3A%20%28%5B%3Aa%20%3Ab%20%7C%20a%20+%20b%5D%20valueWithPossibleArguments%3A%20%23%283%204%205%29%29%20equals%3A%207.'),
-messageSends: ["assert:equals:", "valueWithPossibleArguments:", unescape("+")],
+args: ["anObject"],
+source: unescape('foo%3A%20anObject%0A%09foo%20%3A%3D%20anObject'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.BlockClosureTest);
+smalltalk.ObjectMock);
+
+
 
+smalltalk.addClass('ObjectTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testWhileTrue'),
+unescape('_testBasicAccess'),
 smalltalk.method({
-selector: unescape('testWhileTrue'),
+selector: unescape('testBasicAccess'),
 category: 'tests',
 fn: function () {
 var self=this;
-var i=nil;
-(i=(0));
-(function(){while((function(){return ((($receiver = i).klass === smalltalk.Number) ? $receiver <(5) : smalltalk.send($receiver, "__lt", [(5)]));})()) {(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
-smalltalk.send(self, "_assert_equals_", [i, (5)]);
-(i=(0));
-(function(){while((function(){(i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));return ((($receiver = i).klass === smalltalk.Number) ? $receiver <(5) : smalltalk.send($receiver, "__lt", [(5)]));})()) {}})();
-smalltalk.send(self, "_assert_equals_", [i, (5)]);
+var o=nil;
+(o=smalltalk.send((smalltalk.Object || Object), "_new", []));
+smalltalk.send(o, "_basicAt_put_", ["a", (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicAt_", ["a"]), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicAt_", ["b"]), nil]);
 return self;},
 args: [],
-source: unescape('testWhileTrue%0A%09%7C%20i%20%7C%0A%09i%20%3A%3D%200.%0A%09%5Bi%20%3C%205%5D%20whileTrue%3A%20%5Bi%20%3A%3D%20i%20+%201%5D.%0A%09self%20assert%3A%20i%20equals%3A%205.%0A%0A%09i%20%3A%3D%200.%0A%09%5Bi%20%3A%3D%20i%20+%201.%20i%20%3C%205%5D%20whileTrue.%0A%09self%20assert%3A%20i%20equals%3A%205'),
-messageSends: ["whileTrue:", unescape("%3C"), unescape("+"), "assert:equals:", "whileTrue"],
-referencedClasses: []
+source: unescape('testBasicAccess%0A%09%7C%20o%20%7C%0A%09o%20%3A%3D%20Object%20new.%0A%09o%20basicAt%3A%20%27a%27%20put%3A%201.%0A%09self%20assert%3A%20%28o%20basicAt%3A%20%27a%27%29%20equals%3A%201.%0A%09self%20assert%3A%20%28o%20basicAt%3A%20%27b%27%29%20equals%3A%20nil'),
+messageSends: ["new", "basicAt:put:", "assert:equals:", "basicAt:"],
+referencedClasses: ["Object"]
 }),
-smalltalk.BlockClosureTest);
+smalltalk.ObjectTest);
 
 smalltalk.addMethod(
-unescape('_testWhileFalse'),
+unescape('_testBasicPerform'),
 smalltalk.method({
-selector: unescape('testWhileFalse'),
+selector: unescape('testBasicPerform'),
 category: 'tests',
 fn: function () {
 var self=this;
-var i=nil;
-(i=(0));
-(function(){while(!(function(){return ((($receiver = i).klass === smalltalk.Number) ? $receiver >(5) : smalltalk.send($receiver, "__gt", [(5)]));})()) {(function(){return (i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));})()}})();
-smalltalk.send(self, "_assert_equals_", [i, (6)]);
-(i=(0));
-(function(){while(!(function(){(i=((($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));return ((($receiver = i).klass === smalltalk.Number) ? $receiver >(5) : smalltalk.send($receiver, "__gt", [(5)]));})()) {}})();
-smalltalk.send(self, "_assert_equals_", [i, (6)]);
+var o=nil;
+(o=smalltalk.send((smalltalk.Object || Object), "_new", []));
+smalltalk.send(o, "_basicAt_put_", ["func", (function(){return "hello";})]);
+smalltalk.send(o, "_basicAt_put_", ["func2", (function(a){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]));})]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicPerform_", ["func"]), "hello"]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicPerform_withArguments_", ["func2", [(3)]]), (4)]);
 return self;},
 args: [],
-source: unescape('testWhileFalse%0A%09%7C%20i%20%7C%0A%09i%20%3A%3D%200.%0A%09%5Bi%20%3E%205%5D%20whileFalse%3A%20%5Bi%20%3A%3D%20i%20+%201%5D.%0A%09self%20assert%3A%20i%20equals%3A%206.%0A%0A%09i%20%3A%3D%200.%0A%09%5Bi%20%3A%3D%20i%20+%201.%20i%20%3E%205%5D%20whileFalse.%0A%09self%20assert%3A%20i%20equals%3A%206'),
-messageSends: ["whileFalse:", unescape("%3E"), unescape("+"), "assert:equals:", "whileFalse"],
-referencedClasses: []
+source: unescape('testBasicPerform%0A%09%7C%20o%20%7C%0A%09o%20%3A%3D%20Object%20new.%0A%09o%20basicAt%3A%20%27func%27%20put%3A%20%5B%27hello%27%5D.%09%0A%09o%20basicAt%3A%20%27func2%27%20put%3A%20%5B%3Aa%20%7C%20a%20+%201%5D.%0A%0A%09self%20assert%3A%20%28o%20basicPerform%3A%20%27func%27%29%09%20equals%3A%20%27hello%27.%0A%09self%20assert%3A%20%28o%20basicPerform%3A%20%27func2%27%20withArguments%3A%20%23%283%29%29%20equals%3A%204'),
+messageSends: ["new", "basicAt:put:", unescape("+"), "assert:equals:", "basicPerform:", "basicPerform:withArguments:"],
+referencedClasses: ["Object"]
 }),
-smalltalk.BlockClosureTest);
+smalltalk.ObjectTest);
 
 smalltalk.addMethod(
-unescape('_testCompiledSource'),
+unescape('_testDNU'),
 smalltalk.method({
-selector: unescape('testCompiledSource'),
+selector: unescape('testDNU'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((function(){return (1) + (1);}), "_compiledSource", []), "_includesSubString_", ["function"])]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_foo", []);}), (smalltalk.MessageNotUnderstood || MessageNotUnderstood)]);
 return self;},
 args: [],
-source: unescape('testCompiledSource%0A%09self%20assert%3A%20%28%5B1+1%5D%20compiledSource%20includesSubString%3A%20%27function%27%29'),
-messageSends: ["assert:", "includesSubString:", "compiledSource", unescape("+")],
-referencedClasses: []
+source: unescape('testDNU%0A%09self%20should%3A%20%5BObject%20new%20foo%5D%20raise%3A%20MessageNotUnderstood'),
+messageSends: ["should:raise:", "foo", "new"],
+referencedClasses: ["Object", "MessageNotUnderstood"]
 }),
-smalltalk.BlockClosureTest);
-
-
+smalltalk.ObjectTest);
 
-smalltalk.addClass('ObjectTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
 unescape('_testEquality'),
 smalltalk.method({
@@ -1145,6 +1088,22 @@ referencedClasses: ["Object"]
 }),
 smalltalk.ObjectTest);
 
+smalltalk.addMethod(
+unescape('_testHalt'),
+smalltalk.method({
+selector: unescape('testHalt'),
+category: 'tests',
+fn: function () {
+var self=this;
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_halt", []);}), (smalltalk.Error || Error)]);
+return self;},
+args: [],
+source: unescape('testHalt%0A%09self%20should%3A%20%5BObject%20new%20halt%5D%20raise%3A%20Error'),
+messageSends: ["should:raise:", "halt", "new"],
+referencedClasses: ["Object", "Error"]
+}),
+smalltalk.ObjectTest);
+
 smalltalk.addMethod(
 unescape('_testIdentity'),
 smalltalk.method({
@@ -1165,38 +1124,43 @@ referencedClasses: ["Object"]
 smalltalk.ObjectTest);
 
 smalltalk.addMethod(
-unescape('_testHalt'),
+unescape('_testIfNil'),
 smalltalk.method({
-selector: unescape('testHalt'),
+selector: unescape('testIfNil'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_halt", []);}), (smalltalk.Error || Error)]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_isNil", [])]);
+smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver, "__eq", [true])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) != nil && $receiver != undefined) ? (function(){return true;})() : nil, "__eq", [true])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
+smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
 return self;},
 args: [],
-source: unescape('testHalt%0A%09self%20should%3A%20%5BObject%20new%20halt%5D%20raise%3A%20Error'),
-messageSends: ["should:raise:", "halt", "new"],
-referencedClasses: ["Object", "Error"]
+source: unescape('testIfNil%0A%09self%20deny%3A%20Object%20new%20isNil.%0A%09self%20deny%3A%20%28Object%20new%20ifNil%3A%20%5Btrue%5D%29%20%3D%20true.%0A%09self%20assert%3A%20%28Object%20new%20ifNotNil%3A%20%5Btrue%5D%29%20%3D%20true.%0A%0A%09self%20assert%3A%20%28Object%20new%20ifNil%3A%20%5Bfalse%5D%20ifNotNil%3A%20%5Btrue%5D%29%20%3D%20true.%0A%09self%20assert%3A%20%28Object%20new%20ifNotNil%3A%20%5Btrue%5D%20ifNil%3A%20%5Bfalse%5D%29%20%3D%20true'),
+messageSends: ["deny:", "isNil", "new", unescape("%3D"), "ifNil:", "assert:", "ifNotNil:", "ifNil:ifNotNil:", "ifNotNil:ifNil:"],
+referencedClasses: ["Object"]
 }),
 smalltalk.ObjectTest);
 
 smalltalk.addMethod(
-unescape('_testBasicAccess'),
+unescape('_testInstVars'),
 smalltalk.method({
-selector: unescape('testBasicAccess'),
+selector: unescape('testInstVars'),
 category: 'tests',
 fn: function () {
 var self=this;
 var o=nil;
-(o=smalltalk.send((smalltalk.Object || Object), "_new", []));
-smalltalk.send(o, "_basicAt_put_", ["a", (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicAt_", ["a"]), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicAt_", ["b"]), nil]);
+(o=smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_new", []));
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", [smalltalk.symbolFor("foo")]), nil]);
+smalltalk.send(o, "_instVarAt_put_", [smalltalk.symbolFor("foo"), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", [smalltalk.symbolFor("foo")]), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", ["foo"]), (1)]);
 return self;},
 args: [],
-source: unescape('testBasicAccess%0A%09%7C%20o%20%7C%0A%09o%20%3A%3D%20Object%20new.%0A%09o%20basicAt%3A%20%27a%27%20put%3A%201.%0A%09self%20assert%3A%20%28o%20basicAt%3A%20%27a%27%29%20equals%3A%201.%0A%09self%20assert%3A%20%28o%20basicAt%3A%20%27b%27%29%20equals%3A%20nil'),
-messageSends: ["new", "basicAt:put:", "assert:equals:", "basicAt:"],
-referencedClasses: ["Object"]
+source: unescape('testInstVars%0A%09%7C%20o%20%7C%0A%09o%20%3A%3D%20ObjectMock%20new.%0A%09self%20assert%3A%20%28o%20instVarAt%3A%20%23foo%29%20equals%3A%20nil.%0A%0A%09o%20instVarAt%3A%20%23foo%20put%3A%201.%0A%09self%20assert%3A%20%28o%20instVarAt%3A%20%23foo%29%20equals%3A%201.%0A%09self%20assert%3A%20%28o%20instVarAt%3A%20%27foo%27%29%20equals%3A%201'),
+messageSends: ["new", "assert:equals:", "instVarAt:", "instVarAt:put:"],
+referencedClasses: ["ObjectMock"]
 }),
 smalltalk.ObjectTest);
 
@@ -1216,6 +1180,24 @@ referencedClasses: []
 }),
 smalltalk.ObjectTest);
 
+smalltalk.addMethod(
+unescape('_testYourself'),
+smalltalk.method({
+selector: unescape('testYourself'),
+category: 'tests',
+fn: function () {
+var self=this;
+var o=nil;
+(o=smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_new", []));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(o, "_yourself", []), "__eq_eq", [o])]);
+return self;},
+args: [],
+source: unescape('testYourself%0A%09%7C%20o%20%7C%0A%09o%20%3A%3D%20ObjectMock%20new.%0A%09self%20assert%3A%20o%20yourself%20%3D%3D%20o'),
+messageSends: ["new", "assert:", unescape("%3D%3D"), "yourself"],
+referencedClasses: ["ObjectMock"]
+}),
+smalltalk.ObjectTest);
+
 smalltalk.addMethod(
 unescape('_testidentityHash'),
 smalltalk.method({
@@ -1231,769 +1213,841 @@ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(o1, "_identityHa
 smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send(o1, "_identityHash", []), "__eq_eq", [smalltalk.send(o2, "_identityHash", [])])]);
 return self;},
 args: [],
-source: unescape('testidentityHash%0A%09%7C%20o1%20o2%20%7C%0A%09%0A%09o1%20%3A%3D%20Object%20new.%0A%09o2%20%3A%3D%20Object%20new.%0A%0A%09self%20assert%3A%20o1%20identityHash%20%3D%3D%20o1%20identityHash.%0A%09self%20deny%3A%20o1%20identityHash%20%3D%3D%20o2%20identityHash'),
-messageSends: ["new", "assert:", unescape("%3D%3D"), "identityHash", "deny:"],
-referencedClasses: ["Object"]
+source: unescape('testidentityHash%0A%09%7C%20o1%20o2%20%7C%0A%09%0A%09o1%20%3A%3D%20Object%20new.%0A%09o2%20%3A%3D%20Object%20new.%0A%0A%09self%20assert%3A%20o1%20identityHash%20%3D%3D%20o1%20identityHash.%0A%09self%20deny%3A%20o1%20identityHash%20%3D%3D%20o2%20identityHash'),
+messageSends: ["new", "assert:", unescape("%3D%3D"), "identityHash", "deny:"],
+referencedClasses: ["Object"]
+}),
+smalltalk.ObjectTest);
+
+
+
+smalltalk.addClass('PackageTest', smalltalk.TestCase, ['zorkPackage', 'grulPackage', 'backUpCommitPathJs', 'backUpCommitPathSt'], 'Kernel-Tests');
+smalltalk.addMethod(
+unescape('_setUp'),
+smalltalk.method({
+selector: unescape('setUp'),
+category: 'running',
+fn: function () {
+var self=this;
+(self['@backUpCommitPathJs']=smalltalk.send((smalltalk.Package || Package), "_defaultCommitPathJs", []));
+(self['@backUpCommitPathSt']=smalltalk.send((smalltalk.Package || Package), "_defaultCommitPathSt", []));
+smalltalk.send((smalltalk.Package || Package), "_resetCommitPaths", []);
+(self['@zorkPackage']=smalltalk.send(smalltalk.send((smalltalk.Package || Package), "_new", []), "_name_", ["Zork"]));
+(self['@grulPackage']=(function($rec){smalltalk.send($rec, "_name_", ["Grul"]);smalltalk.send($rec, "_commitPathJs_", [unescape("server/grul/js")]);smalltalk.send($rec, "_commitPathSt_", [unescape("grul/st")]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Package || Package), "_new", [])));
+return self;},
+args: [],
+source: unescape('setUp%0A%09backUpCommitPathJs%20%3A%3D%20Package%20defaultCommitPathJs.%0A%09backUpCommitPathSt%20%3A%3D%20Package%20defaultCommitPathSt.%0A%0A%09Package%20resetCommitPaths.%0A%0A%09zorkPackage%20%3A%3D%20Package%20new%20name%3A%20%27Zork%27.%0A%09grulPackage%20%3A%3D%20Package%20new%20%0A%09%09%09%09%09name%3A%20%27Grul%27%3B%0A%09%09%09%09%09commitPathJs%3A%20%27server/grul/js%27%3B%0A%09%09%09%09%09commitPathSt%3A%20%27grul/st%27%3B%0A%09%09%09%09%09yourself'),
+messageSends: ["defaultCommitPathJs", "defaultCommitPathSt", "resetCommitPaths", "name:", "new", "commitPathJs:", "commitPathSt:", "yourself"],
+referencedClasses: ["Package"]
+}),
+smalltalk.PackageTest);
+
+smalltalk.addMethod(
+unescape('_tearDown'),
+smalltalk.method({
+selector: unescape('tearDown'),
+category: 'running',
+fn: function () {
+var self=this;
+(function($rec){smalltalk.send($rec, "_defaultCommitPathJs_", [self['@backUpCommitPathJs']]);return smalltalk.send($rec, "_defaultCommitPathSt_", [self['@backUpCommitPathSt']]);})((smalltalk.Package || Package));
+return self;},
+args: [],
+source: unescape('tearDown%0A%09%20Package%20%0A%09%09defaultCommitPathJs%3A%20backUpCommitPathJs%3B%0A%09%09defaultCommitPathSt%3A%20backUpCommitPathSt'),
+messageSends: ["defaultCommitPathJs:", "defaultCommitPathSt:"],
+referencedClasses: ["Package"]
+}),
+smalltalk.PackageTest);
+
+smalltalk.addMethod(
+unescape('_testGrulCommitPathJsShouldBeServerGrulJs'),
+smalltalk.method({
+selector: unescape('testGrulCommitPathJsShouldBeServerGrulJs'),
+category: 'tests',
+fn: function () {
+var self=this;
+smalltalk.send(self, "_assert_equals_", [unescape("server/grul/js"), smalltalk.send(self['@grulPackage'], "_commitPathJs", [])]);
+return self;},
+args: [],
+source: unescape('testGrulCommitPathJsShouldBeServerGrulJs%0A%09self%20assert%3A%20%27server/grul/js%27%20equals%3A%20grulPackage%20commitPathJs'),
+messageSends: ["assert:equals:", "commitPathJs"],
+referencedClasses: []
+}),
+smalltalk.PackageTest);
+
+smalltalk.addMethod(
+unescape('_testGrulCommitPathStShouldBeGrulSt'),
+smalltalk.method({
+selector: unescape('testGrulCommitPathStShouldBeGrulSt'),
+category: 'tests',
+fn: function () {
+var self=this;
+smalltalk.send(self, "_assert_equals_", [unescape("grul/st"), smalltalk.send(self['@grulPackage'], "_commitPathSt", [])]);
+return self;},
+args: [],
+source: unescape('testGrulCommitPathStShouldBeGrulSt%0A%09self%20assert%3A%20%27grul/st%27%20equals%3A%20grulPackage%20commitPathSt'),
+messageSends: ["assert:equals:", "commitPathSt"],
+referencedClasses: []
+}),
+smalltalk.PackageTest);
+
+smalltalk.addMethod(
+unescape('_testZorkCommitPathJsShouldBeJs'),
+smalltalk.method({
+selector: unescape('testZorkCommitPathJsShouldBeJs'),
+category: 'tests',
+fn: function () {
+var self=this;
+smalltalk.send(self, "_assert_equals_", ["js", smalltalk.send(self['@zorkPackage'], "_commitPathJs", [])]);
+return self;},
+args: [],
+source: unescape('testZorkCommitPathJsShouldBeJs%0A%09self%20assert%3A%20%27js%27%20equals%3A%20zorkPackage%20commitPathJs'),
+messageSends: ["assert:equals:", "commitPathJs"],
+referencedClasses: []
+}),
+smalltalk.PackageTest);
+
+smalltalk.addMethod(
+unescape('_testZorkCommitPathStShouldBeSt'),
+smalltalk.method({
+selector: unescape('testZorkCommitPathStShouldBeSt'),
+category: 'tests',
+fn: function () {
+var self=this;
+smalltalk.send(self, "_assert_equals_", ["st", smalltalk.send(self['@zorkPackage'], "_commitPathSt", [])]);
+return self;},
+args: [],
+source: unescape('testZorkCommitPathStShouldBeSt%0A%09self%20assert%3A%20%27st%27%20equals%3A%20zorkPackage%20commitPathSt'),
+messageSends: ["assert:equals:", "commitPathSt"],
+referencedClasses: []
 }),
-smalltalk.ObjectTest);
+smalltalk.PackageTest);
+
 
+
+smalltalk.addClass('PackageWithDefaultCommitPathChangedTest', smalltalk.PackageTest, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testBasicPerform'),
+unescape('_setUp'),
 smalltalk.method({
-selector: unescape('testBasicPerform'),
-category: 'tests',
+selector: unescape('setUp'),
+category: 'running',
 fn: function () {
 var self=this;
-var o=nil;
-(o=smalltalk.send((smalltalk.Object || Object), "_new", []));
-smalltalk.send(o, "_basicAt_put_", ["func", (function(){return "hello";})]);
-smalltalk.send(o, "_basicAt_put_", ["func2", (function(a){return ((($receiver = a).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]));})]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicPerform_", ["func"]), "hello"]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_basicPerform_withArguments_", ["func2", [(3)]]), (4)]);
+smalltalk.send(self, "_setUp", [], smalltalk.PackageTest);
+(function($rec){smalltalk.send($rec, "_defaultCommitPathJs_", [unescape("javascripts/")]);return smalltalk.send($rec, "_defaultCommitPathSt_", [unescape("smalltalk/")]);})((smalltalk.Package || Package));
 return self;},
 args: [],
-source: unescape('testBasicPerform%0A%09%7C%20o%20%7C%0A%09o%20%3A%3D%20Object%20new.%0A%09o%20basicAt%3A%20%27func%27%20put%3A%20%5B%27hello%27%5D.%09%0A%09o%20basicAt%3A%20%27func2%27%20put%3A%20%5B%3Aa%20%7C%20a%20+%201%5D.%0A%0A%09self%20assert%3A%20%28o%20basicPerform%3A%20%27func%27%29%09%20equals%3A%20%27hello%27.%0A%09self%20assert%3A%20%28o%20basicPerform%3A%20%27func2%27%20withArguments%3A%20%23%283%29%29%20equals%3A%204'),
-messageSends: ["new", "basicAt:put:", unescape("+"), "assert:equals:", "basicPerform:", "basicPerform:withArguments:"],
-referencedClasses: ["Object"]
+source: unescape('setUp%0A%09super%20setUp.%0A%0A%09Package%0A%09%09defaultCommitPathJs%3A%20%27javascripts/%27%3B%0A%09%09defaultCommitPathSt%3A%20%27smalltalk/%27.'),
+messageSends: ["setUp", "defaultCommitPathJs:", "defaultCommitPathSt:"],
+referencedClasses: ["Package"]
 }),
-smalltalk.ObjectTest);
+smalltalk.PackageWithDefaultCommitPathChangedTest);
 
 smalltalk.addMethod(
-unescape('_testIfNil'),
+unescape('_testGrulCommitPathJsShouldBeServerGrulJs'),
 smalltalk.method({
-selector: unescape('testIfNil'),
+selector: unescape('testGrulCommitPathJsShouldBeServerGrulJs'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_isNil", [])]);
-smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver, "__eq", [true])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) != nil && $receiver != undefined) ? (function(){return true;})() : nil, "__eq", [true])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
-smalltalk.send(self, "_assert_", [smalltalk.send((($receiver = smalltalk.send((smalltalk.Object || Object), "_new", [])) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
+smalltalk.send(self, "_assert_equals_", [unescape("server/grul/js"), smalltalk.send(self['@grulPackage'], "_commitPathJs", [])]);
 return self;},
 args: [],
-source: unescape('testIfNil%0A%09self%20deny%3A%20Object%20new%20isNil.%0A%09self%20deny%3A%20%28Object%20new%20ifNil%3A%20%5Btrue%5D%29%20%3D%20true.%0A%09self%20assert%3A%20%28Object%20new%20ifNotNil%3A%20%5Btrue%5D%29%20%3D%20true.%0A%0A%09self%20assert%3A%20%28Object%20new%20ifNil%3A%20%5Bfalse%5D%20ifNotNil%3A%20%5Btrue%5D%29%20%3D%20true.%0A%09self%20assert%3A%20%28Object%20new%20ifNotNil%3A%20%5Btrue%5D%20ifNil%3A%20%5Bfalse%5D%29%20%3D%20true'),
-messageSends: ["deny:", "isNil", "new", unescape("%3D"), "ifNil:", "assert:", "ifNotNil:", "ifNil:ifNotNil:", "ifNotNil:ifNil:"],
-referencedClasses: ["Object"]
+source: unescape('testGrulCommitPathJsShouldBeServerGrulJs%0A%09self%20assert%3A%20%27server/grul/js%27%20equals%3A%20grulPackage%20commitPathJs'),
+messageSends: ["assert:equals:", "commitPathJs"],
+referencedClasses: []
 }),
-smalltalk.ObjectTest);
+smalltalk.PackageWithDefaultCommitPathChangedTest);
 
 smalltalk.addMethod(
-unescape('_testInstVars'),
+unescape('_testGrulCommitPathStShouldBeGrulSt'),
 smalltalk.method({
-selector: unescape('testInstVars'),
+selector: unescape('testGrulCommitPathStShouldBeGrulSt'),
 category: 'tests',
 fn: function () {
 var self=this;
-var o=nil;
-(o=smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_new", []));
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", [smalltalk.symbolFor("foo")]), nil]);
-smalltalk.send(o, "_instVarAt_put_", [smalltalk.symbolFor("foo"), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", [smalltalk.symbolFor("foo")]), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(o, "_instVarAt_", ["foo"]), (1)]);
+smalltalk.send(self, "_assert_equals_", [unescape("grul/st"), smalltalk.send(self['@grulPackage'], "_commitPathSt", [])]);
 return self;},
 args: [],
-source: unescape('testInstVars%0A%09%7C%20o%20%7C%0A%09o%20%3A%3D%20ObjectMock%20new.%0A%09self%20assert%3A%20%28o%20instVarAt%3A%20%23foo%29%20equals%3A%20nil.%0A%0A%09o%20instVarAt%3A%20%23foo%20put%3A%201.%0A%09self%20assert%3A%20%28o%20instVarAt%3A%20%23foo%29%20equals%3A%201.%0A%09self%20assert%3A%20%28o%20instVarAt%3A%20%27foo%27%29%20equals%3A%201'),
-messageSends: ["new", "assert:equals:", "instVarAt:", "instVarAt:put:"],
-referencedClasses: ["ObjectMock"]
+source: unescape('testGrulCommitPathStShouldBeGrulSt%0A%09self%20assert%3A%20%27grul/st%27%20equals%3A%20grulPackage%20commitPathSt'),
+messageSends: ["assert:equals:", "commitPathSt"],
+referencedClasses: []
 }),
-smalltalk.ObjectTest);
+smalltalk.PackageWithDefaultCommitPathChangedTest);
 
 smalltalk.addMethod(
-unescape('_testYourself'),
+unescape('_testZorkCommitPathJsShouldBeJavascript'),
 smalltalk.method({
-selector: unescape('testYourself'),
+selector: unescape('testZorkCommitPathJsShouldBeJavascript'),
 category: 'tests',
 fn: function () {
 var self=this;
-var o=nil;
-(o=smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_new", []));
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(o, "_yourself", []), "__eq_eq", [o])]);
+smalltalk.send(self, "_assert_equals_", [unescape("javascripts/"), smalltalk.send(self['@zorkPackage'], "_commitPathJs", [])]);
 return self;},
 args: [],
-source: unescape('testYourself%0A%09%7C%20o%20%7C%0A%09o%20%3A%3D%20ObjectMock%20new.%0A%09self%20assert%3A%20o%20yourself%20%3D%3D%20o'),
-messageSends: ["new", "assert:", unescape("%3D%3D"), "yourself"],
-referencedClasses: ["ObjectMock"]
+source: unescape('testZorkCommitPathJsShouldBeJavascript%0A%09self%20assert%3A%20%27javascripts/%27%20equals%3A%20zorkPackage%20commitPathJs'),
+messageSends: ["assert:equals:", "commitPathJs"],
+referencedClasses: []
 }),
-smalltalk.ObjectTest);
+smalltalk.PackageWithDefaultCommitPathChangedTest);
 
 smalltalk.addMethod(
-unescape('_testDNU'),
+unescape('_testZorkCommitPathStShouldBeSmalltalk'),
 smalltalk.method({
-selector: unescape('testDNU'),
+selector: unescape('testZorkCommitPathStShouldBeSmalltalk'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_foo", []);}), (smalltalk.MessageNotUnderstood || MessageNotUnderstood)]);
+smalltalk.send(self, "_assert_equals_", [unescape("smalltalk/"), smalltalk.send(self['@zorkPackage'], "_commitPathSt", [])]);
 return self;},
 args: [],
-source: unescape('testDNU%0A%09self%20should%3A%20%5BObject%20new%20foo%5D%20raise%3A%20MessageNotUnderstood'),
-messageSends: ["should:raise:", "foo", "new"],
-referencedClasses: ["Object", "MessageNotUnderstood"]
+source: unescape('testZorkCommitPathStShouldBeSmalltalk%0A%09self%20assert%3A%20%27smalltalk/%27%20equals%3A%20zorkPackage%20commitPathSt'),
+messageSends: ["assert:equals:", "commitPathSt"],
+referencedClasses: []
 }),
-smalltalk.ObjectTest);
-
+smalltalk.PackageWithDefaultCommitPathChangedTest);
 
 
-smalltalk.addClass('SymbolTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testEquality'),
+unescape('_shouldInheritSelectors'),
 smalltalk.method({
-selector: unescape('testEquality'),
-category: 'tests',
+selector: unescape('shouldInheritSelectors'),
+category: 'accessing',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.symbolFor("hello")])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.symbolFor("world")])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", []), "__eq", [smalltalk.symbolFor("hello")])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", ["hello"])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("hello", "__eq", [smalltalk.symbolFor("hello")])]);
+return false;
 return self;},
 args: [],
-source: unescape('testEquality%0A%09self%20assert%3A%20%23hello%20%3D%20%23hello.%0A%09self%20deny%3A%20%23hello%20%3D%20%23world.%0A%0A%09self%20assert%3A%20%23hello%20%20%3D%20%23hello%20yourself.%0A%09self%20assert%3A%20%23hello%20yourself%20%3D%20%23hello.%0A%0A%09self%20deny%3A%20%23hello%20%20%3D%20%27hello%27.%0A%09self%20deny%3A%20%27hello%27%20%3D%20%23hello.'),
-messageSends: ["assert:", unescape("%3D"), "deny:", "yourself"],
+source: unescape('shouldInheritSelectors%0A%09%5E%20false'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.SymbolTest);
+smalltalk.PackageWithDefaultCommitPathChangedTest.klass);
 
+
+smalltalk.addClass('PointTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testAt'),
+unescape('_testAccessing'),
 smalltalk.method({
-selector: unescape('testAt'),
+selector: unescape('testAccessing'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_", [(1)]), "__eq", ["h"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_", [(5)]), "__eq", ["o"])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_ifAbsent_", [(6), (function(){return nil;})]), "__eq", [nil])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)]), "_x", []), (3)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)]), "_y", []), (4)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_new", []), "_x_", [(3)]), "_x", []), (3)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_new", []), "_y_", [(4)]), "_y", []), (4)]);
 return self;},
 args: [],
-source: unescape('testAt%0A%09self%20assert%3A%20%28%23hello%20at%3A%201%29%20%3D%20%27h%27.%0A%09self%20assert%3A%20%28%23hello%20at%3A%205%29%20%3D%20%27o%27.%0A%09self%20assert%3A%20%28%23hello%20at%3A%206%20ifAbsent%3A%20%5Bnil%5D%29%20%3D%20nil'),
-messageSends: ["assert:", unescape("%3D"), "at:", "at:ifAbsent:"],
-referencedClasses: []
+source: unescape('testAccessing%0A%09self%20assert%3A%20%28Point%20x%3A%203%20y%3A%204%29%20x%20equals%3A%203.%0A%09self%20assert%3A%20%28Point%20x%3A%203%20y%3A%204%29%20y%20equals%3A%204.%0A%09self%20assert%3A%20%28Point%20new%20x%3A%203%29%20x%20equals%3A%203.%0A%09self%20assert%3A%20%28Point%20new%20y%3A%204%29%20y%20equals%3A%204'),
+messageSends: ["assert:equals:", "x", "x:y:", "y", "x:", "new", "y:"],
+referencedClasses: ["Point"]
 }),
-smalltalk.SymbolTest);
+smalltalk.PointTest);
 
 smalltalk.addMethod(
-unescape('_testAtPut'),
+unescape('_testArithmetic'),
 smalltalk.method({
-selector: unescape('testAtPut'),
+selector: unescape('testArithmetic'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_at_put_", [(1), "a"]);}), (smalltalk.Error || Error)]);
+smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver *smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__star", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(9), (16)])]);
+smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver +smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__plus", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(6), (8)])]);
+smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver -smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__minus", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(0), (0)])]);
+smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((6), "__at", [(8)])).klass === smalltalk.Number) ? $receiver /smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__slash", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(2), (2)])]);
 return self;},
 args: [],
-source: unescape('testAtPut%0A%09%22Symbol%20instances%20are%20read-only%22%0A%09self%20should%3A%20%5B%27hello%27%20at%3A%201%20put%3A%20%27a%27%5D%20raise%3A%20Error'),
-messageSends: ["should:raise:", "at:put:"],
-referencedClasses: ["Error"]
+source: unescape('testArithmetic%0A%09self%20assert%3A%203@4%20*%20%283@4%20%29%20equals%3A%20%28Point%20x%3A%209%20y%3A%2016%29.%0A%09self%20assert%3A%203@4%20+%20%283@4%20%29%20equals%3A%20%28Point%20x%3A%206%20y%3A%208%29.%0A%09self%20assert%3A%203@4%20-%20%283@4%20%29%20equals%3A%20%28Point%20x%3A%200%20y%3A%200%29.%0A%09self%20assert%3A%206@8%20/%20%283@4%20%29%20equals%3A%20%28Point%20x%3A%202%20y%3A%202%29'),
+messageSends: ["assert:equals:", unescape("*"), unescape("@"), "x:y:", unescape("+"), unescape("-"), unescape("/")],
+referencedClasses: ["Point"]
 }),
-smalltalk.SymbolTest);
+smalltalk.PointTest);
 
 smalltalk.addMethod(
-unescape('_testIdentity'),
+unescape('_testAt'),
 smalltalk.method({
-selector: unescape('testIdentity'),
+selector: unescape('testAt'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.symbolFor("hello")])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.symbolFor("world")])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", []), "__eq", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_asString", []), "_asSymbol", [])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(4)]), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)])]);
 return self;},
 args: [],
-source: unescape('testIdentity%0A%09self%20assert%3A%20%23hello%20%3D%3D%20%23hello.%0A%09self%20deny%3A%20%23hello%20%3D%3D%20%23world.%0A%0A%09self%20assert%3A%20%23hello%20%20%3D%20%23hello%20yourself.%0A%09self%20assert%3A%20%23hello%20yourself%20%3D%20%23hello%20asString%20asSymbol'),
-messageSends: ["assert:", unescape("%3D%3D"), "deny:", unescape("%3D"), "yourself", "asSymbol", "asString"],
-referencedClasses: []
+source: unescape('testAt%0A%09self%20assert%3A%203@4%20equals%3A%20%28Point%20x%3A%203%20y%3A%204%29'),
+messageSends: ["assert:equals:", unescape("@"), "x:y:"],
+referencedClasses: ["Point"]
 }),
-smalltalk.SymbolTest);
+smalltalk.PointTest);
 
 smalltalk.addMethod(
-unescape('_testComparing'),
+unescape('_testEgality'),
 smalltalk.method({
-selector: unescape('testComparing'),
+selector: unescape('testEgality'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >smalltalk.symbolFor("aa") : smalltalk.send($receiver, "__gt", [smalltalk.symbolFor("aa")]))]);
-smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__gt", [smalltalk.symbolFor("ba")]))]);
-smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver <smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt", [smalltalk.symbolFor("ba")]))]);
-smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("bb")).klass === smalltalk.Number) ? $receiver <smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt", [smalltalk.symbolFor("ba")]))]);
-smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >=smalltalk.symbolFor("aa") : smalltalk.send($receiver, "__gt_eq", [smalltalk.symbolFor("aa")]))]);
-smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__gt_eq", [smalltalk.symbolFor("ba")]))]);
-smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver <=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt_eq", [smalltalk.symbolFor("ba")]))]);
-smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("bb")).klass === smalltalk.Number) ? $receiver <=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt_eq", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "__at", [(4)]), "__eq", [smalltalk.send((3), "__at", [(4)])])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send((3), "__at", [(5)]), "__eq", [smalltalk.send((3), "__at", [(6)])])]);
 return self;},
 args: [],
-source: unescape('testComparing%0A%09self%20assert%3A%20%23ab%20%3E%20%23aa.%0A%09self%20deny%3A%20%23ab%20%3E%20%23ba.%0A%0A%09self%20assert%3A%20%23ab%20%3C%20%23ba.%0A%09self%20deny%3A%20%23bb%20%3C%20%23ba.%0A%0A%09self%20assert%3A%20%23ab%20%3E%3D%20%23aa.%0A%09self%20deny%3A%20%23ab%20%3E%3D%20%23ba.%0A%0A%09self%20assert%3A%20%23ab%20%3C%3D%20%23ba.%0A%09self%20deny%3A%20%23bb%20%3C%3D%20%23ba'),
-messageSends: ["assert:", unescape("%3E"), "deny:", unescape("%3C"), unescape("%3E%3D"), unescape("%3C%3D")],
+source: unescape('testEgality%0A%09self%20assert%3A%203@4%20%3D%20%283@4%29.%0A%09self%20deny%3A%203@5%20%3D%20%283@6%29'),
+messageSends: ["assert:", unescape("%3D"), unescape("@"), "deny:"],
 referencedClasses: []
 }),
-smalltalk.SymbolTest);
+smalltalk.PointTest);
 
 smalltalk.addMethod(
-unescape('_testSize'),
+unescape('_testTranslateBy'),
 smalltalk.method({
-selector: unescape('testSize'),
+selector: unescape('testTranslateBy'),
 category: 'tests',
-fn: function () {
+fn: function (){
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("a"), "_size", []), (1)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("aaaaa"), "_size", []), (5)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(4)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((0), "__at", [(1)])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(2)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((0), "__at", [smalltalk.send((1), "_negated", [])])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((5), "__at", [(6)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((2), "__at", [(3)])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send((0), "__at", [(3)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send(smalltalk.send((3), "_negated", []), "__at", [(0)])])]);
 return self;},
 args: [],
-source: unescape('testSize%0A%09self%20assert%3A%20%23a%20size%20equals%3A%201.%0A%09self%20assert%3A%20%23aaaaa%20size%20equals%3A%205'),
-messageSends: ["assert:equals:", "size"],
+source: unescape('testTranslateBy%0A%09self%20assert%3A%203@4%20equals%3A%20%283@3%20translateBy%3A%200@1%29.%0A%09self%20assert%3A%203@2%20equals%3A%20%283@3%20translateBy%3A%200@1%20negated%29.%0A%09self%20assert%3A%205@6%20equals%3A%20%283@3%20translateBy%3A%202@3%29.%0A%09self%20assert%3A%200@3%20equals%3A%20%283@3%20translateBy%3A%203%20negated%20@0%29.'),
+messageSends: ["assert:equals:", unescape("@"), "translateBy:", "negated"],
 referencedClasses: []
 }),
-smalltalk.SymbolTest);
+smalltalk.PointTest);
+
 
+
+smalltalk.addClass('RandomTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testAsString'),
+unescape('_textNext'),
 smalltalk.method({
-selector: unescape('testAsString'),
+selector: unescape('textNext'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("hello"), "_asString", []), "hello"]);
+smalltalk.send((10000), "_timesRepeat_", [(function(){var current=nil;
+var next=nil;
+(next=smalltalk.send(smalltalk.send((smalltalk.Random || Random), "_new", []), "_next", []));smalltalk.send(self, "_assert_", [((($receiver = next).klass === smalltalk.Number) ? $receiver >=(0) : smalltalk.send($receiver, "__gt_eq", [(0)]))]);smalltalk.send(self, "_assert_", [((($receiver = next).klass === smalltalk.Number) ? $receiver <(1) : smalltalk.send($receiver, "__lt", [(1)]))]);smalltalk.send(self, "_deny_", [smalltalk.send(current, "__eq", [next])]);return smalltalk.send(next, "__eq", [current]);})]);
 return self;},
 args: [],
-source: unescape('testAsString%0A%09self%20assert%3A%20%23hello%20asString%20equals%3A%20%27hello%27'),
-messageSends: ["assert:equals:", "asString"],
-referencedClasses: []
+source: unescape('textNext%0A%0A%0910000%20timesRepeat%3A%20%5B%0A%09%09%09%7C%20current%20next%20%7C%20%0A%09%09%09next%20%3A%3D%20Random%20new%20next.%0A%09%09%09self%20assert%3A%20%28next%20%3E%3D%200%29.%0A%09%09%09self%20assert%3A%20%28next%20%3C%201%29.%0A%09%09%09self%20deny%3A%20current%20%3D%20next.%0A%09%09%09next%20%3D%20current%5D'),
+messageSends: ["timesRepeat:", "next", "new", "assert:", unescape("%3E%3D"), unescape("%3C"), "deny:", unescape("%3D")],
+referencedClasses: ["Random"]
 }),
-smalltalk.SymbolTest);
+smalltalk.RandomTest);
 
+
+
+smalltalk.addClass('SetTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testAsSymbol'),
+unescape('_testAddRemove'),
 smalltalk.method({
-selector: unescape('testAsSymbol'),
+selector: unescape('testAddRemove'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_asSymbol", [])])]);
+var set=nil;
+(set=smalltalk.send((smalltalk.Set || Set), "_new", []));
+smalltalk.send(self, "_assert_", [smalltalk.send(set, "_isEmpty", [])]);
+smalltalk.send(set, "_add_", [(3)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(set, "_includes_", [(3)])]);
+smalltalk.send(set, "_add_", [(5)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(set, "_includes_", [(5)])]);
+smalltalk.send(set, "_remove_", [(3)]);
+smalltalk.send(self, "_deny_", [smalltalk.send(set, "_includes_", [(3)])]);
 return self;},
 args: [],
-source: unescape('testAsSymbol%0A%09self%20assert%3A%20%23hello%20%3D%3D%20%23hello%20asSymbol'),
-messageSends: ["assert:", unescape("%3D%3D"), "asSymbol"],
-referencedClasses: []
+source: unescape('testAddRemove%0A%09%7C%20set%20%7C%0A%09set%20%3A%3D%20Set%20new.%0A%09%0A%09self%20assert%3A%20set%20isEmpty.%0A%0A%09set%20add%3A%203.%0A%09self%20assert%3A%20%28set%20includes%3A%203%29.%0A%0A%09set%20add%3A%205.%0A%09self%20assert%3A%20%28set%20includes%3A%205%29.%0A%0A%09set%20remove%3A%203.%0A%09self%20deny%3A%20%28set%20includes%3A%203%29'),
+messageSends: ["new", "assert:", "isEmpty", "add:", "includes:", "remove:", "deny:"],
+referencedClasses: ["Set"]
 }),
-smalltalk.SymbolTest);
+smalltalk.SetTest);
 
 smalltalk.addMethod(
-unescape('_testCopying'),
+unescape('_testAt'),
 smalltalk.method({
-selector: unescape('testCopying'),
+selector: unescape('testAt'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_copy", []), "__eq_eq", [smalltalk.symbolFor("hello")])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_deepCopy", []), "__eq_eq", [smalltalk.symbolFor("hello")])]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_new", []), "_at_put_", [(1), (2)]);}), (smalltalk.Error || Error)]);
 return self;},
 args: [],
-source: unescape('testCopying%0A%09self%20assert%3A%20%23hello%20copy%20%3D%3D%20%23hello.%0A%09self%20assert%3A%20%23hello%20deepCopy%20%3D%3D%20%23hello'),
-messageSends: ["assert:", unescape("%3D%3D"), "copy", "deepCopy"],
-referencedClasses: []
+source: unescape('testAt%0A%09self%20should%3A%20%5BSet%20new%20at%3A%201%20put%3A%202%5D%20raise%3A%20Error'),
+messageSends: ["should:raise:", "at:put:", "new"],
+referencedClasses: ["Set", "Error"]
 }),
-smalltalk.SymbolTest);
+smalltalk.SetTest);
 
 smalltalk.addMethod(
-unescape('_testIsSymbolIsString'),
+unescape('_testSize'),
 smalltalk.method({
-selector: unescape('testIsSymbolIsString'),
+selector: unescape('testSize'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "_isSymbol", [])]);
-smalltalk.send(self, "_deny_", [smalltalk.send("hello", "_isSymbol", [])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "_isString", [])]);
-smalltalk.send(self, "_assert_", [smalltalk.send("hello", "_isString", [])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_new", []), "_size", []), (0)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_withAll_", [[(1), (2), (3), (4)]]), "_size", []), (4)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_withAll_", [[(1), (1), (1), (1)]]), "_size", []), (1)]);
 return self;},
 args: [],
-source: unescape('testIsSymbolIsString%0A%09self%20assert%3A%20%23hello%20isSymbol.%0A%09self%20deny%3A%20%27hello%27%20isSymbol.%0A%09self%20deny%3A%20%23hello%20isString.%0A%09self%20assert%3A%20%27hello%27%20isString'),
-messageSends: ["assert:", "isSymbol", "deny:", "isString"],
-referencedClasses: []
+source: unescape('testSize%0A%09self%20assert%3A%20Set%20new%20size%20equals%3A%200.%0A%09self%20assert%3A%20%28Set%20withAll%3A%20%23%281%202%203%204%29%29%20size%20equals%3A%204.%0A%09self%20assert%3A%20%28Set%20withAll%3A%20%23%281%201%201%201%29%29%20size%20equals%3A%201'),
+messageSends: ["assert:equals:", "size", "new", "withAll:"],
+referencedClasses: ["Set"]
 }),
-smalltalk.SymbolTest);
-
-
+smalltalk.SetTest);
 
-smalltalk.addClass('ObjectMock', smalltalk.Object, ['foo', 'bar'], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_foo'),
+unescape('_testUnicity'),
 smalltalk.method({
-selector: unescape('foo'),
-category: 'not yet classified',
+selector: unescape('testUnicity'),
+category: 'tests',
 fn: function () {
 var self=this;
-return self['@foo'];
+var set=nil;
+(set=smalltalk.send((smalltalk.Set || Set), "_new", []));
+smalltalk.send(set, "_add_", [(21)]);
+smalltalk.send(set, "_add_", ["hello"]);
+smalltalk.send(set, "_add_", [(21)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(set, "_size", []), "__eq", [(2)])]);
+smalltalk.send(set, "_add_", ["hello"]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(set, "_size", []), "__eq", [(2)])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(set, "_asArray", []), [(21), "hello"]]);
 return self;},
 args: [],
-source: unescape('foo%0A%09%5Efoo'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.ObjectMock);
-
-smalltalk.addMethod(
-unescape('_foo_'),
-smalltalk.method({
-selector: unescape('foo%3A'),
-category: 'not yet classified',
-fn: function (anObject) {
-var self=this;
-(self['@foo']=anObject);
-return self;},
-args: ["anObject"],
-source: unescape('foo%3A%20anObject%0A%09foo%20%3A%3D%20anObject'),
-messageSends: [],
-referencedClasses: []
+source: unescape('testUnicity%0A%09%7C%20set%20%7C%0A%09set%20%3A%3D%20Set%20new.%0A%09set%20add%3A%2021.%0A%09set%20add%3A%20%27hello%27.%0A%0A%09set%20add%3A%2021.%0A%09self%20assert%3A%20set%20size%20%3D%202.%0A%09%0A%09set%20add%3A%20%27hello%27.%0A%09self%20assert%3A%20set%20size%20%3D%202.%0A%0A%09self%20assert%3A%20set%20asArray%20equals%3A%20%23%2821%20%27hello%27%29'),
+messageSends: ["new", "add:", "assert:", unescape("%3D"), "size", "assert:equals:", "asArray"],
+referencedClasses: ["Set"]
 }),
-smalltalk.ObjectMock);
+smalltalk.SetTest);
 
 
 
-smalltalk.addClass('UndefinedTest', smalltalk.TestCase, [], 'Kernel-Tests');
+smalltalk.addClass('StringTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testIsNil'),
+unescape('_testAddRemove'),
 smalltalk.method({
-selector: unescape('testIsNil'),
+selector: unescape('testAddRemove'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(nil, "_isNil", [])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(nil, "_notNil", [])]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_add_", ["a"]);}), (smalltalk.Error || Error)]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_remove_", ["h"]);}), (smalltalk.Error || Error)]);
 return self;},
 args: [],
-source: unescape('testIsNil%0A%09self%20assert%3A%20nil%20isNil.%0A%09self%20deny%3A%20nil%20notNil.'),
-messageSends: ["assert:", "isNil", "deny:", "notNil"],
-referencedClasses: []
+source: unescape('testAddRemove%0A%09self%20should%3A%20%5B%27hello%27%20add%3A%20%27a%27%5D%20raise%3A%20Error.%0A%09self%20should%3A%20%5B%27hello%27%20remove%3A%20%27h%27%5D%20raise%3A%20Error'),
+messageSends: ["should:raise:", "add:", "remove:"],
+referencedClasses: ["Error"]
 }),
-smalltalk.UndefinedTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testIfNil'),
+unescape('_testAsArray'),
 smalltalk.method({
-selector: unescape('testIfNil'),
+selector: unescape('testAsArray'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [(($receiver = nil) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver, true]);
-smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = nil) != nil && $receiver != undefined) ? (function(){return true;})() : nil, "__eq", [true])]);
-smalltalk.send(self, "_assert_equals_", [(($receiver = nil) == nil || $receiver == undefined) ? (function(){return true;})() : (function(){return false;})(), true]);
-smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = nil) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_asArray", []), "__eq", [["h", "e", "l", "l", "o"]])]);
 return self;},
 args: [],
-source: unescape('testIfNil%0A%09self%20assert%3A%20%28nil%20ifNil%3A%20%5Btrue%5D%29%20equals%3A%20true.%0A%09self%20deny%3A%20%28nil%20ifNotNil%3A%20%5Btrue%5D%29%20%3D%20true.%0A%09self%20assert%3A%20%28nil%20ifNil%3A%20%5Btrue%5D%20ifNotNil%3A%20%5Bfalse%5D%29%20equals%3A%20true.%0A%09self%20deny%3A%20%28nil%20ifNotNil%3A%20%5Btrue%5D%20ifNil%3A%20%5Bfalse%5D%29%20%3D%20true'),
-messageSends: ["assert:equals:", "ifNil:", "deny:", unescape("%3D"), "ifNotNil:", "ifNil:ifNotNil:", "ifNotNil:ifNil:"],
+source: unescape('testAsArray%0A%09self%20assert%3A%20%27hello%27%20asArray%20%3D%20%23%28%27h%27%20%27e%27%20%27l%27%20%27l%27%20%27o%27%29.'),
+messageSends: ["assert:", unescape("%3D"), "asArray"],
 referencedClasses: []
 }),
-smalltalk.UndefinedTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testCopying'),
+unescape('_testAt'),
 smalltalk.method({
-selector: unescape('testCopying'),
+selector: unescape('testAt'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(nil, "_copy", []), nil]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_", [(1)]), "__eq", ["h"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_", [(5)]), "__eq", ["o"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_at_ifAbsent_", [(6), (function(){return nil;})]), "__eq", [nil])]);
 return self;},
 args: [],
-source: unescape('testCopying%0A%09self%20assert%3A%20nil%20copy%20equals%3A%20nil'),
-messageSends: ["assert:equals:", "copy"],
+source: unescape('testAt%0A%09self%20assert%3A%20%28%27hello%27%20at%3A%201%29%20%3D%20%27h%27.%0A%09self%20assert%3A%20%28%27hello%27%20at%3A%205%29%20%3D%20%27o%27.%0A%09self%20assert%3A%20%28%27hello%27%20at%3A%206%20ifAbsent%3A%20%5Bnil%5D%29%20%3D%20nil'),
+messageSends: ["assert:", unescape("%3D"), "at:", "at:ifAbsent:"],
 referencedClasses: []
 }),
-smalltalk.UndefinedTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testDeepCopy'),
+unescape('_testAtPut'),
 smalltalk.method({
-selector: unescape('testDeepCopy'),
+selector: unescape('testAtPut'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(nil, "_deepCopy", []), "__eq", [nil])]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_at_put_", [(1), "a"]);}), (smalltalk.Error || Error)]);
 return self;},
 args: [],
-source: unescape('testDeepCopy%0A%09self%20assert%3A%20nil%20deepCopy%20%3D%20nil'),
-messageSends: ["assert:", unescape("%3D"), "deepCopy"],
-referencedClasses: []
+source: unescape('testAtPut%0A%09%22String%20instances%20are%20read-only%22%0A%09self%20should%3A%20%5B%27hello%27%20at%3A%201%20put%3A%20%27a%27%5D%20raise%3A%20Error'),
+messageSends: ["should:raise:", "at:put:"],
+referencedClasses: ["Error"]
 }),
-smalltalk.UndefinedTest);
-
-
+smalltalk.StringTest);
 
-smalltalk.addClass('PointTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testAccessing'),
+unescape('_testCopyWithoutAll'),
 smalltalk.method({
-selector: unescape('testAccessing'),
+selector: unescape('testCopyWithoutAll'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)]), "_x", []), (3)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)]), "_y", []), (4)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_new", []), "_x_", [(3)]), "_x", []), (3)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Point || Point), "_new", []), "_y_", [(4)]), "_y", []), (4)]);
+smalltalk.send(self, "_assert_equals_", ["hello world", smalltalk.send(unescape("*hello*%20*world*"), "_copyWithoutAll_", [unescape("*")])]);
 return self;},
 args: [],
-source: unescape('testAccessing%0A%09self%20assert%3A%20%28Point%20x%3A%203%20y%3A%204%29%20x%20equals%3A%203.%0A%09self%20assert%3A%20%28Point%20x%3A%203%20y%3A%204%29%20y%20equals%3A%204.%0A%09self%20assert%3A%20%28Point%20new%20x%3A%203%29%20x%20equals%3A%203.%0A%09self%20assert%3A%20%28Point%20new%20y%3A%204%29%20y%20equals%3A%204'),
-messageSends: ["assert:equals:", "x", "x:y:", "y", "x:", "new", "y:"],
-referencedClasses: ["Point"]
+source: unescape('testCopyWithoutAll%0A%09self%20%0A%09%09assert%3A%20%27hello%20world%27%20%0A%09%09equals%3A%20%28%27*hello*%20*world*%27%20copyWithoutAll%3A%20%27*%27%29'),
+messageSends: ["assert:equals:", "copyWithoutAll:"],
+referencedClasses: []
 }),
-smalltalk.PointTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testAt'),
+unescape('_testEquality'),
 smalltalk.method({
-selector: unescape('testAt'),
+selector: unescape('testEquality'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(4)]), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(3), (4)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send("hello", "__eq", ["hello"])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("hello", "__eq", ["world"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send("hello", "__eq", [smalltalk.send("hello", "_yourself", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send("hello", "_yourself", []), "__eq", ["hello"])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("", "__eq", [(0)])]);
 return self;},
 args: [],
-source: unescape('testAt%0A%09self%20assert%3A%203@4%20equals%3A%20%28Point%20x%3A%203%20y%3A%204%29'),
-messageSends: ["assert:equals:", unescape("@"), "x:y:"],
-referencedClasses: ["Point"]
+source: unescape('testEquality%0A%09self%20assert%3A%20%27hello%27%20%3D%20%27hello%27.%0A%09self%20deny%3A%20%27hello%27%20%3D%20%27world%27.%0A%0A%09self%20assert%3A%20%27hello%27%20%20%3D%20%27hello%27%20yourself.%0A%09self%20assert%3A%20%27hello%27%20yourself%20%3D%20%27hello%27.%0A%0A%09%22test%20JS%20falsy%20value%22%0A%09self%20deny%3A%20%27%27%20%3D%200'),
+messageSends: ["assert:", unescape("%3D"), "deny:", "yourself"],
+referencedClasses: []
 }),
-smalltalk.PointTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testEgality'),
+unescape('_testIncludesSubString'),
 smalltalk.method({
-selector: unescape('testEgality'),
+selector: unescape('testIncludesSubString'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((3), "__at", [(4)]), "__eq", [smalltalk.send((3), "__at", [(4)])])]);
-smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send((3), "__at", [(5)]), "__eq", [smalltalk.send((3), "__at", [(6)])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send("amber", "_includesSubString_", ["ber"])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("amber", "_includesSubString_", ["zork"])]);
 return self;},
 args: [],
-source: unescape('testEgality%0A%09self%20assert%3A%203@4%20%3D%20%283@4%29.%0A%09self%20deny%3A%203@5%20%3D%20%283@6%29'),
-messageSends: ["assert:", unescape("%3D"), unescape("@"), "deny:"],
+source: unescape('testIncludesSubString%0A%09self%20assert%3A%20%28%27amber%27%20includesSubString%3A%20%27ber%27%29.%0A%09self%20deny%3A%20%28%27amber%27%20includesSubString%3A%20%27zork%27%29.'),
+messageSends: ["assert:", "includesSubString:", "deny:"],
 referencedClasses: []
 }),
-smalltalk.PointTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testArithmetic'),
+unescape('_testJoin'),
 smalltalk.method({
-selector: unescape('testArithmetic'),
+selector: unescape('testJoin'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver *smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__star", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(9), (16)])]);
-smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver +smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__plus", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(6), (8)])]);
-smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((3), "__at", [(4)])).klass === smalltalk.Number) ? $receiver -smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__minus", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(0), (0)])]);
-smalltalk.send(self, "_assert_equals_", [((($receiver = smalltalk.send((6), "__at", [(8)])).klass === smalltalk.Number) ? $receiver /smalltalk.send((3), "__at", [(4)]) : smalltalk.send($receiver, "__slash", [smalltalk.send((3), "__at", [(4)])])), smalltalk.send((smalltalk.Point || Point), "_x_y_", [(2), (2)])]);
+smalltalk.send(self, "_assert_equals_", [unescape("hello%2Cworld"), smalltalk.send(unescape("%2C"), "_join_", [["hello", "world"]])]);
 return self;},
 args: [],
-source: unescape('testArithmetic%0A%09self%20assert%3A%203@4%20*%20%283@4%20%29%20equals%3A%20%28Point%20x%3A%209%20y%3A%2016%29.%0A%09self%20assert%3A%203@4%20+%20%283@4%20%29%20equals%3A%20%28Point%20x%3A%206%20y%3A%208%29.%0A%09self%20assert%3A%203@4%20-%20%283@4%20%29%20equals%3A%20%28Point%20x%3A%200%20y%3A%200%29.%0A%09self%20assert%3A%206@8%20/%20%283@4%20%29%20equals%3A%20%28Point%20x%3A%202%20y%3A%202%29'),
-messageSends: ["assert:equals:", unescape("*"), unescape("@"), "x:y:", unescape("+"), unescape("-"), unescape("/")],
-referencedClasses: ["Point"]
+source: unescape('testJoin%0A%09self%20assert%3A%20%27hello%2Cworld%27%20equals%3A%20%28%27%2C%27%20join%3A%20%23%28%27hello%27%20%27world%27%29%29'),
+messageSends: ["assert:equals:", "join:"],
+referencedClasses: []
 }),
-smalltalk.PointTest);
+smalltalk.StringTest);
 
 smalltalk.addMethod(
-unescape('_testTranslateBy'),
+unescape('_testSize'),
 smalltalk.method({
-selector: unescape('testTranslateBy'),
+selector: unescape('testSize'),
 category: 'tests',
-fn: function (){
+fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(4)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((0), "__at", [(1)])])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((3), "__at", [(2)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((0), "__at", [smalltalk.send((1), "_negated", [])])])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((5), "__at", [(6)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send((2), "__at", [(3)])])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send((0), "__at", [(3)]), smalltalk.send(smalltalk.send((3), "__at", [(3)]), "_translateBy_", [smalltalk.send(smalltalk.send((3), "_negated", []), "__at", [(0)])])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send("smalltalk", "_size", []), (9)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send("", "_size", []), (0)]);
 return self;},
 args: [],
-source: unescape('testTranslateBy%0A%09self%20assert%3A%203@4%20equals%3A%20%283@3%20translateBy%3A%200@1%29.%0A%09self%20assert%3A%203@2%20equals%3A%20%283@3%20translateBy%3A%200@1%20negated%29.%0A%09self%20assert%3A%205@6%20equals%3A%20%283@3%20translateBy%3A%202@3%29.%0A%09self%20assert%3A%200@3%20equals%3A%20%283@3%20translateBy%3A%203%20negated%20@0%29.'),
-messageSends: ["assert:equals:", unescape("@"), "translateBy:", "negated"],
+source: unescape('testSize%0A%09self%20assert%3A%20%27smalltalk%27%20size%20equals%3A%209.%0A%09self%20assert%3A%20%27%27%20size%20equals%3A%200'),
+messageSends: ["assert:equals:", "size"],
 referencedClasses: []
 }),
-smalltalk.PointTest);
-
-
+smalltalk.StringTest);
 
-smalltalk.addClass('RandomTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_textNext'),
+unescape('_testStreamContents'),
 smalltalk.method({
-selector: unescape('textNext'),
+selector: unescape('testStreamContents'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send((10000), "_timesRepeat_", [(function(){var current=nil;
-var next=nil;
-(next=smalltalk.send(smalltalk.send((smalltalk.Random || Random), "_new", []), "_next", []));smalltalk.send(self, "_assert_", [((($receiver = next).klass === smalltalk.Number) ? $receiver >=(0) : smalltalk.send($receiver, "__gt_eq", [(0)]))]);smalltalk.send(self, "_assert_", [((($receiver = next).klass === smalltalk.Number) ? $receiver <(1) : smalltalk.send($receiver, "__lt", [(1)]))]);smalltalk.send(self, "_deny_", [smalltalk.send(current, "__eq", [next])]);return smalltalk.send(next, "__eq", [current]);})]);
+smalltalk.send(self, "_assert_equals_", ["hello world", smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(aStream){return (function($rec){smalltalk.send($rec, "_nextPutAll_", ["hello"]);smalltalk.send($rec, "_space", []);return smalltalk.send($rec, "_nextPutAll_", ["world"]);})(aStream);})])]);
 return self;},
 args: [],
-source: unescape('textNext%0A%0A%0910000%20timesRepeat%3A%20%5B%0A%09%09%09%7C%20current%20next%20%7C%20%0A%09%09%09next%20%3A%3D%20Random%20new%20next.%0A%09%09%09self%20assert%3A%20%28next%20%3E%3D%200%29.%0A%09%09%09self%20assert%3A%20%28next%20%3C%201%29.%0A%09%09%09self%20deny%3A%20current%20%3D%20next.%0A%09%09%09next%20%3D%20current%5D'),
-messageSends: ["timesRepeat:", "next", "new", "assert:", unescape("%3E%3D"), unescape("%3C"), "deny:", unescape("%3D")],
-referencedClasses: ["Random"]
+source: unescape('testStreamContents%0A%09self%20%0A%09%09assert%3A%20%27hello%20world%27%20%0A%09%09equals%3A%20%28String%20streamContents%3A%20%5B%3AaStream%7C%20aStream%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27hello%27%3B%20space%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27world%27%5D%29'),
+messageSends: ["assert:equals:", "streamContents:", "nextPutAll:", "space"],
+referencedClasses: ["String"]
 }),
-smalltalk.RandomTest);
+smalltalk.StringTest);
 
 
 
-smalltalk.addClass('ClassBuilderTest', smalltalk.TestCase, ['builder', 'theClass'], 'Kernel-Tests');
+smalltalk.addClass('SymbolTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_setUp'),
-smalltalk.method({
-selector: unescape('setUp'),
-category: 'running',
+unescape('_testAsString'),
+smalltalk.method({
+selector: unescape('testAsString'),
+category: 'tests',
 fn: function () {
 var self=this;
-(self['@builder']=smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []));
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("hello"), "_asString", []), "hello"]);
 return self;},
 args: [],
-source: unescape('setUp%0A%09builder%20%3A%3D%20ClassBuilder%20new'),
-messageSends: ["new"],
-referencedClasses: ["ClassBuilder"]
+source: unescape('testAsString%0A%09self%20assert%3A%20%23hello%20asString%20equals%3A%20%27hello%27'),
+messageSends: ["assert:equals:", "asString"],
+referencedClasses: []
 }),
-smalltalk.ClassBuilderTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_tearDown'),
+unescape('_testAsSymbol'),
 smalltalk.method({
-selector: unescape('tearDown'),
-category: 'running',
+selector: unescape('testAsSymbol'),
+category: 'tests',
 fn: function () {
 var self=this;
-(($receiver = self['@theClass']) != nil && $receiver != undefined) ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_removeClass_", [self['@theClass']]);return (self['@theClass']=nil);})() : nil;
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_asSymbol", [])])]);
 return self;},
 args: [],
-source: unescape('tearDown%0A%09theClass%20ifNotNil%3A%20%5BSmalltalk%20current%20removeClass%3A%20theClass.%20theClass%20%3A%3D%20nil%5D'),
-messageSends: ["ifNotNil:", "removeClass:", "current"],
-referencedClasses: ["Smalltalk"]
+source: unescape('testAsSymbol%0A%09self%20assert%3A%20%23hello%20%3D%3D%20%23hello%20asSymbol'),
+messageSends: ["assert:", unescape("%3D%3D"), "asSymbol"],
+referencedClasses: []
 }),
-smalltalk.ClassBuilderTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testClassCopy'),
+unescape('_testAt'),
 smalltalk.method({
-selector: unescape('testClassCopy'),
-category: 'running',
+selector: unescape('testAt'),
+category: 'tests',
 fn: function () {
 var self=this;
-(self['@theClass']=smalltalk.send(self['@builder'], "_copyClass_named_", [(smalltalk.ObjectMock || ObjectMock), "ObjectMock2"]));
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_superclass", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_superclass", [])])]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_instanceVariableNames", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_instanceVariableNames", [])])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(self['@theClass'], "_name", []), "ObjectMock2"]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(self['@theClass'], "_package", []), "__eq_eq", [smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_package", [])])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send(self['@theClass'], "_methodDictionary", []), "_keys", []), smalltalk.send(smalltalk.send((smalltalk.ObjectMock || ObjectMock), "_methodDictionary", []), "_keys", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_", [(1)]), "__eq", ["h"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_", [(5)]), "__eq", ["o"])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_at_ifAbsent_", [(6), (function(){return nil;})]), "__eq", [nil])]);
 return self;},
 args: [],
-source: unescape('testClassCopy%0A%09theClass%20%3A%3D%20builder%20copyClass%3A%20ObjectMock%20named%3A%20%27ObjectMock2%27.%0A%09self%20assert%3A%20theClass%20superclass%20%3D%3D%20ObjectMock%20superclass.%0A%09self%20assert%3A%20theClass%20instanceVariableNames%20%3D%3D%20ObjectMock%20instanceVariableNames.%0A%09self%20assert%3A%20theClass%20name%20equals%3A%20%27ObjectMock2%27.%0A%09self%20assert%3A%20theClass%20package%20%3D%3D%20ObjectMock%20package.%0A%09self%20assert%3A%20theClass%20methodDictionary%20keys%20equals%3A%20ObjectMock%20methodDictionary%20keys'),
-messageSends: ["copyClass:named:", "assert:", unescape("%3D%3D"), "superclass", "instanceVariableNames", "assert:equals:", "name", "package", "keys", "methodDictionary"],
-referencedClasses: ["ObjectMock"]
+source: unescape('testAt%0A%09self%20assert%3A%20%28%23hello%20at%3A%201%29%20%3D%20%27h%27.%0A%09self%20assert%3A%20%28%23hello%20at%3A%205%29%20%3D%20%27o%27.%0A%09self%20assert%3A%20%28%23hello%20at%3A%206%20ifAbsent%3A%20%5Bnil%5D%29%20%3D%20nil'),
+messageSends: ["assert:", unescape("%3D"), "at:", "at:ifAbsent:"],
+referencedClasses: []
 }),
-smalltalk.ClassBuilderTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testInstanceVariableNames'),
+unescape('_testAtPut'),
 smalltalk.method({
-selector: unescape('testInstanceVariableNames'),
-category: 'running',
+selector: unescape('testAtPut'),
+category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(self['@builder'], "_instanceVariableNamesFor_", ["  hello   world   "]), ["hello", "world"]]);
+smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send("hello", "_at_put_", [(1), "a"]);}), (smalltalk.Error || Error)]);
 return self;},
 args: [],
-source: unescape('testInstanceVariableNames%0A%09self%20assert%3A%20%28builder%20instanceVariableNamesFor%3A%20%27%20%20hello%20%20%20world%20%20%20%27%29%20equals%3A%20%23%28%27hello%27%20%27world%27%29'),
-messageSends: ["assert:equals:", "instanceVariableNamesFor:"],
-referencedClasses: []
+source: unescape('testAtPut%0A%09%22Symbol%20instances%20are%20read-only%22%0A%09self%20should%3A%20%5B%27hello%27%20at%3A%201%20put%3A%20%27a%27%5D%20raise%3A%20Error'),
+messageSends: ["should:raise:", "at:put:"],
+referencedClasses: ["Error"]
 }),
-smalltalk.ClassBuilderTest);
-
-
+smalltalk.SymbolTest);
 
-smalltalk.addClass('SetTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testUnicity'),
+unescape('_testComparing'),
 smalltalk.method({
-selector: unescape('testUnicity'),
+selector: unescape('testComparing'),
 category: 'tests',
 fn: function () {
 var self=this;
-var set=nil;
-(set=smalltalk.send((smalltalk.Set || Set), "_new", []));
-smalltalk.send(set, "_add_", [(21)]);
-smalltalk.send(set, "_add_", ["hello"]);
-smalltalk.send(set, "_add_", [(21)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(set, "_size", []), "__eq", [(2)])]);
-smalltalk.send(set, "_add_", ["hello"]);
-smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(set, "_size", []), "__eq", [(2)])]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(set, "_asArray", []), [(21), "hello"]]);
+smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >smalltalk.symbolFor("aa") : smalltalk.send($receiver, "__gt", [smalltalk.symbolFor("aa")]))]);
+smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__gt", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver <smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("bb")).klass === smalltalk.Number) ? $receiver <smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >=smalltalk.symbolFor("aa") : smalltalk.send($receiver, "__gt_eq", [smalltalk.symbolFor("aa")]))]);
+smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver >=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__gt_eq", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_assert_", [((($receiver = smalltalk.symbolFor("ab")).klass === smalltalk.Number) ? $receiver <=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt_eq", [smalltalk.symbolFor("ba")]))]);
+smalltalk.send(self, "_deny_", [((($receiver = smalltalk.symbolFor("bb")).klass === smalltalk.Number) ? $receiver <=smalltalk.symbolFor("ba") : smalltalk.send($receiver, "__lt_eq", [smalltalk.symbolFor("ba")]))]);
 return self;},
 args: [],
-source: unescape('testUnicity%0A%09%7C%20set%20%7C%0A%09set%20%3A%3D%20Set%20new.%0A%09set%20add%3A%2021.%0A%09set%20add%3A%20%27hello%27.%0A%0A%09set%20add%3A%2021.%0A%09self%20assert%3A%20set%20size%20%3D%202.%0A%09%0A%09set%20add%3A%20%27hello%27.%0A%09self%20assert%3A%20set%20size%20%3D%202.%0A%0A%09self%20assert%3A%20set%20asArray%20equals%3A%20%23%2821%20%27hello%27%29'),
-messageSends: ["new", "add:", "assert:", unescape("%3D"), "size", "assert:equals:", "asArray"],
-referencedClasses: ["Set"]
+source: unescape('testComparing%0A%09self%20assert%3A%20%23ab%20%3E%20%23aa.%0A%09self%20deny%3A%20%23ab%20%3E%20%23ba.%0A%0A%09self%20assert%3A%20%23ab%20%3C%20%23ba.%0A%09self%20deny%3A%20%23bb%20%3C%20%23ba.%0A%0A%09self%20assert%3A%20%23ab%20%3E%3D%20%23aa.%0A%09self%20deny%3A%20%23ab%20%3E%3D%20%23ba.%0A%0A%09self%20assert%3A%20%23ab%20%3C%3D%20%23ba.%0A%09self%20deny%3A%20%23bb%20%3C%3D%20%23ba'),
+messageSends: ["assert:", unescape("%3E"), "deny:", unescape("%3C"), unescape("%3E%3D"), unescape("%3C%3D")],
+referencedClasses: []
 }),
-smalltalk.SetTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testAt'),
+unescape('_testCopying'),
 smalltalk.method({
-selector: unescape('testAt'),
+selector: unescape('testCopying'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_should_raise_", [(function(){return smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_new", []), "_at_put_", [(1), (2)]);}), (smalltalk.Error || Error)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_copy", []), "__eq_eq", [smalltalk.symbolFor("hello")])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_deepCopy", []), "__eq_eq", [smalltalk.symbolFor("hello")])]);
 return self;},
 args: [],
-source: unescape('testAt%0A%09self%20should%3A%20%5BSet%20new%20at%3A%201%20put%3A%202%5D%20raise%3A%20Error'),
-messageSends: ["should:raise:", "at:put:", "new"],
-referencedClasses: ["Set", "Error"]
+source: unescape('testCopying%0A%09self%20assert%3A%20%23hello%20copy%20%3D%3D%20%23hello.%0A%09self%20assert%3A%20%23hello%20deepCopy%20%3D%3D%20%23hello'),
+messageSends: ["assert:", unescape("%3D%3D"), "copy", "deepCopy"],
+referencedClasses: []
 }),
-smalltalk.SetTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testAddRemove'),
+unescape('_testEquality'),
 smalltalk.method({
-selector: unescape('testAddRemove'),
+selector: unescape('testEquality'),
 category: 'tests',
 fn: function () {
 var self=this;
-var set=nil;
-(set=smalltalk.send((smalltalk.Set || Set), "_new", []));
-smalltalk.send(self, "_assert_", [smalltalk.send(set, "_isEmpty", [])]);
-smalltalk.send(set, "_add_", [(3)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(set, "_includes_", [(3)])]);
-smalltalk.send(set, "_add_", [(5)]);
-smalltalk.send(self, "_assert_", [smalltalk.send(set, "_includes_", [(5)])]);
-smalltalk.send(set, "_remove_", [(3)]);
-smalltalk.send(self, "_deny_", [smalltalk.send(set, "_includes_", [(3)])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.symbolFor("hello")])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.symbolFor("world")])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", []), "__eq", [smalltalk.symbolFor("hello")])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", ["hello"])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("hello", "__eq", [smalltalk.symbolFor("hello")])]);
 return self;},
 args: [],
-source: unescape('testAddRemove%0A%09%7C%20set%20%7C%0A%09set%20%3A%3D%20Set%20new.%0A%09%0A%09self%20assert%3A%20set%20isEmpty.%0A%0A%09set%20add%3A%203.%0A%09self%20assert%3A%20%28set%20includes%3A%203%29.%0A%0A%09set%20add%3A%205.%0A%09self%20assert%3A%20%28set%20includes%3A%205%29.%0A%0A%09set%20remove%3A%203.%0A%09self%20deny%3A%20%28set%20includes%3A%203%29'),
-messageSends: ["new", "assert:", "isEmpty", "add:", "includes:", "remove:", "deny:"],
-referencedClasses: ["Set"]
+source: unescape('testEquality%0A%09self%20assert%3A%20%23hello%20%3D%20%23hello.%0A%09self%20deny%3A%20%23hello%20%3D%20%23world.%0A%0A%09self%20assert%3A%20%23hello%20%20%3D%20%23hello%20yourself.%0A%09self%20assert%3A%20%23hello%20yourself%20%3D%20%23hello.%0A%0A%09self%20deny%3A%20%23hello%20%20%3D%20%27hello%27.%0A%09self%20deny%3A%20%27hello%27%20%3D%20%23hello.'),
+messageSends: ["assert:", unescape("%3D"), "deny:", "yourself"],
+referencedClasses: []
 }),
-smalltalk.SetTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testSize'),
+unescape('_testIdentity'),
 smalltalk.method({
-selector: unescape('testSize'),
+selector: unescape('testIdentity'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_new", []), "_size", []), (0)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_withAll_", [[(1), (2), (3), (4)]]), "_size", []), (4)]);
-smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.send((smalltalk.Set || Set), "_withAll_", [[(1), (1), (1), (1)]]), "_size", []), (1)]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.symbolFor("hello")])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq_eq", [smalltalk.symbolFor("world")])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "__eq", [smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_yourself", []), "__eq", [smalltalk.send(smalltalk.send(smalltalk.symbolFor("hello"), "_asString", []), "_asSymbol", [])])]);
 return self;},
 args: [],
-source: unescape('testSize%0A%09self%20assert%3A%20Set%20new%20size%20equals%3A%200.%0A%09self%20assert%3A%20%28Set%20withAll%3A%20%23%281%202%203%204%29%29%20size%20equals%3A%204.%0A%09self%20assert%3A%20%28Set%20withAll%3A%20%23%281%201%201%201%29%29%20size%20equals%3A%201'),
-messageSends: ["assert:equals:", "size", "new", "withAll:"],
-referencedClasses: ["Set"]
+source: unescape('testIdentity%0A%09self%20assert%3A%20%23hello%20%3D%3D%20%23hello.%0A%09self%20deny%3A%20%23hello%20%3D%3D%20%23world.%0A%0A%09self%20assert%3A%20%23hello%20%20%3D%20%23hello%20yourself.%0A%09self%20assert%3A%20%23hello%20yourself%20%3D%20%23hello%20asString%20asSymbol'),
+messageSends: ["assert:", unescape("%3D%3D"), "deny:", unescape("%3D"), "yourself", "asSymbol", "asString"],
+referencedClasses: []
 }),
-smalltalk.SetTest);
-
-
+smalltalk.SymbolTest);
 
-smalltalk.addClass('PackageWithDefaultCommitPathChangedTest', smalltalk.PackageTest, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_setUp'),
+unescape('_testIsSymbolIsString'),
 smalltalk.method({
-selector: unescape('setUp'),
-category: 'running',
+selector: unescape('testIsSymbolIsString'),
+category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_setUp", [], smalltalk.PackageTest);
-(function($rec){smalltalk.send($rec, "_defaultCommitPathJs_", [unescape("javascripts/")]);return smalltalk.send($rec, "_defaultCommitPathSt_", [unescape("smalltalk/")]);})((smalltalk.Package || Package));
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.symbolFor("hello"), "_isSymbol", [])]);
+smalltalk.send(self, "_deny_", [smalltalk.send("hello", "_isSymbol", [])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.symbolFor("hello"), "_isString", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send("hello", "_isString", [])]);
 return self;},
 args: [],
-source: unescape('setUp%0A%09super%20setUp.%0A%0A%09Package%0A%09%09defaultCommitPathJs%3A%20%27javascripts/%27%3B%0A%09%09defaultCommitPathSt%3A%20%27smalltalk/%27.'),
-messageSends: ["setUp", "defaultCommitPathJs:", "defaultCommitPathSt:"],
-referencedClasses: ["Package"]
+source: unescape('testIsSymbolIsString%0A%09self%20assert%3A%20%23hello%20isSymbol.%0A%09self%20deny%3A%20%27hello%27%20isSymbol.%0A%09self%20deny%3A%20%23hello%20isString.%0A%09self%20assert%3A%20%27hello%27%20isString'),
+messageSends: ["assert:", "isSymbol", "deny:", "isString"],
+referencedClasses: []
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest);
+smalltalk.SymbolTest);
 
 smalltalk.addMethod(
-unescape('_testGrulCommitPathJsShouldBeServerGrulJs'),
+unescape('_testSize'),
 smalltalk.method({
-selector: unescape('testGrulCommitPathJsShouldBeServerGrulJs'),
+selector: unescape('testSize'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("server/grul/js"), smalltalk.send(self['@grulPackage'], "_commitPathJs", [])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("a"), "_size", []), (1)]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(smalltalk.symbolFor("aaaaa"), "_size", []), (5)]);
 return self;},
 args: [],
-source: unescape('testGrulCommitPathJsShouldBeServerGrulJs%0A%09self%20assert%3A%20%27server/grul/js%27%20equals%3A%20grulPackage%20commitPathJs'),
-messageSends: ["assert:equals:", "commitPathJs"],
+source: unescape('testSize%0A%09self%20assert%3A%20%23a%20size%20equals%3A%201.%0A%09self%20assert%3A%20%23aaaaa%20size%20equals%3A%205'),
+messageSends: ["assert:equals:", "size"],
 referencedClasses: []
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest);
+smalltalk.SymbolTest);
+
 
+
+smalltalk.addClass('UndefinedTest', smalltalk.TestCase, [], 'Kernel-Tests');
 smalltalk.addMethod(
-unescape('_testGrulCommitPathStShouldBeGrulSt'),
+unescape('_testCopying'),
 smalltalk.method({
-selector: unescape('testGrulCommitPathStShouldBeGrulSt'),
+selector: unescape('testCopying'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("grul/st"), smalltalk.send(self['@grulPackage'], "_commitPathSt", [])]);
+smalltalk.send(self, "_assert_equals_", [smalltalk.send(nil, "_copy", []), nil]);
 return self;},
 args: [],
-source: unescape('testGrulCommitPathStShouldBeGrulSt%0A%09self%20assert%3A%20%27grul/st%27%20equals%3A%20grulPackage%20commitPathSt'),
-messageSends: ["assert:equals:", "commitPathSt"],
+source: unescape('testCopying%0A%09self%20assert%3A%20nil%20copy%20equals%3A%20nil'),
+messageSends: ["assert:equals:", "copy"],
 referencedClasses: []
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest);
+smalltalk.UndefinedTest);
 
 smalltalk.addMethod(
-unescape('_testZorkCommitPathJsShouldBeJavascript'),
+unescape('_testDeepCopy'),
 smalltalk.method({
-selector: unescape('testZorkCommitPathJsShouldBeJavascript'),
+selector: unescape('testDeepCopy'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("javascripts/"), smalltalk.send(self['@zorkPackage'], "_commitPathJs", [])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(nil, "_deepCopy", []), "__eq", [nil])]);
 return self;},
 args: [],
-source: unescape('testZorkCommitPathJsShouldBeJavascript%0A%09self%20assert%3A%20%27javascripts/%27%20equals%3A%20zorkPackage%20commitPathJs'),
-messageSends: ["assert:equals:", "commitPathJs"],
+source: unescape('testDeepCopy%0A%09self%20assert%3A%20nil%20deepCopy%20%3D%20nil'),
+messageSends: ["assert:", unescape("%3D"), "deepCopy"],
 referencedClasses: []
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest);
+smalltalk.UndefinedTest);
 
 smalltalk.addMethod(
-unescape('_testZorkCommitPathStShouldBeSmalltalk'),
+unescape('_testIfNil'),
 smalltalk.method({
-selector: unescape('testZorkCommitPathStShouldBeSmalltalk'),
+selector: unescape('testIfNil'),
 category: 'tests',
 fn: function () {
 var self=this;
-smalltalk.send(self, "_assert_equals_", [unescape("smalltalk/"), smalltalk.send(self['@zorkPackage'], "_commitPathSt", [])]);
+smalltalk.send(self, "_assert_equals_", [(($receiver = nil) == nil || $receiver == undefined) ? (function(){return true;})() : $receiver, true]);
+smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = nil) != nil && $receiver != undefined) ? (function(){return true;})() : nil, "__eq", [true])]);
+smalltalk.send(self, "_assert_equals_", [(($receiver = nil) == nil || $receiver == undefined) ? (function(){return true;})() : (function(){return false;})(), true]);
+smalltalk.send(self, "_deny_", [smalltalk.send((($receiver = nil) == nil || $receiver == undefined) ? (function(){return false;})() : (function(){return true;})(), "__eq", [true])]);
 return self;},
 args: [],
-source: unescape('testZorkCommitPathStShouldBeSmalltalk%0A%09self%20assert%3A%20%27smalltalk/%27%20equals%3A%20zorkPackage%20commitPathSt'),
-messageSends: ["assert:equals:", "commitPathSt"],
+source: unescape('testIfNil%0A%09self%20assert%3A%20%28nil%20ifNil%3A%20%5Btrue%5D%29%20equals%3A%20true.%0A%09self%20deny%3A%20%28nil%20ifNotNil%3A%20%5Btrue%5D%29%20%3D%20true.%0A%09self%20assert%3A%20%28nil%20ifNil%3A%20%5Btrue%5D%20ifNotNil%3A%20%5Bfalse%5D%29%20equals%3A%20true.%0A%09self%20deny%3A%20%28nil%20ifNotNil%3A%20%5Btrue%5D%20ifNil%3A%20%5Bfalse%5D%29%20%3D%20true'),
+messageSends: ["assert:equals:", "ifNil:", "deny:", unescape("%3D"), "ifNotNil:", "ifNil:ifNotNil:", "ifNotNil:ifNil:"],
 referencedClasses: []
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest);
-
+smalltalk.UndefinedTest);
 
 smalltalk.addMethod(
-unescape('_shouldInheritSelectors'),
+unescape('_testIsNil'),
 smalltalk.method({
-selector: unescape('shouldInheritSelectors'),
-category: 'accessing',
+selector: unescape('testIsNil'),
+category: 'tests',
 fn: function () {
 var self=this;
-return false;
+smalltalk.send(self, "_assert_", [smalltalk.send(nil, "_isNil", [])]);
+smalltalk.send(self, "_deny_", [smalltalk.send(nil, "_notNil", [])]);
 return self;},
 args: [],
-source: unescape('shouldInheritSelectors%0A%09%5E%20false'),
-messageSends: [],
+source: unescape('testIsNil%0A%09self%20assert%3A%20nil%20isNil.%0A%09self%20deny%3A%20nil%20notNil.'),
+messageSends: ["assert:", "isNil", "deny:", "notNil"],
 referencedClasses: []
 }),
-smalltalk.PackageWithDefaultCommitPathChangedTest.klass);
+smalltalk.UndefinedTest);
+
 
 
diff --git a/amber/src/js/Kernel-Transcript.deploy.js b/amber/src/js/Kernel-Transcript.deploy.js
index 1d27f9ccfdc..fc45e45aceb 100644
--- a/amber/src/js/Kernel-Transcript.deploy.js
+++ b/amber/src/js/Kernel-Transcript.deploy.js
@@ -1,66 +1,71 @@
 smalltalk.addPackage('Kernel-Transcript', {});
-smalltalk.addClass('Transcript', smalltalk.Object, ['textarea'], 'Kernel-Transcript');
-
-smalltalk.Transcript.klass.iVarNames = ['current'];
+smalltalk.addClass('ConsoleTranscript', smalltalk.Object, ['textarea'], 'Kernel-Transcript');
 smalltalk.addMethod(
-'_open',
+unescape('_clear'),
 smalltalk.method({
-selector: 'open',
+selector: unescape('clear'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_current", []), "_open", []);
+
 return self;}
 }),
-smalltalk.Transcript.klass);
+smalltalk.ConsoleTranscript);
 
 smalltalk.addMethod(
-'_new',
+unescape('_cr'),
 smalltalk.method({
-selector: 'new',
+selector: unescape('cr'),
 fn: function (){
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+
 return self;}
 }),
-smalltalk.Transcript.klass);
+smalltalk.ConsoleTranscript);
 
 smalltalk.addMethod(
-'_current',
+unescape('_open'),
 smalltalk.method({
-selector: 'current',
+selector: unescape('open'),
 fn: function (){
 var self=this;
-return self['@current'];
+
 return self;}
 }),
-smalltalk.Transcript.klass);
+smalltalk.ConsoleTranscript);
 
 smalltalk.addMethod(
-'_show_',
+unescape('_show_'),
 smalltalk.method({
-selector: 'show:',
+selector: unescape('show%3A'),
 fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_current", []), "_show_", [anObject]);
+var string=nil;
+(string=smalltalk.send(anObject, "_asString", []));
+console.log(String(string));
 return self;}
 }),
-smalltalk.Transcript.klass);
+smalltalk.ConsoleTranscript);
+
 
 smalltalk.addMethod(
-'_cr',
+unescape('_initialize'),
 smalltalk.method({
-selector: 'cr',
+selector: unescape('initialize'),
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_current", []), "_show_", [smalltalk.send((smalltalk.String || String), "_cr", [])]);
+smalltalk.send((smalltalk.Transcript || Transcript), "_register_", [smalltalk.send(self, "_new", [])]);
 return self;}
 }),
-smalltalk.Transcript.klass);
+smalltalk.ConsoleTranscript.klass);
+
+
+smalltalk.addClass('Transcript', smalltalk.Object, ['textarea'], 'Kernel-Transcript');
 
+smalltalk.Transcript.klass.iVarNames = ['current'];
 smalltalk.addMethod(
-'_clear',
+unescape('_clear'),
 smalltalk.method({
-selector: 'clear',
+selector: unescape('clear'),
 fn: function (){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_current", []), "_clear", []);
@@ -69,74 +74,69 @@ return self;}
 smalltalk.Transcript.klass);
 
 smalltalk.addMethod(
-'_register_',
+unescape('_cr'),
 smalltalk.method({
-selector: 'register:',
-fn: function (aTranscript){
+selector: unescape('cr'),
+fn: function (){
 var self=this;
-(self['@current']=aTranscript);
+smalltalk.send(smalltalk.send(self, "_current", []), "_show_", [smalltalk.send((smalltalk.String || String), "_cr", [])]);
 return self;}
 }),
 smalltalk.Transcript.klass);
 
-
-smalltalk.addClass('ConsoleTranscript', smalltalk.Object, ['textarea'], 'Kernel-Transcript');
 smalltalk.addMethod(
-'_clear',
+unescape('_current'),
 smalltalk.method({
-selector: 'clear',
+selector: unescape('current'),
 fn: function (){
 var self=this;
-
+return self['@current'];
 return self;}
 }),
-smalltalk.ConsoleTranscript);
+smalltalk.Transcript.klass);
 
 smalltalk.addMethod(
-'_cr',
+unescape('_new'),
 smalltalk.method({
-selector: 'cr',
+selector: unescape('new'),
 fn: function (){
 var self=this;
-
+smalltalk.send(self, "_shouldNotImplement", []);
 return self;}
 }),
-smalltalk.ConsoleTranscript);
+smalltalk.Transcript.klass);
 
 smalltalk.addMethod(
-'_show_',
+unescape('_open'),
 smalltalk.method({
-selector: 'show:',
-fn: function (anObject){
+selector: unescape('open'),
+fn: function (){
 var self=this;
-var string=nil;
-(string=smalltalk.send(anObject, "_asString", []));
-console.log(String(string));
+smalltalk.send(smalltalk.send(self, "_current", []), "_open", []);
 return self;}
 }),
-smalltalk.ConsoleTranscript);
+smalltalk.Transcript.klass);
 
 smalltalk.addMethod(
-'_open',
+unescape('_register_'),
 smalltalk.method({
-selector: 'open',
-fn: function (){
+selector: unescape('register%3A'),
+fn: function (aTranscript){
 var self=this;
-
+(self['@current']=aTranscript);
 return self;}
 }),
-smalltalk.ConsoleTranscript);
-
+smalltalk.Transcript.klass);
 
 smalltalk.addMethod(
-'_initialize',
+unescape('_show_'),
 smalltalk.method({
-selector: 'initialize',
-fn: function (){
+selector: unescape('show%3A'),
+fn: function (anObject){
 var self=this;
-smalltalk.send((smalltalk.Transcript || Transcript), "_register_", [smalltalk.send(self, "_new", [])]);
+smalltalk.send(smalltalk.send(self, "_current", []), "_show_", [anObject]);
 return self;}
 }),
-smalltalk.ConsoleTranscript.klass);
+smalltalk.Transcript.klass);
 
 
diff --git a/amber/src/js/Kernel-Transcript.js b/amber/src/js/Kernel-Transcript.js
index 70b48dcb9f9..547c2fa71ac 100644
--- a/amber/src/js/Kernel-Transcript.js
+++ b/amber/src/js/Kernel-Transcript.js
@@ -1,54 +1,52 @@
 smalltalk.addPackage('Kernel-Transcript', {});
-smalltalk.addClass('Transcript', smalltalk.Object, ['textarea'], 'Kernel-Transcript');
-
-smalltalk.Transcript.klass.iVarNames = ['current'];
+smalltalk.addClass('ConsoleTranscript', smalltalk.Object, ['textarea'], 'Kernel-Transcript');
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_clear'),
 smalltalk.method({
-selector: unescape('open'),
-category: 'instance creation',
+selector: unescape('clear'),
+category: 'printing',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_current", []), "_open", []);
+
 return self;},
 args: [],
-source: unescape('open%0A%20%20%20%20self%20current%20open'),
-messageSends: ["open", "current"],
+source: unescape('clear%0A%09%22no%20op%22'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Transcript.klass);
+smalltalk.ConsoleTranscript);
 
 smalltalk.addMethod(
-unescape('_new'),
+unescape('_cr'),
 smalltalk.method({
-selector: unescape('new'),
-category: 'instance creation',
+selector: unescape('cr'),
+category: 'printing',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_shouldNotImplement", []);
+
 return self;},
 args: [],
-source: unescape('new%0A%20%20%20%20self%20shouldNotImplement'),
-messageSends: ["shouldNotImplement"],
+source: unescape('cr%0A%09%22no%20op%22'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Transcript.klass);
+smalltalk.ConsoleTranscript);
 
 smalltalk.addMethod(
-unescape('_current'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('current'),
-category: 'instance creation',
+selector: unescape('open'),
+category: 'actions',
 fn: function (){
 var self=this;
-return self['@current'];
+
 return self;},
 args: [],
-source: unescape('current%0A%20%20%20%20%5Ecurrent'),
+source: unescape('open'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Transcript.klass);
+smalltalk.ConsoleTranscript);
 
 smalltalk.addMethod(
 unescape('_show_'),
@@ -57,31 +55,38 @@ selector: unescape('show%3A'),
 category: 'printing',
 fn: function (anObject){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_current", []), "_show_", [anObject]);
+var string=nil;
+(string=smalltalk.send(anObject, "_asString", []));
+console.log(String(string));
 return self;},
 args: ["anObject"],
-source: unescape('show%3A%20anObject%0A%20%20%20%20self%20current%20show%3A%20anObject'),
-messageSends: ["show:", "current"],
+source: unescape('show%3A%20anObject%0A%09%7C%20string%20%7C%0A%09string%20%3A%3D%20anObject%20asString.%0A%09%3Cconsole.log%28String%28string%29%29%3E'),
+messageSends: ["asString"],
 referencedClasses: []
 }),
-smalltalk.Transcript.klass);
+smalltalk.ConsoleTranscript);
+
 
 smalltalk.addMethod(
-unescape('_cr'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('cr'),
-category: 'printing',
+selector: unescape('initialize'),
+category: 'initialization',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_current", []), "_show_", [smalltalk.send((smalltalk.String || String), "_cr", [])]);
+smalltalk.send((smalltalk.Transcript || Transcript), "_register_", [smalltalk.send(self, "_new", [])]);
 return self;},
 args: [],
-source: unescape('cr%0A%20%20%20%20self%20current%20show%3A%20String%20cr'),
-messageSends: ["show:", "current", "cr"],
-referencedClasses: ["String"]
+source: unescape('initialize%0A%09Transcript%20register%3A%20self%20new'),
+messageSends: ["register:", "new"],
+referencedClasses: ["Transcript"]
 }),
-smalltalk.Transcript.klass);
+smalltalk.ConsoleTranscript.klass);
+
 
+smalltalk.addClass('Transcript', smalltalk.Object, ['textarea'], 'Kernel-Transcript');
+
+smalltalk.Transcript.klass.iVarNames = ['current'];
 smalltalk.addMethod(
 unescape('_clear'),
 smalltalk.method({
@@ -99,104 +104,99 @@ referencedClasses: []
 smalltalk.Transcript.klass);
 
 smalltalk.addMethod(
-unescape('_register_'),
+unescape('_cr'),
 smalltalk.method({
-selector: unescape('register%3A'),
-category: 'instance creation',
-fn: function (aTranscript){
+selector: unescape('cr'),
+category: 'printing',
+fn: function (){
 var self=this;
-(self['@current']=aTranscript);
+smalltalk.send(smalltalk.send(self, "_current", []), "_show_", [smalltalk.send((smalltalk.String || String), "_cr", [])]);
 return self;},
-args: ["aTranscript"],
-source: unescape('register%3A%20aTranscript%0A%09current%20%3A%3D%20aTranscript'),
-messageSends: [],
-referencedClasses: []
+args: [],
+source: unescape('cr%0A%20%20%20%20self%20current%20show%3A%20String%20cr'),
+messageSends: ["show:", "current", "cr"],
+referencedClasses: ["String"]
 }),
 smalltalk.Transcript.klass);
 
-
-smalltalk.addClass('ConsoleTranscript', smalltalk.Object, ['textarea'], 'Kernel-Transcript');
 smalltalk.addMethod(
-unescape('_clear'),
+unescape('_current'),
 smalltalk.method({
-selector: unescape('clear'),
-category: 'printing',
+selector: unescape('current'),
+category: 'instance creation',
 fn: function (){
 var self=this;
-
+return self['@current'];
 return self;},
 args: [],
-source: unescape('clear%0A%09%22no%20op%22'),
+source: unescape('current%0A%20%20%20%20%5Ecurrent'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ConsoleTranscript);
+smalltalk.Transcript.klass);
 
 smalltalk.addMethod(
-unescape('_cr'),
+unescape('_new'),
 smalltalk.method({
-selector: unescape('cr'),
-category: 'printing',
+selector: unescape('new'),
+category: 'instance creation',
 fn: function (){
 var self=this;
-
+smalltalk.send(self, "_shouldNotImplement", []);
 return self;},
 args: [],
-source: unescape('cr%0A%09%22no%20op%22'),
-messageSends: [],
+source: unescape('new%0A%20%20%20%20self%20shouldNotImplement'),
+messageSends: ["shouldNotImplement"],
 referencedClasses: []
 }),
-smalltalk.ConsoleTranscript);
+smalltalk.Transcript.klass);
 
 smalltalk.addMethod(
-unescape('_show_'),
+unescape('_open'),
 smalltalk.method({
-selector: unescape('show%3A'),
-category: 'printing',
-fn: function (anObject){
+selector: unescape('open'),
+category: 'instance creation',
+fn: function (){
 var self=this;
-var string=nil;
-(string=smalltalk.send(anObject, "_asString", []));
-console.log(String(string));
+smalltalk.send(smalltalk.send(self, "_current", []), "_open", []);
 return self;},
-args: ["anObject"],
-source: unescape('show%3A%20anObject%0A%09%7C%20string%20%7C%0A%09string%20%3A%3D%20anObject%20asString.%0A%09%3Cconsole.log%28String%28string%29%29%3E'),
-messageSends: ["asString"],
+args: [],
+source: unescape('open%0A%20%20%20%20self%20current%20open'),
+messageSends: ["open", "current"],
 referencedClasses: []
 }),
-smalltalk.ConsoleTranscript);
+smalltalk.Transcript.klass);
 
 smalltalk.addMethod(
-unescape('_open'),
+unescape('_register_'),
 smalltalk.method({
-selector: unescape('open'),
-category: 'actions',
-fn: function (){
+selector: unescape('register%3A'),
+category: 'instance creation',
+fn: function (aTranscript){
 var self=this;
-
+(self['@current']=aTranscript);
 return self;},
-args: [],
-source: unescape('open'),
+args: ["aTranscript"],
+source: unescape('register%3A%20aTranscript%0A%09current%20%3A%3D%20aTranscript'),
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.ConsoleTranscript);
-
+smalltalk.Transcript.klass);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_show_'),
 smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
-fn: function (){
+selector: unescape('show%3A'),
+category: 'printing',
+fn: function (anObject){
 var self=this;
-smalltalk.send((smalltalk.Transcript || Transcript), "_register_", [smalltalk.send(self, "_new", [])]);
+smalltalk.send(smalltalk.send(self, "_current", []), "_show_", [anObject]);
 return self;},
-args: [],
-source: unescape('initialize%0A%09Transcript%20register%3A%20self%20new'),
-messageSends: ["register:", "new"],
-referencedClasses: ["Transcript"]
+args: ["anObject"],
+source: unescape('show%3A%20anObject%0A%20%20%20%20self%20current%20show%3A%20anObject'),
+messageSends: ["show:", "current"],
+referencedClasses: []
 }),
-smalltalk.ConsoleTranscript.klass);
+smalltalk.Transcript.klass);
 
 
diff --git a/amber/src/js/SUnit.deploy.js b/amber/src/js/SUnit.deploy.js
index 4ad7b6e724d..5b4dde725e6 100644
--- a/amber/src/js/SUnit.deploy.js
+++ b/amber/src/js/SUnit.deploy.js
@@ -1,56 +1,56 @@
 smalltalk.addPackage('SUnit', {});
 smalltalk.addClass('TestCase', smalltalk.Object, ['testSelector'], 'SUnit');
 smalltalk.addMethod(
-unescape('_setTestSelector_'),
+unescape('_assert_'),
 smalltalk.method({
-selector: unescape('setTestSelector%3A'),
-fn: function (aSelector){
+selector: unescape('assert%3A'),
+fn: function (aBoolean){
 var self=this;
-(self['@testSelector']=aSelector);
+smalltalk.send(self, "_assert_description_", [aBoolean, "Assertion failed"]);
 return self;}
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_assert_description_'),
 smalltalk.method({
-selector: unescape('selector'),
-fn: function (){
+selector: unescape('assert%3Adescription%3A'),
+fn: function (aBoolean, aString){
 var self=this;
-return self['@testSelector'];
+((($receiver = aBoolean).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_signalFailure_", [aString]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_signalFailure_", [aString]);})]));
 return self;}
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_signalFailure_'),
+unescape('_assert_equals_'),
 smalltalk.method({
-selector: unescape('signalFailure%3A'),
-fn: function (aString){
+selector: unescape('assert%3Aequals%3A'),
+fn: function (expected, actual){
 var self=this;
-(function($rec){smalltalk.send($rec, "_messageText_", [aString]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send((smalltalk.TestFailure || TestFailure), "_new", []));
+return smalltalk.send(self, "_assert_description_", [smalltalk.send(expected, "__eq", [actual]), smalltalk.send(smalltalk.send(smalltalk.send("Expected: ", "__comma", [smalltalk.send(expected, "_asString", [])]), "__comma", [" but was: "]), "__comma", [smalltalk.send(actual, "_asString", [])])]);
 return self;}
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_setUp'),
+unescape('_deny_'),
 smalltalk.method({
-selector: unescape('setUp'),
-fn: function (){
+selector: unescape('deny%3A'),
+fn: function (aBoolean){
 var self=this;
-
+smalltalk.send(self, "_assert_", [smalltalk.send(aBoolean, "_not", [])]);
 return self;}
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_tearDown'),
+unescape('_performTestFor_'),
 smalltalk.method({
-selector: unescape('tearDown'),
-fn: function (){
+selector: unescape('performTestFor%3A'),
+fn: function (aResult){
 var self=this;
-
+smalltalk.send((function(){return smalltalk.send((function(){return smalltalk.send(self, "_perform_", [smalltalk.send(self, "_selector", [])]);}), "_on_do_", [(smalltalk.TestFailure || TestFailure), (function(ex){return smalltalk.send(aResult, "_addFailure_", [self]);})]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return smalltalk.send(aResult, "_addError_", [self]);})]);
 return self;}
 }),
 smalltalk.TestCase);
@@ -70,101 +70,104 @@ return self;}
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_performTestFor_'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('performTestFor%3A'),
-fn: function (aResult){
+selector: unescape('selector'),
+fn: function (){
 var self=this;
-smalltalk.send((function(){return smalltalk.send((function(){return smalltalk.send(self, "_perform_", [smalltalk.send(self, "_selector", [])]);}), "_on_do_", [(smalltalk.TestFailure || TestFailure), (function(ex){return smalltalk.send(aResult, "_addFailure_", [self]);})]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return smalltalk.send(aResult, "_addError_", [self]);})]);
+return self['@testSelector'];
 return self;}
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_assert_'),
+unescape('_setTestSelector_'),
 smalltalk.method({
-selector: unescape('assert%3A'),
-fn: function (aBoolean){
+selector: unescape('setTestSelector%3A'),
+fn: function (aSelector){
 var self=this;
-smalltalk.send(self, "_assert_description_", [aBoolean, "Assertion failed"]);
+(self['@testSelector']=aSelector);
 return self;}
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_deny_'),
+unescape('_setUp'),
 smalltalk.method({
-selector: unescape('deny%3A'),
-fn: function (aBoolean){
+selector: unescape('setUp'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(aBoolean, "_not", [])]);
+
 return self;}
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_assert_equals_'),
+unescape('_should_'),
 smalltalk.method({
-selector: unescape('assert%3Aequals%3A'),
-fn: function (expected, actual){
+selector: unescape('should%3A'),
+fn: function (aBlock){
 var self=this;
-return smalltalk.send(self, "_assert_description_", [smalltalk.send(expected, "__eq", [actual]), smalltalk.send(smalltalk.send(smalltalk.send("Expected: ", "__comma", [smalltalk.send(expected, "_asString", [])]), "__comma", [" but was: "]), "__comma", [smalltalk.send(actual, "_asString", [])])]);
+smalltalk.send(self, "_assert_", [smalltalk.send(aBlock, "_value", [])]);
 return self;}
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_assert_description_'),
+unescape('_should_raise_'),
 smalltalk.method({
-selector: unescape('assert%3Adescription%3A'),
-fn: function (aBoolean, aString){
+selector: unescape('should%3Araise%3A'),
+fn: function (aBlock, anExceptionClass){
 var self=this;
-((($receiver = aBoolean).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_signalFailure_", [aString]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_signalFailure_", [aString]);})]));
+smalltalk.send(self, "_assert_", [smalltalk.send((function(){smalltalk.send(aBlock, "_value", []);return false;}), "_on_do_", [anExceptionClass, (function(ex){return true;})])]);
 return self;}
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_should_'),
+unescape('_signalFailure_'),
 smalltalk.method({
-selector: unescape('should%3A'),
-fn: function (aBlock){
+selector: unescape('signalFailure%3A'),
+fn: function (aString){
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(aBlock, "_value", [])]);
+(function($rec){smalltalk.send($rec, "_messageText_", [aString]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send((smalltalk.TestFailure || TestFailure), "_new", []));
 return self;}
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_should_raise_'),
+unescape('_tearDown'),
 smalltalk.method({
-selector: unescape('should%3Araise%3A'),
-fn: function (aBlock, anExceptionClass){
+selector: unescape('tearDown'),
+fn: function (){
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send((function(){smalltalk.send(aBlock, "_value", []);return false;}), "_on_do_", [anExceptionClass, (function(ex){return true;})])]);
+
 return self;}
 }),
 smalltalk.TestCase);
 
 
 smalltalk.addMethod(
-unescape('_testSelectors'),
+unescape('_allTestSelectors'),
 smalltalk.method({
-selector: unescape('testSelectors'),
+selector: unescape('allTestSelectors'),
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(self, "_methodDictionary", []), "_keys", []), "_select_", [(function(each){return smalltalk.send(each, "_match_", [unescape("%5Etest")]);})]);
+var selectors=nil;
+(selectors=smalltalk.send(self, "_testSelectors", []));
+((($receiver = smalltalk.send(self, "_shouldInheritSelectors", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(selectors, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allTestSelectors", [])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(selectors, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allTestSelectors", [])]);})]));
+return selectors;
 return self;}
 }),
 smalltalk.TestCase.klass);
 
 smalltalk.addMethod(
-unescape('_selector_'),
+unescape('_buildSuite'),
 smalltalk.method({
-selector: unescape('selector%3A'),
-fn: function (aSelector){
+selector: unescape('buildSuite'),
+fn: function (){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_setTestSelector_", [aSelector]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return smalltalk.send(smalltalk.send(self, "_allTestSelectors", []), "_collect_", [(function(each){return smalltalk.send(self, "_selector_", [each]);})]);
 return self;}
 }),
 smalltalk.TestCase.klass);
@@ -181,37 +184,34 @@ return self;}
 smalltalk.TestCase.klass);
 
 smalltalk.addMethod(
-unescape('_allTestSelectors'),
+unescape('_selector_'),
 smalltalk.method({
-selector: unescape('allTestSelectors'),
-fn: function (){
+selector: unescape('selector%3A'),
+fn: function (aSelector){
 var self=this;
-var selectors=nil;
-(selectors=smalltalk.send(self, "_testSelectors", []));
-((($receiver = smalltalk.send(self, "_shouldInheritSelectors", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(selectors, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allTestSelectors", [])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(selectors, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allTestSelectors", [])]);})]));
-return selectors;
+return (function($rec){smalltalk.send($rec, "_setTestSelector_", [aSelector]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}
 }),
 smalltalk.TestCase.klass);
 
 smalltalk.addMethod(
-unescape('_buildSuite'),
+unescape('_shouldInheritSelectors'),
 smalltalk.method({
-selector: unescape('buildSuite'),
+selector: unescape('shouldInheritSelectors'),
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_allTestSelectors", []), "_collect_", [(function(each){return smalltalk.send(self, "_selector_", [each]);})]);
+return smalltalk.send(self, "_~_eq", [smalltalk.send(self, "_lookupHierarchyRoot", [])]);
 return self;}
 }),
 smalltalk.TestCase.klass);
 
 smalltalk.addMethod(
-unescape('_shouldInheritSelectors'),
+unescape('_testSelectors'),
 smalltalk.method({
-selector: unescape('shouldInheritSelectors'),
+selector: unescape('testSelectors'),
 fn: function (){
 var self=this;
-return smalltalk.send(self, "_~_eq", [smalltalk.send(self, "_lookupHierarchyRoot", [])]);
+return smalltalk.send(smalltalk.send(smalltalk.send(self, "_methodDictionary", []), "_keys", []), "_select_", [(function(each){return smalltalk.send(each, "_match_", [unescape("%5Etest")]);})]);
 return self;}
 }),
 smalltalk.TestCase.klass);
@@ -222,127 +222,127 @@ smalltalk.addClass('TestFailure', smalltalk.Error, [], 'SUnit');
 
 smalltalk.addClass('TestResult', smalltalk.Object, ['timestamp', 'runs', 'errors', 'failures', 'total'], 'SUnit');
 smalltalk.addMethod(
-unescape('_timestamp'),
+unescape('_addError_'),
 smalltalk.method({
-selector: unescape('timestamp'),
-fn: function (){
+selector: unescape('addError%3A'),
+fn: function (anError){
 var self=this;
-return self['@timestamp'];
+smalltalk.send(smalltalk.send(self, "_errors", []), "_add_", [anError]);
 return self;}
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_errors'),
+unescape('_addFailure_'),
 smalltalk.method({
-selector: unescape('errors'),
-fn: function (){
+selector: unescape('addFailure%3A'),
+fn: function (aFailure){
 var self=this;
-return self['@errors'];
+smalltalk.send(smalltalk.send(self, "_failures", []), "_add_", [aFailure]);
 return self;}
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_failures'),
+unescape('_errors'),
 smalltalk.method({
-selector: unescape('failures'),
+selector: unescape('errors'),
 fn: function (){
 var self=this;
-return self['@failures'];
+return self['@errors'];
 return self;}
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_total'),
+unescape('_failures'),
 smalltalk.method({
-selector: unescape('total'),
+selector: unescape('failures'),
 fn: function (){
 var self=this;
-return self['@total'];
+return self['@failures'];
 return self;}
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_total_'),
+unescape('_increaseRuns'),
 smalltalk.method({
-selector: unescape('total%3A'),
-fn: function (aNumber){
+selector: unescape('increaseRuns'),
+fn: function (){
 var self=this;
-(self['@total']=aNumber);
+(self['@runs']=((($receiver = self['@runs']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
 return self;}
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_addError_'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('addError%3A'),
-fn: function (anError){
+selector: unescape('initialize'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_errors", []), "_add_", [anError]);
+smalltalk.send(self, "_initialize", [], smalltalk.Object);
+(self['@timestamp']=smalltalk.send((smalltalk.Date || Date), "_now", []));
+(self['@runs']=(0));
+(self['@errors']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+(self['@failures']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+(self['@total']=(0));
 return self;}
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_addFailure_'),
+unescape('_runs'),
 smalltalk.method({
-selector: unescape('addFailure%3A'),
-fn: function (aFailure){
+selector: unescape('runs'),
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_failures", []), "_add_", [aFailure]);
+return self['@runs'];
 return self;}
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_runs'),
+unescape('_status'),
 smalltalk.method({
-selector: unescape('runs'),
+selector: unescape('status'),
 fn: function (){
 var self=this;
-return self['@runs'];
+return ((($receiver = smalltalk.send(smalltalk.send(self, "_errors", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_failures", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "success";})() : (function(){return "failure";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "success";}), (function(){return "failure";})]));})() : (function(){return "error";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_failures", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "success";})() : (function(){return "failure";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "success";}), (function(){return "failure";})]));}), (function(){return "error";})]));
 return self;}
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_increaseRuns'),
+unescape('_timestamp'),
 smalltalk.method({
-selector: unescape('increaseRuns'),
+selector: unescape('timestamp'),
 fn: function (){
 var self=this;
-(self['@runs']=((($receiver = self['@runs']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
+return self['@timestamp'];
 return self;}
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_status'),
+unescape('_total'),
 smalltalk.method({
-selector: unescape('status'),
+selector: unescape('total'),
 fn: function (){
 var self=this;
-return ((($receiver = smalltalk.send(smalltalk.send(self, "_errors", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_failures", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "success";})() : (function(){return "failure";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "success";}), (function(){return "failure";})]));})() : (function(){return "error";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_failures", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "success";})() : (function(){return "failure";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "success";}), (function(){return "failure";})]));}), (function(){return "error";})]));
+return self['@total'];
 return self;}
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_initialize'),
+unescape('_total_'),
 smalltalk.method({
-selector: unescape('initialize'),
-fn: function (){
+selector: unescape('total%3A'),
+fn: function (aNumber){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Object);
-(self['@timestamp']=smalltalk.send((smalltalk.Date || Date), "_now", []));
-(self['@runs']=(0));
-(self['@errors']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-(self['@failures']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-(self['@total']=(0));
+(self['@total']=aNumber);
 return self;}
 }),
 smalltalk.TestResult);
diff --git a/amber/src/js/SUnit.js b/amber/src/js/SUnit.js
index 401c376bd81..a89b48fe7e2 100755
--- a/amber/src/js/SUnit.js
+++ b/amber/src/js/SUnit.js
@@ -1,82 +1,82 @@
 smalltalk.addPackage('SUnit', {});
 smalltalk.addClass('TestCase', smalltalk.Object, ['testSelector'], 'SUnit');
 smalltalk.addMethod(
-unescape('_setTestSelector_'),
+unescape('_assert_'),
 smalltalk.method({
-selector: unescape('setTestSelector%3A'),
-category: 'accessing',
-fn: function (aSelector){
+selector: unescape('assert%3A'),
+category: 'testing',
+fn: function (aBoolean){
 var self=this;
-(self['@testSelector']=aSelector);
+smalltalk.send(self, "_assert_description_", [aBoolean, "Assertion failed"]);
 return self;},
-args: ["aSelector"],
-source: unescape('setTestSelector%3A%20aSelector%0A%09testSelector%20%3A%3D%20aSelector'),
-messageSends: [],
+args: ["aBoolean"],
+source: unescape('assert%3A%20aBoolean%0A%09self%20assert%3A%20aBoolean%20description%3A%20%27Assertion%20failed%27'),
+messageSends: ["assert:description:"],
 referencedClasses: []
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_assert_description_'),
 smalltalk.method({
-selector: unescape('selector'),
-category: 'accessing',
-fn: function (){
+selector: unescape('assert%3Adescription%3A'),
+category: 'testing',
+fn: function (aBoolean, aString){
 var self=this;
-return self['@testSelector'];
+((($receiver = aBoolean).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_signalFailure_", [aString]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_signalFailure_", [aString]);})]));
 return self;},
-args: [],
-source: unescape('selector%0A%09%5EtestSelector'),
-messageSends: [],
+args: ["aBoolean", "aString"],
+source: unescape('assert%3A%20aBoolean%20description%3A%20aString%0A%09aBoolean%20ifFalse%3A%20%5Bself%20signalFailure%3A%20aString%5D'),
+messageSends: ["ifFalse:", "signalFailure:"],
 referencedClasses: []
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_signalFailure_'),
+unescape('_assert_equals_'),
 smalltalk.method({
-selector: unescape('signalFailure%3A'),
-category: 'private',
-fn: function (aString){
+selector: unescape('assert%3Aequals%3A'),
+category: 'testing',
+fn: function (expected, actual){
 var self=this;
-(function($rec){smalltalk.send($rec, "_messageText_", [aString]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send((smalltalk.TestFailure || TestFailure), "_new", []));
+return smalltalk.send(self, "_assert_description_", [smalltalk.send(expected, "__eq", [actual]), smalltalk.send(smalltalk.send(smalltalk.send("Expected: ", "__comma", [smalltalk.send(expected, "_asString", [])]), "__comma", [" but was: "]), "__comma", [smalltalk.send(actual, "_asString", [])])]);
 return self;},
-args: ["aString"],
-source: unescape('signalFailure%3A%20aString%0A%09TestFailure%20new%0A%09%09messageText%3A%20aString%3B%0A%09%09signal'),
-messageSends: ["messageText:", "signal", "new"],
-referencedClasses: ["TestFailure"]
+args: ["expected", "actual"],
+source: unescape('assert%3A%20expected%20equals%3A%20actual%0A%09%5E%20self%20assert%3A%20%28expected%20%3D%20actual%29%20description%3A%20%27Expected%3A%20%27%2C%20expected%20asString%2C%20%27%20but%20was%3A%20%27%2C%20actual%20asString'),
+messageSends: ["assert:description:", unescape("%3D"), unescape("%2C"), "asString"],
+referencedClasses: []
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_setUp'),
+unescape('_deny_'),
 smalltalk.method({
-selector: unescape('setUp'),
-category: 'running',
-fn: function (){
+selector: unescape('deny%3A'),
+category: 'testing',
+fn: function (aBoolean){
 var self=this;
-
+smalltalk.send(self, "_assert_", [smalltalk.send(aBoolean, "_not", [])]);
 return self;},
-args: [],
-source: unescape('setUp'),
-messageSends: [],
+args: ["aBoolean"],
+source: unescape('deny%3A%20aBoolean%0A%09self%20assert%3A%20aBoolean%20not'),
+messageSends: ["assert:", "not"],
 referencedClasses: []
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_tearDown'),
+unescape('_performTestFor_'),
 smalltalk.method({
-selector: unescape('tearDown'),
+selector: unescape('performTestFor%3A'),
 category: 'running',
-fn: function (){
+fn: function (aResult){
 var self=this;
-
+smalltalk.send((function(){return smalltalk.send((function(){return smalltalk.send(self, "_perform_", [smalltalk.send(self, "_selector", [])]);}), "_on_do_", [(smalltalk.TestFailure || TestFailure), (function(ex){return smalltalk.send(aResult, "_addFailure_", [self]);})]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return smalltalk.send(aResult, "_addError_", [self]);})]);
 return self;},
-args: [],
-source: unescape('tearDown'),
-messageSends: [],
-referencedClasses: []
+args: ["aResult"],
+source: unescape('performTestFor%3A%20aResult%0A%09%5B%5Bself%20perform%3A%20self%20selector%5D%0A%09%09on%3A%20TestFailure%20do%3A%20%5B%3Aex%20%7C%20aResult%20addFailure%3A%20self%5D%5D%0A%09%09on%3A%20Error%20do%3A%20%5B%3Aex%20%7C%20aResult%20addError%3A%20self%5D'),
+messageSends: ["on:do:", "perform:", "selector", "addFailure:", "addError:"],
+referencedClasses: ["TestFailure", "Error"]
 }),
 smalltalk.TestCase);
 
@@ -100,81 +100,49 @@ referencedClasses: []
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_performTestFor_'),
-smalltalk.method({
-selector: unescape('performTestFor%3A'),
-category: 'running',
-fn: function (aResult){
-var self=this;
-smalltalk.send((function(){return smalltalk.send((function(){return smalltalk.send(self, "_perform_", [smalltalk.send(self, "_selector", [])]);}), "_on_do_", [(smalltalk.TestFailure || TestFailure), (function(ex){return smalltalk.send(aResult, "_addFailure_", [self]);})]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return smalltalk.send(aResult, "_addError_", [self]);})]);
-return self;},
-args: ["aResult"],
-source: unescape('performTestFor%3A%20aResult%0A%09%5B%5Bself%20perform%3A%20self%20selector%5D%0A%09%09on%3A%20TestFailure%20do%3A%20%5B%3Aex%20%7C%20aResult%20addFailure%3A%20self%5D%5D%0A%09%09on%3A%20Error%20do%3A%20%5B%3Aex%20%7C%20aResult%20addError%3A%20self%5D'),
-messageSends: ["on:do:", "perform:", "selector", "addFailure:", "addError:"],
-referencedClasses: ["TestFailure", "Error"]
-}),
-smalltalk.TestCase);
-
-smalltalk.addMethod(
-unescape('_assert_'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('assert%3A'),
-category: 'testing',
-fn: function (aBoolean){
+selector: unescape('selector'),
+category: 'accessing',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_assert_description_", [aBoolean, "Assertion failed"]);
+return self['@testSelector'];
 return self;},
-args: ["aBoolean"],
-source: unescape('assert%3A%20aBoolean%0A%09self%20assert%3A%20aBoolean%20description%3A%20%27Assertion%20failed%27'),
-messageSends: ["assert:description:"],
+args: [],
+source: unescape('selector%0A%09%5EtestSelector'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_deny_'),
+unescape('_setTestSelector_'),
 smalltalk.method({
-selector: unescape('deny%3A'),
-category: 'testing',
-fn: function (aBoolean){
+selector: unescape('setTestSelector%3A'),
+category: 'accessing',
+fn: function (aSelector){
 var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(aBoolean, "_not", [])]);
+(self['@testSelector']=aSelector);
 return self;},
-args: ["aBoolean"],
-source: unescape('deny%3A%20aBoolean%0A%09self%20assert%3A%20aBoolean%20not'),
-messageSends: ["assert:", "not"],
+args: ["aSelector"],
+source: unescape('setTestSelector%3A%20aSelector%0A%09testSelector%20%3A%3D%20aSelector'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_assert_equals_'),
+unescape('_setUp'),
 smalltalk.method({
-selector: unescape('assert%3Aequals%3A'),
-category: 'testing',
-fn: function (expected, actual){
+selector: unescape('setUp'),
+category: 'running',
+fn: function (){
 var self=this;
-return smalltalk.send(self, "_assert_description_", [smalltalk.send(expected, "__eq", [actual]), smalltalk.send(smalltalk.send(smalltalk.send("Expected: ", "__comma", [smalltalk.send(expected, "_asString", [])]), "__comma", [" but was: "]), "__comma", [smalltalk.send(actual, "_asString", [])])]);
-return self;},
-args: ["expected", "actual"],
-source: unescape('assert%3A%20expected%20equals%3A%20actual%0A%09%5E%20self%20assert%3A%20%28expected%20%3D%20actual%29%20description%3A%20%27Expected%3A%20%27%2C%20expected%20asString%2C%20%27%20but%20was%3A%20%27%2C%20actual%20asString'),
-messageSends: ["assert:description:", unescape("%3D"), unescape("%2C"), "asString"],
-referencedClasses: []
-}),
-smalltalk.TestCase);
 
-smalltalk.addMethod(
-unescape('_assert_description_'),
-smalltalk.method({
-selector: unescape('assert%3Adescription%3A'),
-category: 'testing',
-fn: function (aBoolean, aString){
-var self=this;
-((($receiver = aBoolean).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_signalFailure_", [aString]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_signalFailure_", [aString]);})]));
 return self;},
-args: ["aBoolean", "aString"],
-source: unescape('assert%3A%20aBoolean%20description%3A%20aString%0A%09aBoolean%20ifFalse%3A%20%5Bself%20signalFailure%3A%20aString%5D'),
-messageSends: ["ifFalse:", "signalFailure:"],
+args: [],
+source: unescape('setUp'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestCase);
@@ -211,54 +179,38 @@ referencedClasses: []
 }),
 smalltalk.TestCase);
 
-
-smalltalk.addMethod(
-unescape('_testSelectors'),
-smalltalk.method({
-selector: unescape('testSelectors'),
-category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(self, "_methodDictionary", []), "_keys", []), "_select_", [(function(each){return smalltalk.send(each, "_match_", [unescape("%5Etest")]);})]);
-return self;},
-args: [],
-source: unescape('testSelectors%0A%09%5Eself%20methodDictionary%20keys%20select%3A%20%5B%3Aeach%20%7C%20each%20match%3A%20%27%5Etest%27%5D'),
-messageSends: ["select:", "keys", "methodDictionary", "match:"],
-referencedClasses: []
-}),
-smalltalk.TestCase.klass);
-
 smalltalk.addMethod(
-unescape('_selector_'),
+unescape('_signalFailure_'),
 smalltalk.method({
-selector: unescape('selector%3A'),
-category: 'accessing',
-fn: function (aSelector){
+selector: unescape('signalFailure%3A'),
+category: 'private',
+fn: function (aString){
 var self=this;
-return (function($rec){smalltalk.send($rec, "_setTestSelector_", [aSelector]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+(function($rec){smalltalk.send($rec, "_messageText_", [aString]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send((smalltalk.TestFailure || TestFailure), "_new", []));
 return self;},
-args: ["aSelector"],
-source: unescape('selector%3A%20aSelector%0A%09%5Eself%20new%0A%09%09setTestSelector%3A%20aSelector%3B%0A%09%09yourself'),
-messageSends: ["setTestSelector:", "yourself", "new"],
-referencedClasses: []
+args: ["aString"],
+source: unescape('signalFailure%3A%20aString%0A%09TestFailure%20new%0A%09%09messageText%3A%20aString%3B%0A%09%09signal'),
+messageSends: ["messageText:", "signal", "new"],
+referencedClasses: ["TestFailure"]
 }),
-smalltalk.TestCase.klass);
+smalltalk.TestCase);
 
 smalltalk.addMethod(
-unescape('_lookupHierarchyRoot'),
+unescape('_tearDown'),
 smalltalk.method({
-selector: unescape('lookupHierarchyRoot'),
-category: 'accessing',
+selector: unescape('tearDown'),
+category: 'running',
 fn: function (){
 var self=this;
-return (smalltalk.TestCase || TestCase);
+
 return self;},
 args: [],
-source: unescape('lookupHierarchyRoot%0A%09%5ETestCase'),
+source: unescape('tearDown'),
 messageSends: [],
-referencedClasses: ["TestCase"]
+referencedClasses: []
 }),
-smalltalk.TestCase.klass);
+smalltalk.TestCase);
+
 
 smalltalk.addMethod(
 unescape('_allTestSelectors'),
@@ -295,6 +247,38 @@ referencedClasses: []
 }),
 smalltalk.TestCase.klass);
 
+smalltalk.addMethod(
+unescape('_lookupHierarchyRoot'),
+smalltalk.method({
+selector: unescape('lookupHierarchyRoot'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return (smalltalk.TestCase || TestCase);
+return self;},
+args: [],
+source: unescape('lookupHierarchyRoot%0A%09%5ETestCase'),
+messageSends: [],
+referencedClasses: ["TestCase"]
+}),
+smalltalk.TestCase.klass);
+
+smalltalk.addMethod(
+unescape('_selector_'),
+smalltalk.method({
+selector: unescape('selector%3A'),
+category: 'accessing',
+fn: function (aSelector){
+var self=this;
+return (function($rec){smalltalk.send($rec, "_setTestSelector_", [aSelector]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return self;},
+args: ["aSelector"],
+source: unescape('selector%3A%20aSelector%0A%09%5Eself%20new%0A%09%09setTestSelector%3A%20aSelector%3B%0A%09%09yourself'),
+messageSends: ["setTestSelector:", "yourself", "new"],
+referencedClasses: []
+}),
+smalltalk.TestCase.klass);
+
 smalltalk.addMethod(
 unescape('_shouldInheritSelectors'),
 smalltalk.method({
@@ -311,23 +295,55 @@ referencedClasses: []
 }),
 smalltalk.TestCase.klass);
 
+smalltalk.addMethod(
+unescape('_testSelectors'),
+smalltalk.method({
+selector: unescape('testSelectors'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send(smalltalk.send(self, "_methodDictionary", []), "_keys", []), "_select_", [(function(each){return smalltalk.send(each, "_match_", [unescape("%5Etest")]);})]);
+return self;},
+args: [],
+source: unescape('testSelectors%0A%09%5Eself%20methodDictionary%20keys%20select%3A%20%5B%3Aeach%20%7C%20each%20match%3A%20%27%5Etest%27%5D'),
+messageSends: ["select:", "keys", "methodDictionary", "match:"],
+referencedClasses: []
+}),
+smalltalk.TestCase.klass);
+
 
 smalltalk.addClass('TestFailure', smalltalk.Error, [], 'SUnit');
 
 
 smalltalk.addClass('TestResult', smalltalk.Object, ['timestamp', 'runs', 'errors', 'failures', 'total'], 'SUnit');
 smalltalk.addMethod(
-unescape('_timestamp'),
+unescape('_addError_'),
 smalltalk.method({
-selector: unescape('timestamp'),
+selector: unescape('addError%3A'),
 category: 'accessing',
-fn: function (){
+fn: function (anError){
 var self=this;
-return self['@timestamp'];
+smalltalk.send(smalltalk.send(self, "_errors", []), "_add_", [anError]);
 return self;},
-args: [],
-source: unescape('timestamp%0A%09%5Etimestamp'),
-messageSends: [],
+args: ["anError"],
+source: unescape('addError%3A%20anError%0A%09self%20errors%20add%3A%20anError'),
+messageSends: ["add:", "errors"],
+referencedClasses: []
+}),
+smalltalk.TestResult);
+
+smalltalk.addMethod(
+unescape('_addFailure_'),
+smalltalk.method({
+selector: unescape('addFailure%3A'),
+category: 'accessing',
+fn: function (aFailure){
+var self=this;
+smalltalk.send(smalltalk.send(self, "_failures", []), "_add_", [aFailure]);
+return self;},
+args: ["aFailure"],
+source: unescape('addFailure%3A%20aFailure%0A%09self%20failures%20add%3A%20aFailure'),
+messageSends: ["add:", "failures"],
 referencedClasses: []
 }),
 smalltalk.TestResult);
@@ -365,137 +381,121 @@ referencedClasses: []
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_total'),
+unescape('_increaseRuns'),
 smalltalk.method({
-selector: unescape('total'),
+selector: unescape('increaseRuns'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@total'];
+(self['@runs']=((($receiver = self['@runs']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
 return self;},
 args: [],
-source: unescape('total%0A%09%5Etotal'),
-messageSends: [],
+source: unescape('increaseRuns%0A%09runs%20%3A%3D%20runs%20+%201'),
+messageSends: [unescape("+")],
 referencedClasses: []
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_total_'),
+unescape('_initialize'),
 smalltalk.method({
-selector: unescape('total%3A'),
-category: 'accessing',
-fn: function (aNumber){
+selector: unescape('initialize'),
+category: 'initialization',
+fn: function (){
 var self=this;
-(self['@total']=aNumber);
+smalltalk.send(self, "_initialize", [], smalltalk.Object);
+(self['@timestamp']=smalltalk.send((smalltalk.Date || Date), "_now", []));
+(self['@runs']=(0));
+(self['@errors']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+(self['@failures']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+(self['@total']=(0));
 return self;},
-args: ["aNumber"],
-source: unescape('total%3A%20aNumber%0A%09total%20%3A%3D%20aNumber'),
-messageSends: [],
-referencedClasses: []
+args: [],
+source: unescape('initialize%0A%09super%20initialize.%0A%09timestamp%20%3A%3D%20Date%20now.%0A%09runs%20%3A%3D%200.%0A%09errors%20%3A%3D%20Array%20new.%0A%09failures%20%3A%3D%20Array%20new.%0A%09total%20%3A%3D%200'),
+messageSends: ["initialize", "now", "new"],
+referencedClasses: ["Date", "Array"]
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_addError_'),
+unescape('_runs'),
 smalltalk.method({
-selector: unescape('addError%3A'),
+selector: unescape('runs'),
 category: 'accessing',
-fn: function (anError){
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_errors", []), "_add_", [anError]);
+return self['@runs'];
 return self;},
-args: ["anError"],
-source: unescape('addError%3A%20anError%0A%09self%20errors%20add%3A%20anError'),
-messageSends: ["add:", "errors"],
+args: [],
+source: unescape('runs%0A%09%5Eruns'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_addFailure_'),
+unescape('_status'),
 smalltalk.method({
-selector: unescape('addFailure%3A'),
+selector: unescape('status'),
 category: 'accessing',
-fn: function (aFailure){
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_failures", []), "_add_", [aFailure]);
+return ((($receiver = smalltalk.send(smalltalk.send(self, "_errors", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_failures", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "success";})() : (function(){return "failure";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "success";}), (function(){return "failure";})]));})() : (function(){return "error";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_failures", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "success";})() : (function(){return "failure";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "success";}), (function(){return "failure";})]));}), (function(){return "error";})]));
 return self;},
-args: ["aFailure"],
-source: unescape('addFailure%3A%20aFailure%0A%09self%20failures%20add%3A%20aFailure'),
-messageSends: ["add:", "failures"],
+args: [],
+source: unescape('status%0A%09%5Eself%20errors%20isEmpty%20%0A%09%09ifTrue%3A%20%5B%0A%09%09%09self%20failures%20isEmpty%20%0A%09%09%09%09ifTrue%3A%20%5B%27success%27%5D%0A%09%09%09%09ifFalse%3A%20%5B%27failure%27%5D%5D%0A%09%09ifFalse%3A%20%5B%27error%27%5D'),
+messageSends: ["ifTrue:ifFalse:", "isEmpty", "errors", "failures"],
 referencedClasses: []
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_runs'),
+unescape('_timestamp'),
 smalltalk.method({
-selector: unescape('runs'),
+selector: unescape('timestamp'),
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@runs'];
+return self['@timestamp'];
 return self;},
 args: [],
-source: unescape('runs%0A%09%5Eruns'),
+source: unescape('timestamp%0A%09%5Etimestamp'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_increaseRuns'),
+unescape('_total'),
 smalltalk.method({
-selector: unescape('increaseRuns'),
+selector: unescape('total'),
 category: 'accessing',
 fn: function (){
 var self=this;
-(self['@runs']=((($receiver = self['@runs']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)])));
+return self['@total'];
 return self;},
 args: [],
-source: unescape('increaseRuns%0A%09runs%20%3A%3D%20runs%20+%201'),
-messageSends: [unescape("+")],
+source: unescape('total%0A%09%5Etotal'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestResult);
 
 smalltalk.addMethod(
-unescape('_status'),
+unescape('_total_'),
 smalltalk.method({
-selector: unescape('status'),
+selector: unescape('total%3A'),
 category: 'accessing',
-fn: function (){
+fn: function (aNumber){
 var self=this;
-return ((($receiver = smalltalk.send(smalltalk.send(self, "_errors", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_failures", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "success";})() : (function(){return "failure";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "success";}), (function(){return "failure";})]));})() : (function(){return "error";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return ((($receiver = smalltalk.send(smalltalk.send(self, "_failures", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "success";})() : (function(){return "failure";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "success";}), (function(){return "failure";})]));}), (function(){return "error";})]));
+(self['@total']=aNumber);
 return self;},
-args: [],
-source: unescape('status%0A%09%5Eself%20errors%20isEmpty%20%0A%09%09ifTrue%3A%20%5B%0A%09%09%09self%20failures%20isEmpty%20%0A%09%09%09%09ifTrue%3A%20%5B%27success%27%5D%0A%09%09%09%09ifFalse%3A%20%5B%27failure%27%5D%5D%0A%09%09ifFalse%3A%20%5B%27error%27%5D'),
-messageSends: ["ifTrue:ifFalse:", "isEmpty", "errors", "failures"],
+args: ["aNumber"],
+source: unescape('total%3A%20aNumber%0A%09total%20%3A%3D%20aNumber'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestResult);
 
-smalltalk.addMethod(
-unescape('_initialize'),
-smalltalk.method({
-selector: unescape('initialize'),
-category: 'initialization',
-fn: function (){
-var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Object);
-(self['@timestamp']=smalltalk.send((smalltalk.Date || Date), "_now", []));
-(self['@runs']=(0));
-(self['@errors']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-(self['@failures']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-(self['@total']=(0));
-return self;},
-args: [],
-source: unescape('initialize%0A%09super%20initialize.%0A%09timestamp%20%3A%3D%20Date%20now.%0A%09runs%20%3A%3D%200.%0A%09errors%20%3A%3D%20Array%20new.%0A%09failures%20%3A%3D%20Array%20new.%0A%09total%20%3A%3D%200'),
-messageSends: ["initialize", "now", "new"],
-referencedClasses: ["Date", "Array"]
-}),
-smalltalk.TestResult);
-
 
 
diff --git a/amber/src/js/amber.js b/amber/src/js/amber.js
index 2f5f626a6bb..af3cbbb5f6a 100644
--- a/amber/src/js/amber.js
+++ b/amber/src/js/amber.js
@@ -95,7 +95,7 @@ amber = (function() {
 
 		var additionalFiles = spec.packages || spec.files;
 		if (additionalFiles) {
-			loadPackages(additionalFiles, spec.prefix);
+			loadPackages(additionalFiles, spec.prefix, spec.packageHome);
 		}
 
 		// Be sure to setup & initialize smalltalk classes
@@ -103,29 +103,32 @@ amber = (function() {
 		initializeSmalltalk();
 	};
 
-	function loadPackages(names, prefix){
+	function loadPackages(names, prefix, urlHome){
 		var name, url;
 		var prefix = prefix || 'js';
+    var urlHome = urlHome || home;
 
 		for (var i=0; i < names.length; i++) {
 			name = names[i].split(/\.js$/)[0];
-			addJSToLoad(name + '.js', prefix);
+			addJSToLoad(name + '.js', prefix, urlHome);
 		}
 	};
 
-	function addJSToLoad(name, prefix) {
-		jsToLoad.push(buildJSURL(name, prefix));
+	function addJSToLoad(name, prefix, urlHome) {
+    var urlHome = urlHome || home;
+		jsToLoad.push(buildJSURL(name, prefix, urlHome));
 	};
 
-	function buildJSURL(name, prefix) {
+	function buildJSURL(name, prefix, urlHome) {
 		var prefix = prefix || 'js';
 		var name = name;
+    var urlHome = urlHome || home;
 
 		if (!deploy) {
 			name = name + nocache;
 		}
 
-		return home + prefix + '/' + name;
+		return urlHome + prefix + '/' + name;
 	};
 
 	function loadCSS(name, prefix) {
diff --git a/amber/src/js/init.js b/amber/src/js/init.js
index 031239aa35a..d04b68a91a6 100755
--- a/amber/src/js/init.js
+++ b/amber/src/js/init.js
@@ -6,4 +6,4 @@ smalltalk.classes()._do_(function(each) {
 
 if(this.smalltalkReady) {
     this.smalltalkReady();
-}
\ No newline at end of file
+}
diff --git a/amber/src/st/Benchfib.st b/amber/src/st/Benchfib.st
index fcd37c80ca1..251e52a44ac 100755
--- a/amber/src/st/Benchfib.st
+++ b/amber/src/st/Benchfib.st
@@ -1,7 +1,7 @@
 Smalltalk current createPackage: 'Benchfib' properties: #{}!
 Object subclass: #Benchfib
 	instanceVariableNames: ''
-	category: 'Benchfib'!
+	package: 'Benchfib'!
 
 !Benchfib class methodsFor: 'not yet classified'!
 
@@ -49,27 +49,6 @@ benchmark
     ^ count
 !
 
-tinyBenchmarks 
-	"Report the results of running the two tiny Squeak benchmarks.
-	ar 9/10/1999: Adjusted to run at least 1 sec to get more stable results"
-	"0 tinyBenchmarks"
-	"On a 292 MHz G3 Mac: 22727272 bytecodes/sec; 984169 sends/sec"
-	"On a 400 MHz PII/Win98:  18028169 bytecodes/sec; 1081272 sends/sec"
-	| t1 t2 r n1 n2 |
-	n1 := 1.
-	[t1 := Date millisecondsToRun: [n1 benchmark].
-	t1 < 1000] whileTrue:[n1 := n1 * 2]. "Note: #benchmark's runtime is about O(n)"
-
-	n2 := 16.
-	[t2 := Date millisecondsToRun: [r := n2 benchFib].
-	t2 < 1000] whileTrue:[n2 := n2 + 1]. 
-	"Note: #benchFib's runtime is about O(k^n),
-		where k is the golden number = (1 + 5 sqrt) / 2 = 1.618...."
-
-	^ ((n1 * 500000 * 1000) / t1) printString, ' bytecodes/sec; ',
-	  ((r * 1000) / t2) printString, ' sends/sec'
-!
-
 jsbenchFib
  
 	<if (this < 2) {
@@ -118,6 +97,27 @@ jstinyBenchmarks
 	"Note: #jsbenchFib's runtime is about O(k^n),
 		where k is the golden number = (1 + 5 sqrt) / 2 = 1.618...."
 
+	^ ((n1 * 500000 * 1000) / t1) printString, ' bytecodes/sec; ',
+	  ((r * 1000) / t2) printString, ' sends/sec'
+!
+
+tinyBenchmarks 
+	"Report the results of running the two tiny Squeak benchmarks.
+	ar 9/10/1999: Adjusted to run at least 1 sec to get more stable results"
+	"0 tinyBenchmarks"
+	"On a 292 MHz G3 Mac: 22727272 bytecodes/sec; 984169 sends/sec"
+	"On a 400 MHz PII/Win98:  18028169 bytecodes/sec; 1081272 sends/sec"
+	| t1 t2 r n1 n2 |
+	n1 := 1.
+	[t1 := Date millisecondsToRun: [n1 benchmark].
+	t1 < 1000] whileTrue:[n1 := n1 * 2]. "Note: #benchmark's runtime is about O(n)"
+
+	n2 := 16.
+	[t2 := Date millisecondsToRun: [r := n2 benchFib].
+	t2 < 1000] whileTrue:[n2 := n2 + 1]. 
+	"Note: #benchFib's runtime is about O(k^n),
+		where k is the golden number = (1 + 5 sqrt) / 2 = 1.618...."
+
 	^ ((n1 * 500000 * 1000) / t1) printString, ' bytecodes/sec; ',
 	  ((r * 1000) / t2) printString, ' sends/sec'
 ! !
diff --git a/amber/src/st/Canvas.st b/amber/src/st/Canvas.st
index 46ba575cd69..f5437b466fa 100755
--- a/amber/src/st/Canvas.st
+++ b/amber/src/st/Canvas.st
@@ -1,832 +1,812 @@
 Smalltalk current createPackage: 'Canvas' properties: #{}!
-Object subclass: #Widget
-	instanceVariableNames: ''
-	category: 'Canvas'!
+Object subclass: #HTMLCanvas
+	instanceVariableNames: 'root'
+	package: 'Canvas'!
 
-!Widget methodsFor: 'adding'!
+!HTMLCanvas methodsFor: 'accessing'!
 
-appendToBrush: aTagBrush
-    self appendToJQuery: aTagBrush asJQuery
+root
+    ^root
 !
 
-appendToJQuery: aJQuery
-   self renderOn: (HTMLCanvas onJQuery: aJQuery)
+root: aTagBrush
+    root := aTagBrush
 ! !
 
-!Widget methodsFor: 'rendering'!
+!HTMLCanvas methodsFor: 'adding'!
 
-renderOn: html
-    self
+with: anObject
+    ^self root with: anObject
 ! !
 
-Object subclass: #TagBrush
-	instanceVariableNames: 'canvas element'
-	category: 'Canvas'!
+!HTMLCanvas methodsFor: 'initialization'!
 
-!TagBrush methodsFor: 'accessing'!
+initialize
+    super initialize.
+    root ifNil: [root := TagBrush fromString: 'div' canvas: self]
+!
 
-element
-    ^element
+initializeFromJQuery: aJQuery
+    root := TagBrush fromJQuery: aJQuery canvas: self
 ! !
 
-!TagBrush methodsFor: 'adding'!
+!HTMLCanvas methodsFor: 'tags'!
 
-contents: anObject
-    self 
-	empty;
-   	append: anObject
+a
+    ^self tag: 'a'
 !
 
-addBrush: aTagBrush
-    self appendChild: aTagBrush element.
-    ^aTagBrush
+abbr
+	^self tag: 'abbr'
 !
 
-with: anObject
-    self append: anObject
+address
+	^self tag: 'address'
 !
 
-append: anObject
-    anObject appendToBrush: self
+area
+	^self tag: 'area'
 !
 
-appendToBrush: aTagBrush
-    aTagBrush addBrush: self
+article
+    ^self tag: 'article'
 !
 
-appendBlock: aBlock
-    | root |
-    root := canvas root.
-    canvas root: self.
-    aBlock value: canvas.
-    canvas root: root
+aside
+	^self tag: 'aside'
 !
 
-appendChild: anElement
-	"In IE7 and IE8 appendChild fails on several node types. So we need to check" 
- 	<var element=self['@element'];
- 	if (null == element.canHaveChildren || element.canHaveChildren) {
-		element.appendChild(anElement);
- 	} else {
- 		element.text = String(element.text) +  anElement.innerHTML;
- 	} >
+audio
+    ^self tag: 'audio'
 !
 
-appendString: aString
-    self appendChild: (self createTextNodeFor: aString)
+base
+	^self tag: 'base'
 !
 
-empty
-	self asJQuery empty
-! !
-
-!TagBrush methodsFor: 'attributes'!
-
-at: aString put: aValue
-    <self['@element'].setAttribute(aString, aValue)>
+blockquote
+	^self tag: 'blockquote'
 !
 
-removeAt: aString
-    <self['@element'].removeAttribute(aString)>
+body
+	^self tag: 'body'
 !
 
-class: aString
-      <self['@element'].className = aString>
+br
+    ^self tag: 'br'
 !
 
-id: aString
-    self at: 'id' put: aString
+button
+    ^self tag: 'button'
 !
 
-src: aString
-    self  at: 'src' put: aString
+canvas
+	^self tag: 'canvas'
 !
 
-href: aString
-    self at: 'href' put: aString
+caption
+	^self tag: 'caption'
 !
 
-title: aString
-    self at: 'title' put: aString
+cite
+	^self tag: 'cite'
 !
 
-style: aString
-    self at: 'style' put: aString
+code
+    ^self tag: 'code'
 !
 
-type: aString
-    self at: 'type' put: aString
+col
+	^self tag: 'col'
 !
 
-media: aString
-    self at: 'media' put: aString
+colgroup
+	^self tag: 'colgroup'
 !
 
-rel: aString
-    self  at: 'rel' put: aString
+command
+	^self tag: 'command'
 !
 
-width: aString
-    self  at: 'width' put: aString
+datalist
+	^self tag: 'datalist'
 !
 
-height: aString
-    self  at: 'height' put: aString
+dd
+	^self tag: 'dd'
 !
 
-value: aString
-    self  at: 'value' put: aString
+del
+	^self tag: 'del'
 !
 
-for: aString
-	self at: 'for' put: aString
+details
+	^self tag: 'details'
 !
 
-placeholder: aString
-	self at: 'placeholder' put: aString
+div
+    ^self tag: 'div'
 !
 
-accesskey: aString
-	self at: 'accesskey' put: aString
+div: aBlock
+    ^self div with: aBlock
 !
 
-contenteditable: aString
-	self at: 'contenteditable' put: aString
+dl
+	^self tag: 'dl'
 !
 
-contextmenu: aString
-	self at: 'contextmenu' put: aString
+dt
+	^self tag: 'dt'
 !
 
-draggable: aString
-	self at: 'draggable' put: aString
+em
+	^self tag: 'em'
 !
 
-hidden
-	self at: 'hidden' put: 'hidden'
+embed
+	^self tag: 'embed'
 !
 
-tabindex: aNumber
-	self at: 'tabindex' put: aNumber
+fieldset
+    ^self tag: 'fieldset'
 !
 
-target: aString
-	self at: 'target' put: aString
+figcaption
+	^self tag: 'figcaption'
 !
 
-align: aString
-	self at: 'align' put: aString
+figure
+	^self tag: 'figure'
 !
 
-alt: aString
-	self at: 'alt' put: aString
+footer
+    ^self tag: 'footer'
 !
 
-name: aString
-	self at: 'name' put: aString
+form
+    ^self tag: 'form'
 !
 
-valign: aString
-	self at: 'valign' put: aString
+h1
+    ^self tag: 'h1'
 !
 
-method: aString
-	self at: 'method' put: aString
+h1: anObject
+    ^self h1 with: anObject
 !
 
-action: aString
-	self at: 'action' put: aString
+h2
+    ^self tag: 'h2'
 !
 
-rows: aString
-	self at: 'rows' put: aString
+h2: anObject
+    ^ self h2 with: anObject
 !
 
-cols: aString
-	self at: 'cols' put: aString
-! !
-
-!TagBrush methodsFor: 'converting'!
-
-asJQuery
-    ^window jQuery: self element
-! !
-
-!TagBrush methodsFor: 'events'!
-
-onKeyDown: aBlock
-    self asJQuery bind: 'keydown' do: aBlock
+h3
+    ^self tag: 'h3'
 !
 
-onKeyPress: aBlock
-    self asJQuery bind: 'keypress' do: aBlock
+h3: anObject
+    ^self h3 with: anObject
 !
 
-onKeyUp: aBlock
-    self asJQuery bind: 'keyup' do: aBlock
+h4
+    ^self tag: 'h4'
 !
 
-onFocus: aBlock
-    self asJQuery bind: 'focus' do: aBlock
+h4: anObject
+    ^self h4 with: anObject
 !
 
-onBlur: aBlock
-    self asJQuery bind: 'blur' do: aBlock
+h5
+    ^self tag: 'h5'
 !
 
-onChange: aBlock
-    self asJQuery bind: 'change' do: aBlock
+h5: anObject
+    ^self h5 with: anObject
 !
 
-onClick: aBlock
-    self asJQuery bind: 'click' do: aBlock
+h6
+    ^self tag: 'h6'
 !
 
-onSubmit: aBlock
-	self asJQuery bind: 'submit' do: aBlock
+h6: anObject
+    ^self h6 with: anObject
 !
 
-onDblClick: aBlock
-	self asJQuery bind: 'dblclick' do: aBlock
+head
+	^self tag: 'head'
 !
 
-onHover: aBlock
-	self asJQuery bind: 'hover' do: aBlock
+header
+    ^self tag: 'header'
 !
 
-onFocusIn: aBlock
-	self asJQuery bind: 'focusin' do: aBlock
+hgroup
+	^self tag: 'hgroup'
 !
 
-onFocusOut: aBlock
-	self asJQuery bind: 'focusout' do: aBlock
+hr
+    ^self tag: 'hr'
 !
 
-onMouseDown: aBlock
-	self asJQuery bind: 'mousedown' do: aBlock
+html
+	^self tag: 'html'
 !
 
-onMouseUp: aBlock
-	self asJQuery bind: 'mouseup' do: aBlock
+iframe
+    ^self tag: 'iframe'
 !
 
-onMouseEnter: aBlock
-	self asJQuery bind: 'mouseenter' do: aBlock
+iframe: aString
+    ^self iframe src: aString
 !
 
-onMouseLeave: aBlock
-	self asJQuery bind: 'mouseleave' do: aBlock
+img
+    ^self tag: 'img'
 !
 
-onMouseMove: aBlock
-	self asJQuery bind: 'mousemove' do: aBlock
+img: aString
+    ^self img src: aString
 !
 
-onMouseOut: aBlock
-	self asJQuery bind: 'mouseout' do: aBlock
+input
+    ^self tag: 'input'
 !
 
-onMouseOver: aBlock
-	self asJQuery bind: 'mouseover' do: aBlock
+label
+	^self tag: 'label'
 !
 
-onSelect: aBlock
-	self asJQuery bind: 'select' do: aBlock
+legend
+	^self tag: 'legend'
 !
 
-onUnload: aBlock
-	self asJQuery bind: 'unload' do: aBlock
-! !
-
-!TagBrush methodsFor: 'initialization'!
-
-initializeFromString: aString canvas: aCanvas
-    element := self createElementFor: aString.
-    canvas := aCanvas
+li
+    ^self tag: 'li'
 !
 
-initializeFromJQuery: aJQuery canvas: aCanvas
-    element := aJQuery get: 0.
-    canvas := aCanvas
-! !
-
-!TagBrush methodsFor: 'private'!
-
-createElementFor: aString
-	<return document.createElement(String(aString))>
+li: anObject
+    ^self li with: anObject
 !
 
-createTextNodeFor: aString
-	<return document.createTextNode(String(aString))>
-! !
-
-!TagBrush class methodsFor: 'instance creation'!
+link
+    ^self tag: 'link'
+!
 
-fromString: aString canvas: aCanvas
-    ^self new
-	initializeFromString: aString canvas: aCanvas;
-	yourself
+map
+	^self tag: 'map'
 !
 
-fromJQuery: aJQuery canvas: aCanvas
-    ^self new
-	initializeFromJQuery: aJQuery canvas: aCanvas;
-	yourself
-! !
+mark
+	^self tag: 'mark'
+!
 
-Object subclass: #HTMLCanvas
-	instanceVariableNames: 'root'
-	category: 'Canvas'!
+menu
+	^self tag: 'menu'
+!
 
-!HTMLCanvas methodsFor: 'accessing'!
+meta
+	^self tag: 'meta'
+!
 
-root: aTagBrush
-    root := aTagBrush
+nav
+	^self tag: 'nav'
 !
 
-root
-    ^root
-! !
+newTag: aString
+    ^TagBrush fromString: aString canvas: self
+!
 
-!HTMLCanvas methodsFor: 'adding'!
+noscript
+	^self tag: 'noscript'
+!
 
-with: anObject
-    ^self root with: anObject
-! !
+object
+	^self tag: 'object'
+!
 
-!HTMLCanvas methodsFor: 'initialization'!
+ol
+    ^self tag: 'ol'
+!
 
-initialize
-    super initialize.
-    root ifNil: [root := TagBrush fromString: 'div' canvas: self]
+ol: anObject
+    ^self ol with: anObject
 !
 
-initializeFromJQuery: aJQuery
-    root := TagBrush fromJQuery: aJQuery canvas: self
-! !
+optgroup
+	^self tag: 'optgroup'
+!
 
-!HTMLCanvas methodsFor: 'tags'!
+option
+    ^self tag: 'option'
+!
 
-newTag: aString
-    ^TagBrush fromString: aString canvas: self
+output
+	^self tag: 'output'
 !
 
-tag: aString
-    ^root addBrush: (self newTag: aString)
+p
+    ^self tag: 'p'
 !
 
-h1
-    ^self tag: 'h1'
+p: anObject
+    ^self p with: anObject
 !
 
-h2
-    ^self tag: 'h2'
+param
+	^self tag: 'param'
 !
 
-h3
-    ^self tag: 'h3'
+pre
+    ^self tag: 'pre'
 !
 
-h4
-    ^self tag: 'h4'
+progress
+	^self tag: 'progress'
 !
 
-h5
-    ^self tag: 'h5'
+script
+    ^self tag: 'script'
 !
 
-h6
-    ^self tag: 'h6'
+section
+    ^self tag: 'section'
+!
+
+select
+    ^self tag: 'select'
 !
 
-p
-    ^self tag: 'p'
+small
+	^self tag: 'small'
 !
 
-div
-    ^self tag: 'div'
+source
+	^self tag: 'source'
 !
 
 span
     ^self tag: 'span'
 !
 
-img
-    ^self tag: 'img'
-!
-
-ul
-    ^self tag: 'ul'
+span: anObject
+    ^self span with: anObject
 !
 
-ol
-    ^self tag: 'ol'
+strong
+	^self tag: 'strong'
 !
 
-li
-    ^self tag: 'li'
+strong: anObject
+	^self strong with: anObject
 !
 
-table
-    ^self tag: 'table'
+style
+	^ root addBrush:  (StyleTag canvas: self)
 !
 
-tr
-    ^self tag: 'tr'
+style: aString
+	^ self style with: aString; yourself
 !
 
-td 
-    ^self tag: 'td'
+sub
+	^self tag: 'sub'
 !
 
-th
-    ^self tag: 'th'
+summary
+	^self tag: 'summary'
 !
 
-form
-    ^self tag: 'form'
+sup
+	^self tag: 'sup'
 !
 
-input
-    ^self tag: 'input'
+table
+    ^self tag: 'table'
 !
 
-button
-    ^self tag: 'button'
+tag: aString
+    ^root addBrush: (self newTag: aString)
 !
 
-select
-    ^self tag: 'select'
+tbody
+    ^self tag: 'tbody'
 !
 
-option
-    ^self tag: 'option'
+td 
+    ^self tag: 'td'
 !
 
 textarea
     ^self tag: 'textarea'
 !
 
-a
-    ^self tag: 'a'
-!
-
-canvas
-	^self tag: 'canvas'
+tfoot
+    ^self tag: 'tfoot'
 !
 
-pre
-    ^self tag: 'pre'
+th
+    ^self tag: 'th'
 !
 
-code
-    ^self tag: 'code'
+thead
+    ^self tag: 'thead'
 !
 
-br
-    ^self tag: 'br'
+time
+	^self tag: 'time'
 !
 
-script
-    ^self tag: 'script'
+title
+	^self tag: 'title'
 !
 
-link
-    ^self tag: 'link'
+tr
+    ^self tag: 'tr'
 !
 
-style
-	^ root addBrush:  (StyleTag canvas: self)
+ul
+    ^self tag: 'ul'
 !
 
-p: anObject
-    ^self p with: anObject
+ul: anObject
+    ^self ul with: anObject
 !
 
-h1: anObject
-    ^self h1 with: anObject
-!
+video
+    ^self tag: 'video'
+! !
 
-iframe
-    ^self tag: 'iframe'
-!
+!HTMLCanvas class methodsFor: 'instance creation'!
 
-iframe: aString
-    ^self iframe src: aString
+browserVersion
+	^(jQuery at: #browser) version
 !
 
-h2: anObject
-    ^ self h2 with: anObject
+isMSIE
+	^((jQuery at: #browser) at: #msie) notNil
 !
 
-h3: anObject
-    ^self h3 with: anObject
+isMozilla
+	^((jQuery at: #browser) at: #mozilla) notNil
 !
 
-h4: anObject
-    ^self h4 with: anObject
+isOpera
+	^((jQuery at: #browser) at: #opera) notNil
 !
 
-h5: anObject
-    ^self h5 with: anObject
+isWebkit
+	^((jQuery at: #browser) at: #webkit) notNil
 !
 
-h6: anObject
-    ^self h6 with: anObject
-!
+onJQuery: aJQuery
+	^self basicNew
+		initializeFromJQuery: aJQuery;
+		initialize;
+		yourself
+! !
 
-img: aString
-    ^self img src: aString
-!
+Object subclass: #TagBrush
+	instanceVariableNames: 'canvas element'
+	package: 'Canvas'!
 
-ol: anObject
-    ^self ol with: anObject
-!
+!TagBrush methodsFor: 'accessing'!
 
-li: anObject
-    ^self li with: anObject
-!
+element
+    ^element
+! !
 
-ul: anObject
-    ^self ul with: anObject
-!
+!TagBrush methodsFor: 'adding'!
 
-span: anObject
-    ^self span with: anObject
+addBrush: aTagBrush
+    self appendChild: aTagBrush element.
+    ^aTagBrush
 !
 
-style: aString
-	^ self style with: aString; yourself
+append: anObject
+    anObject appendToBrush: self
 !
 
-audio
-    ^self tag: 'audio'
+appendBlock: aBlock
+    | root |
+    root := canvas root.
+    canvas root: self.
+    aBlock value: canvas.
+    canvas root: root
 !
 
-fieldset
-    ^self tag: 'fieldset'
+appendChild: anElement
+	"In IE7 and IE8 appendChild fails on several node types. So we need to check" 
+ 	<var element=self['@element'];
+ 	if (null == element.canHaveChildren || element.canHaveChildren) {
+		element.appendChild(anElement);
+ 	} else {
+ 		element.text = String(element.text) +  anElement.innerHTML;
+ 	} >
 !
 
-footer
-    ^self tag: 'footer'
+appendString: aString
+    self appendChild: (self createTextNodeFor: aString)
 !
 
-header
-    ^self tag: 'header'
+appendToBrush: aTagBrush
+    aTagBrush addBrush: self
 !
 
-hr
-    ^self tag: 'hr'
+contents: anObject
+    self 
+	empty;
+   	append: anObject
 !
 
-section
-    ^self tag: 'section'
+empty
+	self asJQuery empty
 !
 
-tbody
-    ^self tag: 'tbody'
-!
+with: anObject
+    self append: anObject
+! !
 
-tfoot
-    ^self tag: 'tfoot'
-!
+!TagBrush methodsFor: 'attributes'!
 
-thead
-    ^self tag: 'thead'
+accesskey: aString
+	self at: 'accesskey' put: aString
 !
 
-video
-    ^self tag: 'video'
+action: aString
+	self at: 'action' put: aString
 !
 
-label
-	^self tag: 'label'
+align: aString
+	self at: 'align' put: aString
 !
 
-title
-	^self tag: 'title'
+alt: aString
+	self at: 'alt' put: aString
 !
 
-time
-	^self tag: 'time'
+at: aString put: aValue
+    <self['@element'].setAttribute(aString, aValue)>
 !
 
-sup
-	^self tag: 'sup'
+class: aString
+      <self['@element'].className = aString>
 !
 
-summary
-	^self tag: 'summary'
+cols: aString
+	self at: 'cols' put: aString
 !
 
-sub
-	^self tag: 'sub'
+contenteditable: aString
+	self at: 'contenteditable' put: aString
 !
 
-strong
-	^self tag: 'strong'
+contextmenu: aString
+	self at: 'contextmenu' put: aString
 !
 
-strong: anObject
-	^self strong with: anObject
+draggable: aString
+	self at: 'draggable' put: aString
 !
 
-source
-	^self tag: 'source'
+for: aString
+	self at: 'for' put: aString
 !
 
-small
-	^self tag: 'small'
+height: aString
+    self  at: 'height' put: aString
 !
 
-progress
-	^self tag: 'progress'
+hidden
+	self at: 'hidden' put: 'hidden'
 !
 
-param
-	^self tag: 'param'
+href: aString
+    self at: 'href' put: aString
 !
 
-output
-	^self tag: 'output'
+id: aString
+    self at: 'id' put: aString
 !
 
-optgroup
-	^self tag: 'optgroup'
+media: aString
+    self at: 'media' put: aString
 !
 
-object
-	^self tag: 'object'
+method: aString
+	self at: 'method' put: aString
 !
 
-noscript
-	^self tag: 'noscript'
+name: aString
+	self at: 'name' put: aString
 !
 
-nav
-	^self tag: 'nav'
+placeholder: aString
+	self at: 'placeholder' put: aString
 !
 
-meta
-	^self tag: 'meta'
+rel: aString
+    self  at: 'rel' put: aString
 !
 
-menu
-	^self tag: 'menu'
+removeAt: aString
+    <self['@element'].removeAttribute(aString)>
 !
 
-mark
-	^self tag: 'mark'
+rows: aString
+	self at: 'rows' put: aString
 !
 
-map
-	^self tag: 'map'
+src: aString
+    self  at: 'src' put: aString
 !
 
-legend
-	^self tag: 'legend'
+style: aString
+    self at: 'style' put: aString
 !
 
-html
-	^self tag: 'html'
+tabindex: aNumber
+	self at: 'tabindex' put: aNumber
 !
 
-hgroup
-	^self tag: 'hgroup'
+target: aString
+	self at: 'target' put: aString
 !
 
-head
-	^self tag: 'head'
+title: aString
+    self at: 'title' put: aString
 !
 
-figure
-	^self tag: 'figure'
+type: aString
+    self at: 'type' put: aString
 !
 
-figcaption
-	^self tag: 'figcaption'
+valign: aString
+	self at: 'valign' put: aString
 !
 
-embed
-	^self tag: 'embed'
+value: aString
+    self  at: 'value' put: aString
 !
 
-em
-	^self tag: 'em'
+width: aString
+    self  at: 'width' put: aString
+! !
+
+!TagBrush methodsFor: 'converting'!
+
+asJQuery
+    ^window jQuery: self element
+! !
+
+!TagBrush methodsFor: 'events'!
+
+onBlur: aBlock
+    self asJQuery bind: 'blur' do: aBlock
 !
 
-dt
-	^self tag: 'dt'
+onChange: aBlock
+    self asJQuery bind: 'change' do: aBlock
 !
 
-dl
-	^self tag: 'dl'
+onClick: aBlock
+    self asJQuery bind: 'click' do: aBlock
 !
 
-details
-	^self tag: 'details'
+onDblClick: aBlock
+	self asJQuery bind: 'dblclick' do: aBlock
 !
 
-del
-	^self tag: 'del'
+onFocus: aBlock
+    self asJQuery bind: 'focus' do: aBlock
 !
 
-dd
-	^self tag: 'dd'
+onFocusIn: aBlock
+	self asJQuery bind: 'focusin' do: aBlock
 !
 
-datalist
-	^self tag: 'datalist'
+onFocusOut: aBlock
+	self asJQuery bind: 'focusout' do: aBlock
 !
 
-command
-	^self tag: 'command'
+onHover: aBlock
+	self asJQuery bind: 'hover' do: aBlock
 !
 
-colgroup
-	^self tag: 'colgroup'
+onKeyDown: aBlock
+    self asJQuery bind: 'keydown' do: aBlock
 !
 
-col
-	^self tag: 'col'
+onKeyPress: aBlock
+    self asJQuery bind: 'keypress' do: aBlock
 !
 
-cite
-	^self tag: 'cite'
+onKeyUp: aBlock
+    self asJQuery bind: 'keyup' do: aBlock
 !
 
-caption
-	^self tag: 'caption'
+onMouseDown: aBlock
+	self asJQuery bind: 'mousedown' do: aBlock
 !
 
-body
-	^self tag: 'body'
+onMouseEnter: aBlock
+	self asJQuery bind: 'mouseenter' do: aBlock
 !
 
-blockquote
-	^self tag: 'blockquote'
+onMouseLeave: aBlock
+	self asJQuery bind: 'mouseleave' do: aBlock
 !
 
-base
-	^self tag: 'base'
+onMouseMove: aBlock
+	self asJQuery bind: 'mousemove' do: aBlock
 !
 
-aside
-	^self tag: 'aside'
+onMouseOut: aBlock
+	self asJQuery bind: 'mouseout' do: aBlock
 !
 
-article
-    ^self tag: 'article'
+onMouseOver: aBlock
+	self asJQuery bind: 'mouseover' do: aBlock
 !
 
-area
-	^self tag: 'area'
+onMouseUp: aBlock
+	self asJQuery bind: 'mouseup' do: aBlock
 !
 
-address
-	^self tag: 'address'
+onSelect: aBlock
+	self asJQuery bind: 'select' do: aBlock
 !
 
-abbr
-	^self tag: 'abbr'
+onSubmit: aBlock
+	self asJQuery bind: 'submit' do: aBlock
 !
 
-div: aBlock
-    ^self div with: aBlock
+onUnload: aBlock
+	self asJQuery bind: 'unload' do: aBlock
 ! !
 
-!HTMLCanvas class methodsFor: 'instance creation'!
+!TagBrush methodsFor: 'initialization'!
 
-onJQuery: aJQuery
-	^self basicNew
-		initializeFromJQuery: aJQuery;
-		initialize;
-		yourself
+initializeFromJQuery: aJQuery canvas: aCanvas
+    element := aJQuery get: 0.
+    canvas := aCanvas
 !
 
-isMSIE
-	^((jQuery at: #browser) at: #msie) notNil
-!
+initializeFromString: aString canvas: aCanvas
+    element := self createElementFor: aString.
+    canvas := aCanvas
+! !
 
-isOpera
-	^((jQuery at: #browser) at: #opera) notNil
-!
+!TagBrush methodsFor: 'private'!
 
-isMozilla
-	^((jQuery at: #browser) at: #mozilla) notNil
+createElementFor: aString
+	<return document.createElement(String(aString))>
 !
 
-isWebkit
-	^((jQuery at: #browser) at: #webkit) notNil
+createTextNodeFor: aString
+	<return document.createTextNode(String(aString))>
+! !
+
+!TagBrush class methodsFor: 'instance creation'!
+
+fromJQuery: aJQuery canvas: aCanvas
+    ^self new
+	initializeFromJQuery: aJQuery canvas: aCanvas;
+	yourself
 !
 
-browserVersion
-	^(jQuery at: #browser) version
+fromString: aString canvas: aCanvas
+    ^self new
+	initializeFromString: aString canvas: aCanvas;
+	yourself
 ! !
 
 TagBrush subclass: #StyleTag
 	instanceVariableNames: 'canvas element'
-	category: 'Canvas'!
+	package: 'Canvas'!
 !StyleTag commentStamp!
 I'm a <style> tag use to inline CSS or load a stylesheet.
 
@@ -848,37 +828,57 @@ canvas: aCanvas
 	yourself
 ! !
 
-!Object methodsFor: '*Canvas'!
+Object subclass: #Widget
+	instanceVariableNames: ''
+	package: 'Canvas'!
 
-appendToJQuery: aJQuery
-    aJQuery append: self asString
+!Widget methodsFor: 'adding'!
+
+appendToBrush: aTagBrush
+    self appendToJQuery: aTagBrush asJQuery
 !
 
+appendToJQuery: aJQuery
+   self renderOn: (HTMLCanvas onJQuery: aJQuery)
+! !
+
+!Widget methodsFor: 'rendering'!
+
+renderOn: html
+    self
+! !
+
+!Object methodsFor: '*Canvas'!
+
 appendToBrush: aTagBrush
     aTagBrush append: self asString
+!
+
+appendToJQuery: aJQuery
+    aJQuery append: self asString
 ! !
 
 !BlockClosure methodsFor: '*Canvas'!
 
-appendToJQuery: aJQuery
-    self value: (HTMLCanvas onJQuery: aJQuery)
-!
-
 appendToBrush: aTagBrush
     aTagBrush appendBlock: self
+!
+
+appendToJQuery: aJQuery
+    self value: (HTMLCanvas onJQuery: aJQuery)
 ! !
 
 !String methodsFor: '*Canvas'!
 
-asJQuery
-    <return jQuery(String(self))>
+appendToBrush: aTagBrush
+    aTagBrush appendString: self
 !
 
 appendToJQuery: aJQuery
     aJQuery append: self
 !
 
-appendToBrush: aTagBrush
-    aTagBrush appendString: self
+asJQuery
+    <return jQuery(String(self))>
 ! !
 
diff --git a/amber/src/st/Compiler-Tests.st b/amber/src/st/Compiler-Tests.st
new file mode 100644
index 00000000000..1070e25ac0e
--- /dev/null
+++ b/amber/src/st/Compiler-Tests.st
@@ -0,0 +1,471 @@
+Smalltalk current createPackage: 'Compiler-Tests' properties: #{}!
+TestCase subclass: #ImporterTest
+	instanceVariableNames: ''
+	category: 'Compiler-Tests'!
+
+!ImporterTest methodsFor: 'private'!
+
+chunkString
+
+	^'!!Object methodsFor: ''importer test method''!!
+
+importerTestMethod
+
+	^''success''
+!! !!
+'
+!
+
+bigChunkString
+
+	^'Smalltalk current createPackage: ''Cypress-Definitions'' properties: #{}!!
+Object subclass: #CypressSnapshot
+	instanceVariableNames: ''definitions''
+	package: ''Cypress-Definitions''!!
+
+!!CypressSnapshot methodsFor: ''not yet classified''!!
+
+definitions: aDefinitions
+
+	definitions := aDefinitions
+!!
+
+definitions
+
+	^definitions
+!! !!
+
+!!CypressSnapshot class methodsFor: ''not yet classified''!!
+
+definitions: aDefinitions
+
+	^(self new) definitions: aDefinitions
+!! !!
+
+Object subclass: #CypressPackage
+	instanceVariableNames: ''name''
+	package: ''Cypress-Definitions''!!
+
+!!CypressPackage methodsFor: ''not yet classified''!!
+
+= other
+	^ other species = self species and: [other name sameAs: name]
+!!
+
+name
+	^ name
+!!
+
+name: aString
+	name := aString
+!!
+
+snapshot
+	| package definitions name  |
+	package := Package named: self name.
+	definitions := OrderedCollection new.
+	package sortedClasses do: [:cls |
+        	definitions add: cls asCypressClassDefinition.
+                cls methodDictionary values do: [:method |
+			(method category match: ''^\*'') ifFalse: [ 
+				definitions add: method asCypressMethodDefinition ]].
+                cls class methodDictionary values do: [:method |
+			(method category match: ''^\*'') ifFalse: [ 
+				definitions add: method asCypressMethodDefinition ]]].
+	name := package name.
+	Smalltalk current classes, (Smalltalk current classes collect: [:each | each class]) do: [:each |
+		each methodDictionary values do: [:method |
+			method category = (''*'', name) ifTrue: [
+				definitions add: method asCypressMethodDefinition ]]].
+	^ CypressSnapshot definitions: definitions
+!!
+
+printString
+	^super printString, ''('', name, '')''
+!! !!
+
+Object subclass: #CypressDefinition
+	instanceVariableNames: ''''
+	package: ''Cypress-Definitions''!!
+
+!!CypressDefinition methodsFor: ''not yet classified''!!
+
+= aDefinition
+	^(aDefinition isKindOf: CypressDefinition) and: [self isRevisionOf: aDefinition]
+!!
+
+isRevisionOf: aDefinition
+	^ (aDefinition isKindOf: CypressDefinition) and: [aDefinition description = self description]
+!!
+
+description
+	self subclassResponsibility
+!!
+
+isSameRevisionAs: aDefinition
+	^ self = aDefinition
+!! !!
+
+Object subclass: #CypressPatch
+	instanceVariableNames: ''operations''
+	package: ''Cypress-Definitions''!!
+
+!!CypressPatch methodsFor: ''not yet classified''!!
+
+fromBase: baseSnapshot toTarget: targetSnapshot
+	| base target |	
+	operations := OrderedCollection new.
+	base := CypressDefinitionIndex definitions: baseSnapshot definitions.
+	target := CypressDefinitionIndex definitions: targetSnapshot definitions.
+	
+	target definitions do:
+		[:t |
+		base
+			definitionLike: t
+			ifPresent: [:b | (b isSameRevisionAs: t) ifFalse: [operations add: (CypressModification of: b to: t)]]
+			ifAbsent: [operations add: (CypressAddition of: t)]].
+		
+	base definitions do:
+		[:b |
+		target
+			definitionLike: b
+			ifPresent: [:t | ]
+			ifAbsent: [operations add: (CypressRemoval of: b)]]
+!!
+
+operations
+
+	^operations
+!! !!
+
+!!CypressPatch class methodsFor: ''not yet classified''!!
+
+fromBase: baseSnapshot toTarget: targetSnapshot
+	^ (self new)
+		fromBase: baseSnapshot
+		toTarget: targetSnapshot
+!! !!
+
+Object subclass: #CypressDefinitionIndex
+	instanceVariableNames: ''definitionMap''
+	package: ''Cypress-Definitions''!!
+
+!!CypressDefinitionIndex methodsFor: ''not yet classified''!!
+
+add: aDefinition
+	^ self definitionMap at: aDefinition description put: aDefinition
+!!
+
+addAll: aCollection
+	aCollection do: [:ea | self add: ea]
+!!
+
+definitionLike: aDefinition ifPresent: foundBlock ifAbsent: errorBlock
+	| definition |
+	definition := self definitionMap at: aDefinition description ifAbsent: [].
+	^ definition
+		ifNil: errorBlock
+		ifNotNil: [foundBlock value: definition]
+!!
+
+definitions
+	^self definitionMap values
+!!
+
+definitionMap
+	definitionMap ifNil: [ definitionMap := Dictionary new ].
+	^ definitionMap
+!!
+
+remove: aDefinition
+	self definitionMap removeKey: aDefinition description ifAbsent: []
+!! !!
+
+!!CypressDefinitionIndex class methodsFor: ''not yet classified''!!
+
+definitions: aCollection
+	^ self new addAll: aCollection
+!! !!
+
+Object subclass: #CypressPatchOperation
+	instanceVariableNames: ''''
+	package: ''Cypress-Definitions''!!
+
+CypressDefinition subclass: #CypressClassDefinition
+	instanceVariableNames: ''name superclassName category comment instVarNames classInstVarNames''
+	package: ''Cypress-Definitions''!!
+
+!!CypressClassDefinition methodsFor: ''not yet classified''!!
+
+name: aClassName superclassName: aSuperclassName category: aCategory instVarNames: anInstanceVariableNames classInstVarNames: aClassInstanceVariableNames comment: aComment
+
+	name := aClassName.
+	superclassName := aSuperclassName.
+	category := aCategory.
+	instVarNames := anInstanceVariableNames.
+	classInstVarNames := aClassInstanceVariableNames.
+	comment := aComment
+!!
+
+= aDefinition
+	^(super = aDefinition)
+		and: [superclassName = aDefinition superclassName
+		and: [category = aDefinition category
+		and: [instVarNames = aDefinition instVarNames
+		and: [classInstVarNames = aDefinition classInstVarNames
+		and: [comment = aDefinition comment]]]]]
+!!
+
+superclassName
+
+	^superclassName
+!!
+
+name
+
+	^name
+!!
+
+category
+
+	^category
+!!
+
+comment
+
+	^comment
+!!
+
+description
+
+	^ Array with: name
+!!
+
+instVarNames
+
+	^instVarNames
+!!
+
+classInstVarNames
+
+	^classInstVarNames
+!! !!
+
+!!CypressClassDefinition class methodsFor: ''not yet classified''!!
+
+name: aClassName 
+superclassName: aSuperclassName
+category: aCategory
+instVarNames: anInstanceVariableNames
+classInstVarNames: aClassInstanceVariableNames
+comment: aComment
+
+	^(self new) 
+		name: aClassName 
+		superclassName: aSuperclassName
+		category: aCategory
+		instVarNames: anInstanceVariableNames
+		classInstVarNames: aClassInstanceVariableNames
+		comment: aComment
+!! !!
+
+CypressDefinition subclass: #CypressMethodDefinition
+	instanceVariableNames: ''classIsMeta source category selector className''
+	package: ''Cypress-Definitions''!!
+
+!!CypressMethodDefinition methodsFor: ''not yet classified''!!
+
+className: aName classIsMeta: isMetaclass selector: aSelector category: aCategory source: aSource
+
+	className := aName.
+	classIsMeta := isMetaclass.
+	selector := aSelector.
+	category := aCategory.
+	source := aSource.
+!!
+
+= aDefinition
+    ^ super = aDefinition
+        and: [ aDefinition source = self source
+                and: [ aDefinition category = self category ] ]
+!!
+
+source
+
+	^source
+!!
+
+category
+
+	^category
+!!
+
+description
+	^ Array	
+		with: className
+		with: selector
+		with: classIsMeta
+!! !!
+
+!!CypressMethodDefinition class methodsFor: ''not yet classified''!!
+
+className: aName
+classIsMeta: isMetaclass
+selector: aSelector
+category: aCategory
+source: aSource
+
+	^(self new)
+		className: aName
+		classIsMeta: isMetaclass
+		selector: aSelector
+		category: aCategory
+		source: aSource
+!! !!
+
+CypressPatchOperation subclass: #CypressAddition
+	instanceVariableNames: ''definition''
+	package: ''Cypress-Definitions''!!
+
+!!CypressAddition methodsFor: ''not yet classified''!!
+
+definition: aDefinition
+
+	definition := aDefinition
+!! !!
+
+!!CypressAddition class methodsFor: ''not yet classified''!!
+
+of: aDefinition
+	^ self new definition: aDefinition
+!! !!
+
+CypressPatchOperation subclass: #CypressModification
+	instanceVariableNames: ''obsoletion modification''
+	package: ''Cypress-Definitions''!!
+
+!!CypressModification methodsFor: ''not yet classified''!!
+
+base: base target: target
+
+	obsoletion := base.
+	modification := target.
+!! !!
+
+!!CypressModification class methodsFor: ''not yet classified''!!
+
+of: base to: target
+	^ self new base: base target: target
+!! !!
+
+CypressPatchOperation subclass: #CypressRemoval
+	instanceVariableNames: ''definition''
+	package: ''Cypress-Definitions''!!
+
+!!CypressRemoval methodsFor: ''not yet classified''!!
+
+definition: aDefinition
+
+	definition := aDefinition
+!! !!
+
+!!CypressRemoval class methodsFor: ''not yet classified''!!
+
+of: aDefinition
+	^ self new definition: aDefinition
+!! !!
+
+!!Object methodsFor: ''*Cypress-Definitions''!!
+
+species
+
+	^self class
+!! !!
+
+!!Class methodsFor: ''*Cypress-Definitions''!!
+
+asCypressClassDefinition
+	^CypressClassDefinition
+		name: self name
+		superclassName: self superclass name
+		category: self category 
+		instVarNames: self instanceVariableNames
+		classInstVarNames: self class instanceVariableNames
+		comment: self comment
+!! !!
+
+!!CompiledMethod methodsFor: ''*Cypress-Definitions''!!
+
+asCypressMethodDefinition
+
+	^CypressMethodDefinition 
+        	className: self methodClass name
+		classIsMeta: self methodClass isMetaclass
+		selector: self selector
+		category: self category
+		source: self source
+!! !!
+
+!!CharacterArray methodsFor: ''*Cypress-Definitions''!!
+
+sameAs: aString
+
+	^self asUppercase = aString asUppercase
+!! !!
+
+'
+! !
+
+!ImporterTest methodsFor: 'running'!
+
+setUp
+
+	super setUp.
+	self cleanUp
+!
+
+tearDown
+
+	super tearDown.
+	self cleanUp
+!
+
+cleanUp
+
+	(Object methodDictionary includesKey: #importerTestMethod)
+		ifTrue: [ Object removeCompiledMethod: (Object methodAt: #importerTestMethod)].
+! !
+
+!ImporterTest methodsFor: 'tests'!
+
+testBigChunkString
+	"importer does not correctly add extension methods.
+
+	 After loading in AmberProjectImporter, the following import fails...get a MNU from `CypressPackage new species`:
+
+    		AmberProjectImporter
+			importSTPackage: 'Cypress-Definitions' 
+			prefix: 'tests/'.
+
+		CypressPackage new species. 
+
+	WARNING this guy isn't cleaned up automatically"
+
+	Importer new import: self bigChunkString readStream.
+	CypressPackage new species.
+!
+
+testChunkString
+
+	Importer new import: self chunkString readStream.
+	self assert: (Object methodDictionary includesKey: 'importerTestMethod').
+	self assert: (Object new importerTestMethod = 'success').
+! !
+
+!Object methodsFor: '*Compiler-Tests'!
+
+importerLoadMethod
+
+	^'success'
+! !
+
diff --git a/amber/src/st/Compiler.st b/amber/src/st/Compiler.st
index 28e3d5a0200..16947ff2014 100755
--- a/amber/src/st/Compiler.st
+++ b/amber/src/st/Compiler.st
@@ -1,122 +1,55 @@
 Smalltalk current createPackage: 'Compiler' properties: #{}!
-Object subclass: #NodeVisitor
-	instanceVariableNames: ''
-	category: 'Compiler'!
-
-!NodeVisitor methodsFor: 'visiting'!
-
-visit: aNode
-	aNode accept: self
-!
-
-visitNode: aNode
-!
-
-visitMethodNode: aNode
-	self visitNode: aNode
-!
-
-visitSequenceNode: aNode
-	self visitNode: aNode
-!
-
-visitBlockSequenceNode: aNode
-	self visitSequenceNode: aNode
-!
-
-visitBlockNode: aNode
-	self visitNode: aNode
-!
-
-visitReturnNode: aNode
-	self visitNode: aNode
-!
-
-visitSendNode: aNode
-	self visitNode: aNode
-!
+Object subclass: #ChunkParser
+	instanceVariableNames: 'stream'
+	package: 'Compiler'!
 
-visitCascadeNode: aNode
-	self visitNode: aNode
-!
+!ChunkParser methodsFor: 'accessing'!
 
-visitValueNode: aNode
-	self visitNode: aNode
-!
+stream: aStream
+	stream := aStream
+! !
 
-visitVariableNode: aNode
-!
+!ChunkParser methodsFor: 'reading'!
 
-visitAssignmentNode: aNode
-	self visitNode: aNode
-!
+nextChunk
+	"The chunk format (Smalltalk Interchange Format or Fileout format)
+	is a trivial format but can be a bit tricky to understand:
+		- Uses the exclamation mark as delimiter of chunks.
+		- Inside a chunk a normal exclamation mark must be doubled.
+		- A non empty chunk must be a valid Smalltalk expression.
+		- A chunk on top level with a preceding empty chunk is an instruction chunk:
+			- The object created by the expression then takes over reading chunks.
 
-visitClassReferenceNode: aNode
-	self 
-	    nextPutAll: 'smalltalk.';
-	    nextPutAll: aNode value
-!
+	This metod returns next chunk as a String (trimmed), empty String (all whitespace) or nil."
 
-visitJSStatementNode: aNode
-	self 
-	    nextPutAll: 'function(){';
-	    nextPutAll: aNode source;
-	    nextPutAll: '})()'
-!
+	| char result chunk |
+	result := '' writeStream.
+        [char := stream next.
+        char notNil] whileTrue: [
+                 char = '!!' ifTrue: [
+                         stream peek = '!!'
+                                ifTrue: [stream next "skipping the escape double"]
+                                ifFalse: [^result contents trimBoth  "chunk end marker found"]].
+                 result nextPut: char].
+	^nil "a chunk needs to end with !!"
+! !
 
-visitDynamicArrayNode: aNode
-	self visitNode: aNode
-!
+!ChunkParser class methodsFor: 'not yet classified'!
 
-visitDynamicDictionaryNode: aNode
-	self visitNode: aNode
+on: aStream
+	^self new stream: aStream
 ! !
 
 Object subclass: #DoIt
 	instanceVariableNames: ''
-	category: 'Compiler'!
-
-Object subclass: #Importer
-	instanceVariableNames: ''
-	category: 'Compiler'!
-
-!Importer methodsFor: 'fileIn'!
-
-import: aStream
-    | chunk result parser lastEmpty |
-    parser := ChunkParser on: aStream.
-    lastEmpty := false.
-    [chunk := parser nextChunk.
-     chunk isNil] whileFalse: [
-        chunk isEmpty
-       		ifTrue: [lastEmpty := true]
-       		ifFalse: [
-        		result := Compiler new loadExpression: chunk.
-        		lastEmpty 
-            			ifTrue: [
-                                  	lastEmpty := false.
-                                  	result scanFrom: parser]]]
-! !
+	package: 'Compiler'!
 
 Object subclass: #Exporter
 	instanceVariableNames: ''
-	category: 'Compiler'!
+	package: 'Compiler'!
 
 !Exporter methodsFor: 'fileOut'!
 
-exportPackage: packageName
-	"Export a given package by name."
-
-	| package |
-	^String streamContents: [:stream |
-                package := Smalltalk current packageAt: packageName.
-                self exportPackageDefinitionOf: package on: stream.
-		"Export classes in dependency order"
-	    	package sortedClasses do: [:each |
-                        stream nextPutAll: (self exportClass: each)].
-		self exportPackageExtensionsOf: package on: stream]
-!
-
 exportAll
     "Export all packages in the system."
 
@@ -133,10 +66,32 @@ exportClass: aClass
 		self exportMethodsOf: aClass on: stream.
 		self exportMetaDefinitionOf: aClass on: stream.
 		self exportMethodsOf: aClass class on: stream]
+!
+
+exportPackage: packageName
+	"Export a given package by name."
+
+	| package |
+	^String streamContents: [:stream |
+                package := Smalltalk current packageAt: packageName.
+                self exportPackageDefinitionOf: package on: stream.
+		"Export classes in dependency order"
+	    	package sortedClasses do: [:each |
+                        stream nextPutAll: (self exportClass: each)].
+		self exportPackageExtensionsOf: package on: stream]
 ! !
 
 !Exporter methodsFor: 'private'!
 
+classNameFor: aClass
+	^aClass isMetaclass
+	    ifTrue: [aClass instanceClass name, '.klass']
+	    ifFalse: [
+		aClass isNil
+		    ifTrue: ['nil']
+		    ifFalse: [aClass name]]
+!
+
 exportDefinitionOf: aClass on: aStream
 	aStream 
 	    nextPutAll: 'smalltalk.addClass(';
@@ -171,22 +126,6 @@ exportMetaDefinitionOf: aClass on: aStream
 	    aStream nextPutAll: '];', String lf]
 !
 
-exportMethodsOf: aClass on: aStream
-	aClass methodDictionary values do: [:each |
-		(each category match: '^\*') ifFalse: [
-			self exportMethod: each of: aClass on: aStream]].
-	aStream lf
-!
-
-classNameFor: aClass
-	^aClass isMetaclass
-	    ifTrue: [aClass instanceClass name, '.klass']
-	    ifFalse: [
-		aClass isNil
-		    ifTrue: ['nil']
-		    ifFalse: [aClass name]]
-!
-
 exportMethod: aMethod of: aClass on: aStream
 	aStream 
 		nextPutAll: 'smalltalk.addMethod(';lf;
@@ -206,13 +145,13 @@ exportMethod: aMethod of: aClass on: aStream
 		nextPutAll: ');';lf;lf
 !
 
-exportPackageExtensionsOf: package on: aStream
-	| name |
-	name := package name.
-	Smalltalk current classes, (Smalltalk current classes collect: [:each | each class]) do: [:each |
-		each methodDictionary values do: [:method |
-			method category = ('*', name) ifTrue: [
-				self exportMethod: method of: each on: aStream]]]
+exportMethodsOf: aClass on: aStream
+	"Issue #143: sort methods alphabetically"
+
+	((aClass methodDictionary values) sorted: [:a :b | a selector <= b selector]) do: [:each |
+		(each category match: '^\*') ifFalse: [
+			self exportMethod: each of: aClass on: aStream]].
+	aStream lf
 !
 
 exportPackageDefinitionOf: package on: aStream
@@ -220,81 +159,222 @@ exportPackageDefinitionOf: package on: aStream
 	    nextPutAll: 'smalltalk.addPackage(';
 	    nextPutAll: '''', package name, ''', ', package propertiesAsJSON , ');'.
 	aStream lf
-! !
-
-Object subclass: #ChunkParser
-	instanceVariableNames: 'stream'
-	category: 'Compiler'!
+!
 
-!ChunkParser methodsFor: 'accessing'!
+exportPackageExtensionsOf: package on: aStream
+	"Issue #143: sort classes and methods alphabetically"
 
-stream: aStream
-	stream := aStream
+	| name |
+	name := package name.
+	(Package sortedClasses: Smalltalk current classes) do: [:each |
+		{each. each class} do: [:aClass | 
+			((aClass methodDictionary values) sorted: [:a :b | a selector <= b selector]) do: [:method |
+				(method category match: '^\*', name) ifTrue: [
+					self exportMethod: method of: each on: aStream ]]]]
 ! !
 
-!ChunkParser methodsFor: 'reading'!
+Exporter subclass: #ChunkExporter
+	instanceVariableNames: ''
+	package: 'Compiler'!
 
-nextChunk
-	"The chunk format (Smalltalk Interchange Format or Fileout format)
-	is a trivial format but can be a bit tricky to understand:
-		- Uses the exclamation mark as delimiter of chunks.
-		- Inside a chunk a normal exclamation mark must be doubled.
-		- A non empty chunk must be a valid Smalltalk expression.
-		- A chunk on top level with a preceding empty chunk is an instruction chunk:
-			- The object created by the expression then takes over reading chunks.
+!ChunkExporter methodsFor: 'not yet classified'!
 
-	This metod returns next chunk as a String (trimmed), empty String (all whitespace) or nil."
+chunkEscape: aString
+	"Replace all occurrences of !! with !!!! and trim at both ends."
 
-	| char result chunk |
-	result := '' writeStream.
-        [char := stream next.
-        char notNil] whileTrue: [
-                 char = '!!' ifTrue: [
-                         stream peek = '!!'
-                                ifTrue: [stream next "skipping the escape double"]
-                                ifFalse: [^result contents trimBoth  "chunk end marker found"]].
-                 result nextPut: char].
-	^nil "a chunk needs to end with !!"
-! !
+	^(aString replace: '!!' with: '!!!!') trimBoth
+!
 
-!ChunkParser class methodsFor: 'not yet classified'!
+classNameFor: aClass
+	^aClass isMetaclass
+	    ifTrue: [aClass instanceClass name, ' class']
+	    ifFalse: [
+		aClass isNil
+		    ifTrue: ['nil']
+		    ifFalse: [aClass name]]
+!
 
-on: aStream
-	^self new stream: aStream
-! !
+exportDefinitionOf: aClass on: aStream
+    "Chunk format."
+
+    aStream 
+        nextPutAll: (self classNameFor: aClass superclass);
+        nextPutAll: ' subclass: #', (self classNameFor: aClass); lf;
+        nextPutAll: '	instanceVariableNames: '''.
+    aClass instanceVariableNames 
+        do: [:each | aStream nextPutAll: each]
+        separatedBy: [aStream nextPutAll: ' '].
+    aStream 
+        nextPutAll: ''''; lf;
+        nextPutAll: '	package: ''', aClass category, '''!!'; lf.
+    aClass comment notEmpty ifTrue: [
+        aStream 
+        nextPutAll: '!!', (self classNameFor: aClass), ' commentStamp!!';lf;
+        nextPutAll: (self chunkEscape: aClass comment), '!!';lf].
+    aStream lf
+!
 
-Object subclass: #Node
-	instanceVariableNames: 'nodes'
-	category: 'Compiler'!
+exportMetaDefinitionOf: aClass on: aStream
 
-!Node methodsFor: 'accessing'!
+	aClass class instanceVariableNames isEmpty ifFalse: [
+		aStream 
+		    nextPutAll: (self classNameFor: aClass class);
+		    nextPutAll: ' instanceVariableNames: '''.
+		aClass class instanceVariableNames 
+		    do: [:each | aStream nextPutAll: each]
+		    separatedBy: [aStream nextPutAll: ' '].
+		aStream	
+		    nextPutAll: '''!!'; lf; lf]
+!
 
-nodes
-	^nodes ifNil: [nodes := Array new]
+exportMethod: aMethod of: aClass on: aStream
+	aStream 
+		lf; lf; nextPutAll: (self chunkEscape: aMethod source); lf;
+		nextPutAll: '!!'
 !
 
-addNode: aNode
-	self nodes add: aNode
-! !
+exportMethods: methods category: category of: aClass on: aStream
+	"Issue #143: sort methods alphabetically"
 
-!Node methodsFor: 'building'!
+	aStream
+		nextPutAll: '!!', (self classNameFor: aClass);
+		nextPutAll: ' methodsFor: ''', category, '''!!'.
+		(methods sorted: [:a :b | a selector <= b selector]) do: [:each |
+				self exportMethod: each of: aClass on: aStream].
+	aStream nextPutAll: ' !!'; lf; lf
+!
 
-nodes: aCollection
-	nodes := aCollection
+exportMethodsOf: aClass on: aStream
+	"Issue #143: sort protocol alphabetically"
+
+	| map |
+	map := Dictionary new.
+	aClass protocolsDo: [:category :methods | 
+		(category match: '^\*') ifFalse: [ map at: category put: methods ]].
+	(map keys sorted: [:a :b | a <= b ]) do: [:category | | methods |
+		methods := map at: category.
+		self
+			exportMethods: methods
+			category: category
+			of: aClass
+			on: aStream ]
+!
+
+exportPackageDefinitionOf: package on: aStream
+	"Chunk format."
+
+	aStream 
+	    nextPutAll: 'Smalltalk current createPackage: ''', package name,
+		''' properties: ', package properties storeString, '!!'; lf.
+!
+
+exportPackageExtensionsOf: package on: aStream
+	"We need to override this one too since we need to group
+	all methods in a given protocol under a leading methodsFor: chunk
+	for that class."
+
+	"Issue #143: sort protocol alphabetically"
+
+	| name map |
+	name := package name.
+	(Package sortedClasses: Smalltalk current classes) do: [:each |
+		{each. each class} do: [:aClass |
+			map := Dictionary new.
+			aClass protocolsDo: [:category :methods | 
+				(category match: '^\*', name) ifTrue: [ map at: category put: methods ]].
+			(map keys sorted: [:a :b | a <= b ]) do: [:category | | methods |
+				methods := map at: category.	
+				self exportMethods: methods category: category of: each on: aStream ]]]
 ! !
 
-!Node methodsFor: 'testing'!
+Exporter subclass: #StrippedExporter
+	instanceVariableNames: ''
+	package: 'Compiler'!
 
-isValueNode
-	^false
+!StrippedExporter methodsFor: 'private'!
+
+exportDefinitionOf: aClass on: aStream
+	aStream 
+	    nextPutAll: 'smalltalk.addClass(';
+	    nextPutAll: '''', (self classNameFor: aClass), ''', ';
+	    nextPutAll: 'smalltalk.', (self classNameFor: aClass superclass);
+	    nextPutAll: ', ['.
+	aClass instanceVariableNames 
+	    do: [:each | aStream nextPutAll: '''', each, '''']
+	    separatedBy: [aStream nextPutAll: ', '].
+	aStream	
+	    nextPutAll: '], ''';
+	    nextPutAll: aClass category, '''';
+	    nextPutAll: ');'.
+	aStream lf
 !
 
+exportMethod: aMethod of: aClass on: aStream
+	aStream 
+		nextPutAll: 'smalltalk.addMethod(';lf;
+		nextPutAll: 'unescape(''', aMethod selector asSelector escaped, '''),';lf;
+		nextPutAll: 'smalltalk.method({';lf;
+		nextPutAll: 'selector: unescape(''', aMethod selector escaped, '''),';lf;
+		nextPutAll: 'fn: ', aMethod fn compiledSource;lf;
+		nextPutAll: '}),';lf;
+		nextPutAll: 'smalltalk.', (self classNameFor: aClass);
+		nextPutAll: ');';lf;lf
+! !
+
+Object subclass: #Importer
+	instanceVariableNames: ''
+	package: 'Compiler'!
+
+!Importer methodsFor: 'fileIn'!
+
+import: aStream
+    | chunk result parser lastEmpty |
+    parser := ChunkParser on: aStream.
+    lastEmpty := false.
+    [chunk := parser nextChunk.
+     chunk isNil] whileFalse: [
+        chunk isEmpty
+       		ifTrue: [lastEmpty := true]
+       		ifFalse: [
+        		result := Compiler new loadExpression: chunk.
+        		lastEmpty 
+            			ifTrue: [
+                                  	lastEmpty := false.
+                                  	result scanFrom: parser]]]
+! !
+
+Object subclass: #Node
+	instanceVariableNames: 'nodes'
+	package: 'Compiler'!
+
+!Node methodsFor: 'accessing'!
+
+addNode: aNode
+	self nodes add: aNode
+!
+
+nodes
+	^nodes ifNil: [nodes := Array new]
+! !
+
+!Node methodsFor: 'building'!
+
+nodes: aCollection
+	nodes := aCollection
+! !
+
+!Node methodsFor: 'testing'!
+
 isBlockNode
 	^false
 !
 
 isBlockSequenceNode
 	^false
+!
+
+isValueNode
+	^false
 ! !
 
 !Node methodsFor: 'visiting'!
@@ -303,227 +383,181 @@ accept: aVisitor
 	aVisitor visitNode: self
 ! !
 
-Node subclass: #SequenceNode
-	instanceVariableNames: 'temps'
-	category: 'Compiler'!
+Node subclass: #AssignmentNode
+	instanceVariableNames: 'left right'
+	package: 'Compiler'!
 
-!SequenceNode methodsFor: 'accessing'!
+!AssignmentNode methodsFor: 'accessing'!
 
-temps
-	^temps ifNil: [#()]
+left
+	^left
 !
 
-temps: aCollection
-	temps := aCollection
-! !
-
-!SequenceNode methodsFor: 'testing'!
-
-asBlockSequenceNode
-	^BlockSequenceNode new
-	    nodes: self nodes;
-	    temps: self temps;
-	    yourself
-! !
+left: aNode
+	left := aNode.
+	left assigned: true
+!
 
-!SequenceNode methodsFor: 'visiting'!
+right
+	^right
+!
 
-accept: aVisitor
-	aVisitor visitSequenceNode: self
+right: aNode
+	right := aNode
 ! !
 
-Node subclass: #DynamicDictionaryNode
-	instanceVariableNames: ''
-	category: 'Compiler'!
-
-!DynamicDictionaryNode methodsFor: 'visiting'!
+!AssignmentNode methodsFor: 'visiting'!
 
 accept: aVisitor
-	aVisitor visitDynamicDictionaryNode: self
+	aVisitor visitAssignmentNode: self
 ! !
 
-Node subclass: #ReturnNode
-	instanceVariableNames: ''
-	category: 'Compiler'!
-
-!ReturnNode methodsFor: 'visiting'!
+Node subclass: #BlockNode
+	instanceVariableNames: 'parameters inlined'
+	package: 'Compiler'!
 
-accept: aVisitor
-	aVisitor visitReturnNode: self
-! !
+!BlockNode methodsFor: 'accessing'!
 
-Node subclass: #ValueNode
-	instanceVariableNames: 'value'
-	category: 'Compiler'!
+inlined
+	^inlined ifNil: [false]
+!
 
-!ValueNode methodsFor: 'accessing'!
+inlined: aBoolean
+	inlined := aBoolean
+!
 
-value
-	^value
+parameters
+	^parameters ifNil: [parameters := Array new]
 !
 
-value: anObject
-	value := anObject
+parameters: aCollection
+	parameters := aCollection
 ! !
 
-!ValueNode methodsFor: 'testing'!
+!BlockNode methodsFor: 'testing'!
 
-isValueNode
+isBlockNode
 	^true
 ! !
 
-!ValueNode methodsFor: 'visiting'!
+!BlockNode methodsFor: 'visiting'!
 
 accept: aVisitor
-	aVisitor visitValueNode: self
+	aVisitor visitBlockNode: self
 ! !
 
-ValueNode subclass: #VariableNode
-	instanceVariableNames: 'assigned'
-	category: 'Compiler'!
+Node subclass: #CascadeNode
+	instanceVariableNames: 'receiver'
+	package: 'Compiler'!
 
-!VariableNode methodsFor: 'accessing'!
+!CascadeNode methodsFor: 'accessing'!
 
-assigned
-	^assigned ifNil: [false]
+receiver
+	^receiver
 !
 
-assigned: aBoolean
-	assigned := aBoolean
+receiver: aNode
+	receiver := aNode
 ! !
 
-!VariableNode methodsFor: 'visiting'!
+!CascadeNode methodsFor: 'visiting'!
 
 accept: aVisitor
-	aVisitor visitVariableNode: self
+	aVisitor visitCascadeNode: self
 ! !
 
-Exporter subclass: #ChunkExporter
+Node subclass: #DynamicArrayNode
 	instanceVariableNames: ''
-	category: 'Compiler'!
+	package: 'Compiler'!
 
-!ChunkExporter methodsFor: 'not yet classified'!
+!DynamicArrayNode methodsFor: 'visiting'!
 
-exportDefinitionOf: aClass on: aStream
-	"Chunk format."
+accept: aVisitor
+	aVisitor visitDynamicArrayNode: self
+! !
 
-	aStream 
-	    nextPutAll: (self classNameFor: aClass superclass);
-	    nextPutAll: ' subclass: #', (self classNameFor: aClass); lf;
-	    nextPutAll: '	instanceVariableNames: '''.
-	aClass instanceVariableNames 
-	    do: [:each | aStream nextPutAll: each]
-	    separatedBy: [aStream nextPutAll: ' '].
-	aStream	
-	    nextPutAll: ''''; lf;
-	    nextPutAll: '	category: ''', aClass category, '''!!'; lf.
- 	aClass comment notEmpty ifTrue: [
-	    aStream 
-		nextPutAll: '!!', (self classNameFor: aClass), ' commentStamp!!';lf;
-		nextPutAll: (self chunkEscape: aClass comment), '!!';lf].
-	aStream lf
-!
+Node subclass: #DynamicDictionaryNode
+	instanceVariableNames: ''
+	package: 'Compiler'!
 
-exportMethod: aMethod of: aClass on: aStream
-	aStream 
-		lf; lf; nextPutAll: (self chunkEscape: aMethod source); lf;
-		nextPutAll: '!!'
-!
+!DynamicDictionaryNode methodsFor: 'visiting'!
 
-exportMethodsOf: aClass on: aStream
+accept: aVisitor
+	aVisitor visitDynamicDictionaryNode: self
+! !
 
-   aClass protocolsDo: [:category :methods |
-	(category match: '^\*') ifFalse: [ 
-		self
-			exportMethods: methods
-			category: category
-			of: aClass
-			on: aStream]]
-!
+Node subclass: #JSStatementNode
+	instanceVariableNames: 'source'
+	package: 'Compiler'!
 
-exportMetaDefinitionOf: aClass on: aStream
+!JSStatementNode methodsFor: 'accessing'!
 
-	aClass class instanceVariableNames isEmpty ifFalse: [
-		aStream 
-		    nextPutAll: (self classNameFor: aClass class);
-		    nextPutAll: ' instanceVariableNames: '''.
-		aClass class instanceVariableNames 
-		    do: [:each | aStream nextPutAll: each]
-		    separatedBy: [aStream nextPutAll: ' '].
-		aStream	
-		    nextPutAll: '''!!'; lf; lf]
+source
+	^source ifNil: ['']
 !
 
-classNameFor: aClass
-	^aClass isMetaclass
-	    ifTrue: [aClass instanceClass name, ' class']
-	    ifFalse: [
-		aClass isNil
-		    ifTrue: ['nil']
-		    ifFalse: [aClass name]]
-!
+source: aString
+	source := aString
+! !
 
-chunkEscape: aString
-	"Replace all occurrences of !! with !!!! and trim at both ends."
+!JSStatementNode methodsFor: 'visiting'!
 
-	^(aString replace: '!!' with: '!!!!') trimBoth
+accept: aVisitor
+	aVisitor visitJSStatementNode: self
+! !
+
+Node subclass: #MethodNode
+	instanceVariableNames: 'selector arguments source'
+	package: 'Compiler'!
+
+!MethodNode methodsFor: 'accessing'!
+
+arguments
+	^arguments ifNil: [#()]
 !
 
-exportMethods: methods category: category of: aClass on: aStream
+arguments: aCollection
+	arguments := aCollection
+!
 
-	aStream
-		nextPutAll: '!!', (self classNameFor: aClass);
-		nextPutAll: ' methodsFor: ''', category, '''!!'.
-    	methods do: [:each |
-		self exportMethod: each of: aClass on: aStream].
-	aStream nextPutAll: ' !!'; lf; lf
+selector
+	^selector
 !
 
-exportPackageExtensionsOf: package on: aStream
-	"We need to override this one too since we need to group
-	all methods in a given protocol under a leading methodsFor: chunk
-	for that class."
+selector: aString
+	selector := aString
+!
 
-	| name |
-	name := package name.
-	Smalltalk current classes, (Smalltalk current classes collect: [:each | each class]) do: [:each |
-		each protocolsDo: [:category :methods |
-			category = ('*', name) ifTrue: [
-				self exportMethods: methods category: category of: each on: aStream]]]
+source
+	^source
 !
 
-exportPackageDefinitionOf: package on: aStream
-	"Chunk format."
+source: aString
+	source := aString
+! !
 
-	aStream 
-	    nextPutAll: 'Smalltalk current createPackage: ''', package name,
-		''' properties: ', package properties storeString, '!!'; lf.
+!MethodNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitMethodNode: self
 ! !
 
-VariableNode subclass: #ClassReferenceNode
+Node subclass: #ReturnNode
 	instanceVariableNames: ''
-	category: 'Compiler'!
+	package: 'Compiler'!
 
-!ClassReferenceNode methodsFor: 'visiting'!
+!ReturnNode methodsFor: 'visiting'!
 
 accept: aVisitor
-	aVisitor visitClassReferenceNode: self
+	aVisitor visitReturnNode: self
 ! !
 
 Node subclass: #SendNode
 	instanceVariableNames: 'selector arguments receiver'
-	category: 'Compiler'!
+	package: 'Compiler'!
 
 !SendNode methodsFor: 'accessing'!
 
-selector
-	^selector
-!
-
-selector: aString
-	selector := aString
-!
-
 arguments
 	^arguments ifNil: [arguments := #()]
 !
@@ -532,6 +566,18 @@ arguments: aCollection
 	arguments := aCollection
 !
 
+cascadeNodeWithMessages: aCollection
+	| first |
+	first := SendNode new
+	    selector: self selector;
+	    arguments: self arguments;
+	    yourself.
+	^CascadeNode new
+	    receiver: self receiver;
+	    nodes: (Array with: first), aCollection;
+	    yourself
+!
+
 receiver
 	^receiver
 !
@@ -540,6 +586,14 @@ receiver: aNode
 	receiver := aNode
 !
 
+selector
+	^selector
+!
+
+selector: aString
+	selector := aString
+!
+
 valueForReceiver: anObject
 	^SendNode new
 	    receiver: (self receiver 
@@ -548,93 +602,205 @@ valueForReceiver: anObject
 	    selector: self selector;
 	    arguments: self arguments;
 	    yourself
+! !
+
+!SendNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitSendNode: self
+! !
+
+Node subclass: #SequenceNode
+	instanceVariableNames: 'temps'
+	package: 'Compiler'!
+
+!SequenceNode methodsFor: 'accessing'!
+
+temps
+	^temps ifNil: [#()]
 !
 
-cascadeNodeWithMessages: aCollection
-	| first |
-	first := SendNode new
-	    selector: self selector;
-	    arguments: self arguments;
-	    yourself.
-	^CascadeNode new
-	    receiver: self receiver;
-	    nodes: (Array with: first), aCollection;
+temps: aCollection
+	temps := aCollection
+! !
+
+!SequenceNode methodsFor: 'testing'!
+
+asBlockSequenceNode
+	^BlockSequenceNode new
+	    nodes: self nodes;
+	    temps: self temps;
 	    yourself
 ! !
 
-!SendNode methodsFor: 'visiting'!
+!SequenceNode methodsFor: 'visiting'!
 
 accept: aVisitor
-	aVisitor visitSendNode: self
+	aVisitor visitSequenceNode: self
 ! !
 
-Node subclass: #JSStatementNode
-	instanceVariableNames: 'source'
-	category: 'Compiler'!
+SequenceNode subclass: #BlockSequenceNode
+	instanceVariableNames: ''
+	package: 'Compiler'!
 
-!JSStatementNode methodsFor: 'accessing'!
+!BlockSequenceNode methodsFor: 'testing'!
 
-source
-	^source ifNil: ['']
+isBlockSequenceNode
+	^true
+! !
+
+!BlockSequenceNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitBlockSequenceNode: self
+! !
+
+Node subclass: #ValueNode
+	instanceVariableNames: 'value'
+	package: 'Compiler'!
+
+!ValueNode methodsFor: 'accessing'!
+
+value
+	^value
+!
+
+value: anObject
+	value := anObject
+! !
+
+!ValueNode methodsFor: 'testing'!
+
+isValueNode
+	^true
+! !
+
+!ValueNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitValueNode: self
+! !
+
+ValueNode subclass: #VariableNode
+	instanceVariableNames: 'assigned'
+	package: 'Compiler'!
+
+!VariableNode methodsFor: 'accessing'!
+
+assigned
+	^assigned ifNil: [false]
+!
+
+assigned: aBoolean
+	assigned := aBoolean
+! !
+
+!VariableNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitVariableNode: self
+! !
+
+VariableNode subclass: #ClassReferenceNode
+	instanceVariableNames: ''
+	package: 'Compiler'!
+
+!ClassReferenceNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitClassReferenceNode: self
+! !
+
+Object subclass: #NodeVisitor
+	instanceVariableNames: ''
+	package: 'Compiler'!
+
+!NodeVisitor methodsFor: 'visiting'!
+
+visit: aNode
+	aNode accept: self
+!
+
+visitAssignmentNode: aNode
+	self visitNode: aNode
 !
 
-source: aString
-	source := aString
-! !
+visitBlockNode: aNode
+	self visitNode: aNode
+!
 
-!JSStatementNode methodsFor: 'visiting'!
+visitBlockSequenceNode: aNode
+	self visitSequenceNode: aNode
+!
 
-accept: aVisitor
-	aVisitor visitJSStatementNode: self
-! !
+visitCascadeNode: aNode
+	self visitNode: aNode
+!
 
-Node subclass: #AssignmentNode
-	instanceVariableNames: 'left right'
-	category: 'Compiler'!
+visitClassReferenceNode: aNode
+	self 
+	    nextPutAll: 'smalltalk.';
+	    nextPutAll: aNode value
+!
 
-!AssignmentNode methodsFor: 'accessing'!
+visitDynamicArrayNode: aNode
+	self visitNode: aNode
+!
 
-left
-	^left
+visitDynamicDictionaryNode: aNode
+	self visitNode: aNode
 !
 
-left: aNode
-	left := aNode.
-	left assigned: true
+visitJSStatementNode: aNode
+	self 
+	    nextPutAll: 'function(){';
+	    nextPutAll: aNode source;
+	    nextPutAll: '})()'
 !
 
-right
-	^right
+visitMethodNode: aNode
+	self visitNode: aNode
 !
 
-right: aNode
-	right := aNode
-! !
+visitNode: aNode
+!
 
-!AssignmentNode methodsFor: 'visiting'!
+visitReturnNode: aNode
+	self visitNode: aNode
+!
 
-accept: aVisitor
-	aVisitor visitAssignmentNode: self
-! !
+visitSendNode: aNode
+	self visitNode: aNode
+!
 
-Node subclass: #DynamicArrayNode
-	instanceVariableNames: ''
-	category: 'Compiler'!
+visitSequenceNode: aNode
+	self visitNode: aNode
+!
 
-!DynamicArrayNode methodsFor: 'visiting'!
+visitValueNode: aNode
+	self visitNode: aNode
+!
 
-accept: aVisitor
-	aVisitor visitDynamicArrayNode: self
+visitVariableNode: aNode
 ! !
 
 NodeVisitor subclass: #Compiler
 	instanceVariableNames: 'stream nestedBlocks earlyReturn currentClass currentSelector unknownVariables tempVariables messageSends referencedClasses classReferenced source argVariables'
-	category: 'Compiler'!
+	package: 'Compiler'!
 
 !Compiler methodsFor: 'accessing'!
 
-parser
-	^SmalltalkParser new
+argVariables
+	^argVariables copy
+!
+
+classNameFor: aClass
+	^aClass isMetaclass
+	    ifTrue: [aClass instanceClass name, '.klass']
+	    ifFalse: [
+		aClass isNil
+		    ifTrue: ['nil']
+		    ifFalse: [aClass name]]
 !
 
 currentClass
@@ -645,18 +811,6 @@ currentClass: aClass
 	currentClass := aClass
 !
 
-unknownVariables
-	^unknownVariables copy
-!
-
-pseudoVariables
-	^#('self' 'super' 'true' 'false' 'nil' 'thisContext')
-!
-
-tempVariables
-	^tempVariables copy
-!
-
 knownVariables
 	^self pseudoVariables 
 		addAll: self tempVariables;
@@ -664,13 +818,18 @@ knownVariables
 		yourself
 !
 
-classNameFor: aClass
-	^aClass isMetaclass
-	    ifTrue: [aClass instanceClass name, '.klass']
-	    ifFalse: [
-		aClass isNil
-		    ifTrue: ['nil']
-		    ifFalse: [aClass name]]
+parser
+	^SmalltalkParser new
+!
+
+pseudoVariables
+	^#('self' 'super' 'true' 'false' 'nil' 'thisContext')
+!
+
+safeVariableNameFor: aString
+	^(Smalltalk current reservedWords includes: aString)
+		ifTrue: [aString, '_']
+		ifFalse: [aString]
 !
 
 source
@@ -681,31 +840,18 @@ source: aString
 	source := aString
 !
 
-argVariables
-	^argVariables copy
+tempVariables
+	^tempVariables copy
 !
 
-safeVariableNameFor: aString
-	^(Smalltalk current reservedWords includes: aString)
-		ifTrue: [aString, '_']
-		ifFalse: [aString]
+unknownVariables
+	^unknownVariables copy
 ! !
 
 !Compiler methodsFor: 'compiling'!
 
-loadExpression: aString
-	| result |
-	DoIt addCompiledMethod: (self eval: (self compileExpression: aString)).
-	result := DoIt new doIt.
-	DoIt removeCompiledMethod: (DoIt methodDictionary at: 'doIt').
-	^result
-!
-
-load: aString forClass: aClass
-	| compiled |
-	compiled := self eval: (self compile: aString forClass: aClass).
-	self setupClass: aClass.
-	^compiled
+compile: aString
+	^self compileNode: (self parse: aString)
 !
 
 compile: aString forClass: aClass
@@ -720,18 +866,29 @@ compileExpression: aString
 	^self compileNode: (self parse: self source)
 !
 
+compileNode: aNode
+	stream := '' writeStream.
+	self visit: aNode.
+	^stream contents
+!
+
 eval: aString
 	<return eval(aString)>
 !
 
-compile: aString
-	^self compileNode: (self parse: aString)
+load: aString forClass: aClass
+	| compiled |
+	compiled := self eval: (self compile: aString forClass: aClass).
+	self setupClass: aClass.
+	^compiled
 !
 
-compileNode: aNode
-	stream := '' writeStream.
-	self visit: aNode.
-	^stream contents
+loadExpression: aString
+	| result |
+	DoIt addCompiledMethod: (self eval: (self compileExpression: aString)).
+	result := DoIt new doIt.
+	DoIt removeCompiledMethod: (DoIt methodDictionary at: 'doIt').
+	^result
 !
 
 parse: aString
@@ -742,40 +899,135 @@ parseExpression: aString
     ^self parse: 'doIt ^[', aString, '] value'
 !
 
-recompile: aClass
-	aClass methodDictionary do: [:each || method |
-		method := self load: each source forClass: aClass.
-		method category: each category.
-		aClass addCompiledMethod: method].
-	aClass isMetaclass ifFalse: [self recompile: aClass class]
-!
+recompile: aClass
+	aClass methodDictionary do: [:each || method |
+		method := self load: each source forClass: aClass.
+		method category: each category.
+		aClass addCompiledMethod: method].
+	aClass isMetaclass ifFalse: [self recompile: aClass class]
+!
+
+recompileAll
+	Smalltalk current classes do: [:each |
+		Transcript show: each; cr.
+		[self recompile: each] valueWithTimeout: 100]
+!
+
+setupClass: aClass
+	<smalltalk.init(aClass)>
+! !
+
+!Compiler methodsFor: 'initialization'!
+
+initialize
+	super initialize.
+	stream := '' writeStream. 
+	unknownVariables := #().
+	tempVariables := #().
+	argVariables := #().
+	messageSends := #().
+	classReferenced := #()
+! !
+
+!Compiler methodsFor: 'optimizations'!
+
+checkClass: aClassName for: receiver
+        stream nextPutAll: '((($receiver = ', receiver, ').klass === smalltalk.', aClassName, ') ? '
+!
+
+inline: aSelector receiver: receiver argumentNodes: aCollection
+        | inlined |
+        inlined := false.
+
+	"-- Booleans --"
+
+	(aSelector = 'ifFalse:') ifTrue: [
+		aCollection first isBlockNode ifTrue: [
+                	self checkClass: 'Boolean' for: receiver.
+                	stream nextPutAll: '(!! $receiver ? '.
+                	self visit: aCollection first.
+          		stream nextPutAll: '() : nil)'.
+                	inlined := true]].
+
+	(aSelector = 'ifTrue:') ifTrue: [
+		aCollection first isBlockNode ifTrue: [
+                	self checkClass: 'Boolean' for: receiver.
+                	stream nextPutAll: '($receiver ? '.
+                	self visit: aCollection first.
+          		stream nextPutAll: '() : nil)'.
+                	inlined := true]].
+
+	(aSelector = 'ifTrue:ifFalse:') ifTrue: [
+		(aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
+                	self checkClass: 'Boolean' for: receiver.
+                	stream nextPutAll: '($receiver ? '.
+                	self visit: aCollection first.
+          		stream nextPutAll: '() : '.
+          		self visit: aCollection second.
+          		stream nextPutAll: '())'.
+                	inlined := true]].
+
+	(aSelector = 'ifFalse:ifTrue:') ifTrue: [
+		(aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
+                	self checkClass: 'Boolean' for: receiver.
+                	stream nextPutAll: '(!! $receiver ? '.
+                	self visit: aCollection first.
+          		stream nextPutAll: '() : '.
+          		self visit: aCollection second.
+          		stream nextPutAll: '())'.
+                	inlined := true]].
+
+	"-- Numbers --"
+
+	(aSelector = '<') ifTrue: [
+                self checkClass: 'Number' for: receiver.
+                stream nextPutAll: '$receiver <'.
+                self visit: aCollection first.
+                inlined := true].
+
+	(aSelector = '<=') ifTrue: [
+                self checkClass: 'Number' for: receiver.
+                stream nextPutAll: '$receiver <='.
+                self visit: aCollection first.
+                inlined := true].
+
+	(aSelector = '>') ifTrue: [ 
+                self checkClass: 'Number' for: receiver.
+                stream nextPutAll: '$receiver >'.
+                self visit: aCollection first.
+                inlined := true].
 
-recompileAll
-	Smalltalk current classes do: [:each |
-		Transcript show: each; cr.
-		[self recompile: each] valueWithTimeout: 100]
-!
+	(aSelector = '>=') ifTrue: [
+                self checkClass: 'Number' for: receiver.
+                stream nextPutAll: '$receiver >='.
+                self visit: aCollection first.
+                inlined := true].
 
-setupClass: aClass
-	<smalltalk.init(aClass)>
-! !
+        (aSelector = '+') ifTrue: [
+                self checkClass: 'Number' for: receiver.
+                stream nextPutAll: '$receiver +'.
+                self visit: aCollection first.
+                inlined := true].
 
-!Compiler methodsFor: 'initialization'!
+        (aSelector = '-') ifTrue: [
+                self checkClass: 'Number' for: receiver.
+                stream nextPutAll: '$receiver -'.
+                self visit: aCollection first.
+                inlined := true].
 
-initialize
-	super initialize.
-	stream := '' writeStream. 
-	unknownVariables := #().
-	tempVariables := #().
-	argVariables := #().
-	messageSends := #().
-	classReferenced := #()
-! !
+        (aSelector = '*') ifTrue: [
+                self checkClass: 'Number' for: receiver.
+                stream nextPutAll: '$receiver *'.
+                self visit: aCollection first.
+                inlined := true].
 
-!Compiler methodsFor: 'optimizations'!
+        (aSelector = '/') ifTrue: [
+                self checkClass: 'Number' for: receiver.
+                stream nextPutAll: '$receiver /'.
+                self visit: aCollection first.
+                inlined := true].
 
-checkClass: aClassName for: receiver
-        stream nextPutAll: '((($receiver = ', receiver, ').klass === smalltalk.', aClassName, ') ? '
+        ^inlined
 !
 
 inlineLiteral: aSelector receiverNode: anObject argumentNodes: aCollection
@@ -923,113 +1175,124 @@ isNode: aNode ofClass: aClass
 	^aNode isValueNode and: [
           	aNode value class = aClass or: [
           		aNode value = 'self' and: [self currentClass = aClass]]]
-!
-
-inline: aSelector receiver: receiver argumentNodes: aCollection
-        | inlined |
-        inlined := false.
-
-	"-- Booleans --"
-
-	(aSelector = 'ifFalse:') ifTrue: [
-		aCollection first isBlockNode ifTrue: [
-                	self checkClass: 'Boolean' for: receiver.
-                	stream nextPutAll: '(!! $receiver ? '.
-                	self visit: aCollection first.
-          		stream nextPutAll: '() : nil)'.
-                	inlined := true]].
-
-	(aSelector = 'ifTrue:') ifTrue: [
-		aCollection first isBlockNode ifTrue: [
-                	self checkClass: 'Boolean' for: receiver.
-                	stream nextPutAll: '($receiver ? '.
-                	self visit: aCollection first.
-          		stream nextPutAll: '() : nil)'.
-                	inlined := true]].
-
-	(aSelector = 'ifTrue:ifFalse:') ifTrue: [
-		(aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
-                	self checkClass: 'Boolean' for: receiver.
-                	stream nextPutAll: '($receiver ? '.
-                	self visit: aCollection first.
-          		stream nextPutAll: '() : '.
-          		self visit: aCollection second.
-          		stream nextPutAll: '())'.
-                	inlined := true]].
-
-	(aSelector = 'ifFalse:ifTrue:') ifTrue: [
-		(aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
-                	self checkClass: 'Boolean' for: receiver.
-                	stream nextPutAll: '(!! $receiver ? '.
-                	self visit: aCollection first.
-          		stream nextPutAll: '() : '.
-          		self visit: aCollection second.
-          		stream nextPutAll: '())'.
-                	inlined := true]].
+! !
 
-	"-- Numbers --"
+!Compiler methodsFor: 'testing'!
 
-	(aSelector = '<') ifTrue: [
-                self checkClass: 'Number' for: receiver.
-                stream nextPutAll: '$receiver <'.
-                self visit: aCollection first.
-                inlined := true].
+performOptimizations
+	^self class performOptimizations
+! !
 
-	(aSelector = '<=') ifTrue: [
-                self checkClass: 'Number' for: receiver.
-                stream nextPutAll: '$receiver <='.
-                self visit: aCollection first.
-                inlined := true].
+!Compiler methodsFor: 'visiting'!
 
-	(aSelector = '>') ifTrue: [ 
-                self checkClass: 'Number' for: receiver.
-                stream nextPutAll: '$receiver >'.
-                self visit: aCollection first.
-                inlined := true].
+send: aSelector to: aReceiver arguments: aCollection superSend: aBoolean
+	^String streamContents: [:str || tmp |
+        	tmp := stream.
+		str nextPutAll: 'smalltalk.send('.
+		str nextPutAll: aReceiver.
+		str nextPutAll: ', "', aSelector asSelector, '", ['.
+                stream := str.
+		aCollection
+	    		do: [:each | self visit: each]
+	    		separatedBy: [stream nextPutAll: ', '].
+                stream := tmp.
+                str nextPutAll: ']'.
+		aBoolean ifTrue: [
+			str nextPutAll: ', smalltalk.', (self classNameFor: self currentClass superclass)].
+		str nextPutAll: ')']
+!
 
-	(aSelector = '>=') ifTrue: [
-                self checkClass: 'Number' for: receiver.
-                stream nextPutAll: '$receiver >='.
-                self visit: aCollection first.
-                inlined := true].
+visit: aNode
+	aNode accept: self
+!
 
-        (aSelector = '+') ifTrue: [
-                self checkClass: 'Number' for: receiver.
-                stream nextPutAll: '$receiver +'.
-                self visit: aCollection first.
-                inlined := true].
+visitAssignmentNode: aNode
+	stream nextPutAll: '('.
+	self visit: aNode left.
+	stream nextPutAll: '='.
+	self visit: aNode right.
+	stream nextPutAll: ')'
+!
 
-        (aSelector = '-') ifTrue: [
-                self checkClass: 'Number' for: receiver.
-                stream nextPutAll: '$receiver -'.
-                self visit: aCollection first.
-                inlined := true].
+visitBlockNode: aNode
+	stream nextPutAll: '(function('.
+	aNode parameters 
+	    do: [:each |
+		tempVariables add: each.
+		stream nextPutAll: each]
+	    separatedBy: [stream nextPutAll: ', '].
+	stream nextPutAll: '){'.
+	aNode nodes do: [:each | self visit: each].
+	stream nextPutAll: '})'
+!
 
-        (aSelector = '*') ifTrue: [
-                self checkClass: 'Number' for: receiver.
-                stream nextPutAll: '$receiver *'.
-                self visit: aCollection first.
-                inlined := true].
+visitBlockSequenceNode: aNode
+	| index |
+	nestedBlocks := nestedBlocks + 1.
+	aNode nodes isEmpty
+	    ifTrue: [
+		stream nextPutAll: 'return nil;']
+	    ifFalse: [
+		aNode temps do: [:each | | temp |
+                    temp := self safeVariableNameFor: each.
+		    tempVariables add: temp.
+		    stream nextPutAll: 'var ', temp, '=nil;'; lf].
+		index := 0.
+		aNode nodes do: [:each |
+		    index := index + 1.
+		    index = aNode nodes size ifTrue: [
+			stream nextPutAll: 'return '].
+		    self visit: each.
+		    stream nextPutAll: ';']].
+	nestedBlocks := nestedBlocks - 1
+!
 
-        (aSelector = '/') ifTrue: [
-                self checkClass: 'Number' for: receiver.
-                stream nextPutAll: '$receiver /'.
-                self visit: aCollection first.
-                inlined := true].
+visitCascadeNode: aNode
+	| index |
+	index := 0.
+	(tempVariables includes: '$rec') ifFalse: [
+		tempVariables add: '$rec'].
+	stream nextPutAll: '(function($rec){'.
+	aNode nodes do: [:each |
+	    index := index + 1.
+	    index = aNode nodes size ifTrue: [
+		stream nextPutAll: 'return '].
+	    each receiver: (VariableNode new value: '$rec').
+	    self visit: each.
+	    stream nextPutAll: ';'].
+	stream nextPutAll: '})('.
+	self visit: aNode receiver.
+	stream nextPutAll: ')'
+!
 
-        ^inlined
-! !
+visitClassReferenceNode: aNode
+	(referencedClasses includes: aNode value) ifFalse: [
+		referencedClasses add: aNode value].
+	stream nextPutAll: '(smalltalk.', aNode value, ' || ', aNode value, ')'
+!
 
-!Compiler methodsFor: 'testing'!
+visitDynamicArrayNode: aNode
+	stream nextPutAll: '['.
+	aNode nodes 
+		do: [:each | self visit: each]
+		separatedBy: [stream nextPutAll: ','].
+	stream nextPutAll: ']'
+!
 
-performOptimizations
-	^self class performOptimizations
-! !
+visitDynamicDictionaryNode: aNode
+	stream nextPutAll: 'smalltalk.HashedCollection._fromPairs_(['.
+		aNode nodes 
+			do: [:each | self visit: each]
+			separatedBy: [stream nextPutAll: ','].
+		stream nextPutAll: '])'
+!
 
-!Compiler methodsFor: 'visiting'!
+visitFailure: aFailure
+	self error: aFailure asString
+!
 
-visit: aNode
-	aNode accept: self
+visitJSStatementNode: aNode
+	stream nextPutAll: (aNode source replace: '>>' with: '>')
 !
 
 visitMethodNode: aNode
@@ -1081,50 +1344,6 @@ visitMethodNode: aNode
 	stream nextPutAll: '})'
 !
 
-visitBlockNode: aNode
-	stream nextPutAll: '(function('.
-	aNode parameters 
-	    do: [:each |
-		tempVariables add: each.
-		stream nextPutAll: each]
-	    separatedBy: [stream nextPutAll: ', '].
-	stream nextPutAll: '){'.
-	aNode nodes do: [:each | self visit: each].
-	stream nextPutAll: '})'
-!
-
-visitSequenceNode: aNode
-	aNode temps do: [:each || temp |
-            temp := self safeVariableNameFor: each.
-	    tempVariables add: temp.
-	    stream nextPutAll: 'var ', temp, '=nil;'; lf].
-	aNode nodes do: [:each |
-	    self visit: each.
-	    stream nextPutAll: ';']
-	    separatedBy: [stream lf]
-!
-
-visitBlockSequenceNode: aNode
-	| index |
-	nestedBlocks := nestedBlocks + 1.
-	aNode nodes isEmpty
-	    ifTrue: [
-		stream nextPutAll: 'return nil;']
-	    ifFalse: [
-		aNode temps do: [:each | | temp |
-                    temp := self safeVariableNameFor: each.
-		    tempVariables add: temp.
-		    stream nextPutAll: 'var ', temp, '=nil;'; lf].
-		index := 0.
-		aNode nodes do: [:each |
-		    index := index + 1.
-		    index = aNode nodes size ifTrue: [
-			stream nextPutAll: 'return '].
-		    self visit: each.
-		    stream nextPutAll: ';']].
-	nestedBlocks := nestedBlocks - 1
-!
-
 visitReturnNode: aNode
 	nestedBlocks > 0 ifTrue: [
 	    earlyReturn := true].
@@ -1162,42 +1381,21 @@ visitSendNode: aNode
 		ifFalse: [stream nextPutAll: (self send: aNode selector to: receiver arguments: aNode arguments superSend: superSend)]
 !
 
-visitCascadeNode: aNode
-	| index |
-	index := 0.
-	(tempVariables includes: '$rec') ifFalse: [
-		tempVariables add: '$rec'].
-	stream nextPutAll: '(function($rec){'.
+visitSequenceNode: aNode
+	aNode temps do: [:each || temp |
+            temp := self safeVariableNameFor: each.
+	    tempVariables add: temp.
+	    stream nextPutAll: 'var ', temp, '=nil;'; lf].
 	aNode nodes do: [:each |
-	    index := index + 1.
-	    index = aNode nodes size ifTrue: [
-		stream nextPutAll: 'return '].
-	    each receiver: (VariableNode new value: '$rec').
 	    self visit: each.
-	    stream nextPutAll: ';'].
-	stream nextPutAll: '})('.
-	self visit: aNode receiver.
-	stream nextPutAll: ')'
+	    stream nextPutAll: ';']
+	    separatedBy: [stream lf]
 !
 
 visitValueNode: aNode
 	stream nextPutAll: aNode value asJavascript
 !
 
-visitAssignmentNode: aNode
-	stream nextPutAll: '('.
-	self visit: aNode left.
-	stream nextPutAll: '='.
-	self visit: aNode right.
-	stream nextPutAll: ')'
-!
-
-visitClassReferenceNode: aNode
-	(referencedClasses includes: aNode value) ifFalse: [
-		referencedClasses add: aNode value].
-	stream nextPutAll: '(smalltalk.', aNode value, ' || ', aNode value, ')'
-!
-
 visitVariableNode: aNode
 	| varName |
 	(self currentClass allInstanceVariableNames includes: aNode value) 
@@ -1214,47 +1412,6 @@ visitVariableNode: aNode
                                   	aNode value = 'thisContext'
                                   		ifTrue: [stream nextPutAll: '(smalltalk.getThisContext())']
                 				ifFalse: [stream nextPutAll: varName]]]
-!
-
-visitJSStatementNode: aNode
-	stream nextPutAll: (aNode source replace: '>>' with: '>')
-!
-
-visitFailure: aFailure
-	self error: aFailure asString
-!
-
-send: aSelector to: aReceiver arguments: aCollection superSend: aBoolean
-	^String streamContents: [:str || tmp |
-        	tmp := stream.
-		str nextPutAll: 'smalltalk.send('.
-		str nextPutAll: aReceiver.
-		str nextPutAll: ', "', aSelector asSelector, '", ['.
-                stream := str.
-		aCollection
-	    		do: [:each | self visit: each]
-	    		separatedBy: [stream nextPutAll: ', '].
-                stream := tmp.
-                str nextPutAll: ']'.
-		aBoolean ifTrue: [
-			str nextPutAll: ', smalltalk.', (self classNameFor: self currentClass superclass)].
-		str nextPutAll: ')']
-!
-
-visitDynamicArrayNode: aNode
-	stream nextPutAll: '['.
-	aNode nodes 
-		do: [:each | self visit: each]
-		separatedBy: [stream nextPutAll: ','].
-	stream nextPutAll: ']'
-!
-
-visitDynamicDictionaryNode: aNode
-	stream nextPutAll: 'smalltalk.HashedCollection._fromPairs_(['.
-		aNode nodes 
-			do: [:each | self visit: each]
-			separatedBy: [stream nextPutAll: ','].
-		stream nextPutAll: '])'
 ! !
 
 Compiler class instanceVariableNames: 'performOptimizations'!
@@ -1284,143 +1441,3 @@ recompileAll
 		self recompile: each]
 ! !
 
-SequenceNode subclass: #BlockSequenceNode
-	instanceVariableNames: ''
-	category: 'Compiler'!
-
-!BlockSequenceNode methodsFor: 'testing'!
-
-isBlockSequenceNode
-	^true
-! !
-
-!BlockSequenceNode methodsFor: 'visiting'!
-
-accept: aVisitor
-	aVisitor visitBlockSequenceNode: self
-! !
-
-Node subclass: #BlockNode
-	instanceVariableNames: 'parameters inlined'
-	category: 'Compiler'!
-
-!BlockNode methodsFor: 'accessing'!
-
-parameters
-	^parameters ifNil: [parameters := Array new]
-!
-
-parameters: aCollection
-	parameters := aCollection
-!
-
-inlined
-	^inlined ifNil: [false]
-!
-
-inlined: aBoolean
-	inlined := aBoolean
-! !
-
-!BlockNode methodsFor: 'testing'!
-
-isBlockNode
-	^true
-! !
-
-!BlockNode methodsFor: 'visiting'!
-
-accept: aVisitor
-	aVisitor visitBlockNode: self
-! !
-
-Node subclass: #CascadeNode
-	instanceVariableNames: 'receiver'
-	category: 'Compiler'!
-
-!CascadeNode methodsFor: 'accessing'!
-
-receiver
-	^receiver
-!
-
-receiver: aNode
-	receiver := aNode
-! !
-
-!CascadeNode methodsFor: 'visiting'!
-
-accept: aVisitor
-	aVisitor visitCascadeNode: self
-! !
-
-Node subclass: #MethodNode
-	instanceVariableNames: 'selector arguments source'
-	category: 'Compiler'!
-
-!MethodNode methodsFor: 'accessing'!
-
-selector
-	^selector
-!
-
-selector: aString
-	selector := aString
-!
-
-arguments
-	^arguments ifNil: [#()]
-!
-
-arguments: aCollection
-	arguments := aCollection
-!
-
-source
-	^source
-!
-
-source: aString
-	source := aString
-! !
-
-!MethodNode methodsFor: 'visiting'!
-
-accept: aVisitor
-	aVisitor visitMethodNode: self
-! !
-
-Exporter subclass: #StrippedExporter
-	instanceVariableNames: ''
-	category: 'Compiler'!
-
-!StrippedExporter methodsFor: 'private'!
-
-exportDefinitionOf: aClass on: aStream
-	aStream 
-	    nextPutAll: 'smalltalk.addClass(';
-	    nextPutAll: '''', (self classNameFor: aClass), ''', ';
-	    nextPutAll: 'smalltalk.', (self classNameFor: aClass superclass);
-	    nextPutAll: ', ['.
-	aClass instanceVariableNames 
-	    do: [:each | aStream nextPutAll: '''', each, '''']
-	    separatedBy: [aStream nextPutAll: ', '].
-	aStream	
-	    nextPutAll: '], ''';
-	    nextPutAll: aClass category, '''';
-	    nextPutAll: ');'.
-	aStream lf
-!
-
-exportMethod: aMethod of: aClass on: aStream
-	aStream 
-		nextPutAll: 'smalltalk.addMethod(';lf;
-		nextPutAll: 'unescape(''', aMethod selector asSelector escaped, '''),';lf;
-		nextPutAll: 'smalltalk.method({';lf;
-		nextPutAll: 'selector: unescape(''', aMethod selector escaped, '''),';lf;
-		nextPutAll: 'fn: ', aMethod fn compiledSource;lf;
-		nextPutAll: '}),';lf;
-		nextPutAll: 'smalltalk.', (self classNameFor: aClass);
-		nextPutAll: ');';lf;lf
-! !
-
diff --git a/amber/src/st/Examples.st b/amber/src/st/Examples.st
index 4ce2a0bf08e..2cf7748f8e0 100755
--- a/amber/src/st/Examples.st
+++ b/amber/src/st/Examples.st
@@ -1,17 +1,17 @@
 Smalltalk current createPackage: 'Examples' properties: #{}!
 Widget subclass: #Counter
 	instanceVariableNames: 'count header'
-	category: 'Examples'!
+	package: 'Examples'!
 
 !Counter methodsFor: 'actions'!
 
-increase
-    count := count + 1.
+decrease
+    count := count - 1.
     header contents: [:html | html with: count asString]
 !
 
-decrease
-    count := count - 1.
+increase
+    count := count + 1.
     header contents: [:html | html with: count asString]
 ! !
 
diff --git a/amber/src/st/IDE.st b/amber/src/st/IDE.st
index b2787ca9ec1..7c0e5a4c122 100755
--- a/amber/src/st/IDE.st
+++ b/amber/src/st/IDE.st
@@ -1,299 +1,207 @@
 Smalltalk current createPackage: 'IDE' properties: #{}!
-Widget subclass: #TabManager
-	instanceVariableNames: 'selectedTab tabs opened ul input'
-	category: 'IDE'!
-
-!TabManager methodsFor: 'accessing'!
-
-tabs
-    ^tabs ifNil: [tabs := Array new]
-!
-
-labelFor: aWidget
-	| label maxSize |
-	maxSize := 15.
-	label := aWidget label copyFrom: 0 to: (aWidget label size min: maxSize).
-	aWidget label size > maxSize ifTrue: [
-		label := label, '...'].
-	^label
-! !
-
-!TabManager methodsFor: 'actions'!
-
-updateBodyMargin
-    self setBodyMargin: '#jtalk' asJQuery height
-!
-
-updatePosition
-    <jQuery('#jtalk').css('top', '').css('bottom', '0px')>
-!
-
-removeBodyMargin
-    self setBodyMargin: 0
-!
-
-setBodyMargin: anInteger
-    '.jtalkBody' asJQuery css: 'margin-bottom' put: anInteger asString, 'px'
-!
-
-onResize: aBlock
-    <jQuery('#jtalk').resizable({
-	handles: 'n', 
-	resize: aBlock,
-	minHeight: 230
-})>
-!
-
-onWindowResize: aBlock
-    <jQuery(window).resize(aBlock)>
-!
+Widget subclass: #ClassesList
+	instanceVariableNames: 'browser ul nodes'
+	package: 'IDE'!
 
-open
-    opened ifFalse: [
-	'body' asJQuery addClass: 'jtalkBody'.
-	'#jtalk' asJQuery show.
-	ul asJQuery show.
-	self updateBodyMargin.
-	selectedTab show.
-	opened := true]
-!
+!ClassesList methodsFor: 'accessing'!
 
-close
-    opened ifTrue: [
-	'#jtalk' asJQuery hide.
-	ul asJQuery hide.
-	selectedTab hide.
-	self removeBodyMargin.
-	'body' asJQuery removeClass: 'jtalkBody'.
-	opened := false]
+browser
+	^browser
 !
 
-newBrowserTab
-    Browser open
+browser: aBrowser
+	browser := aBrowser
 !
 
-selectTab: aWidget
-    self open.
-    selectedTab := aWidget.
-    self tabs do: [:each |
-	each hide].
-    aWidget show.
-	
-    self update
+category
+	^self browser selectedPackage
 !
 
-closeTab: aWidget
-    self removeTab: aWidget.
-    self selectTab: self tabs last.
-    aWidget remove.
-    self update
+getNodes
+	| classes children others |
+	classes := self browser classes.
+	children := #().
+	others := #().
+	classes do: [:each |
+		(classes includes: each superclass)
+			ifFalse: [children add: each]
+			ifTrue: [others add: each]].
+	^children collect: [:each |
+		ClassesListNode on: each browser: self browser classes: others level: 0]
 !
 
-search: aString
-	| searchedClass |
-	searchedClass := Smalltalk current at: aString.
-		searchedClass isClass
-			ifTrue: [Browser openOn: searchedClass]
-			ifFalse: [ReferencesBrowser search: aString]
-! !
-
-!TabManager methodsFor: 'adding/Removing'!
-
-addTab: aWidget
-    self tabs add: aWidget.
-    aWidget appendToJQuery: '#jtalk' asJQuery.
-    aWidget hide
+nodes
+	nodes ifNil: [nodes := self getNodes].
+	^nodes
 !
 
-removeTab: aWidget
-    self tabs remove: aWidget.
-    self update
-! !
-
-!TabManager methodsFor: 'initialization'!
-
-initialize
-    super initialize.
-    opened := true.
-    [:html | html div id: 'jtalk'] appendToJQuery: 'body' asJQuery.
-    'body' asJQuery 
-	addClass: 'jtalkBody'.
-    self appendToJQuery: '#jtalk' asJQuery.
-    self 
-	addTab: IDETranscript current;
-	addTab: Workspace new;
-	addTab: TestRunner new.
-    self selectTab: self tabs last.
-    self 
-	onResize: [self updateBodyMargin; updatePosition];
-	onWindowResize: [self updatePosition]
+resetNodes
+	nodes := nil
 ! !
 
-!TabManager methodsFor: 'rendering'!
+!ClassesList methodsFor: 'rendering'!
 
 renderOn: html
-	html div id: 'logo'.
-	self renderToolbarOn: html.
 	ul := html ul
-		id: 'jtalkTabs';
+		class: 'jt_column browser classes';
 		yourself.
-	self renderTabs
-!
-
-renderTabFor: aWidget on: html
-	| li |
-	li := html li.
-	selectedTab = aWidget ifTrue: [
-	li class: 'selected'].
-	li with: [
-		html span class: 'ltab'.
-		html span
-			class: 'mtab';
-			with: [
-				aWidget canBeClosed ifTrue: [
-					html span 
-						class: 'close';
-						with: 'x';
-					onClick: [self closeTab: aWidget]].
-			html span with: (self labelFor: aWidget)].
-		html span class: 'rtab'];
-	onClick: [self selectTab: aWidget]
+	self updateNodes
 !
 
-renderTabs
+updateNodes
 	ul contents: [:html |
-	    self tabs do: [:each |
-		self renderTabFor: each on: html].
-	    html li
-		class: 'newtab';
-		with: [
-			html span class: 'ltab'.
-			html span class: 'mtab'; with: ' + '.
-			html span class: 'rtab'];
-		onClick: [self newBrowserTab]]
-!
-
-renderToolbarOn: html
-	html div 
-		id: 'jt_toolbar';
-		with: [
-			input := html input 
-				class: 'implementors';
-				yourself.
-			input onKeyPress: [:event |
-				event keyCode = 13 ifTrue: [
-				self search: input asJQuery val]].
-			html div id: 'jt_close'; onClick: [self close]]
+		self nodes do: [:each |
+			each renderOn: html]]
 ! !
 
-!TabManager methodsFor: 'updating'!
+!ClassesList class methodsFor: 'instance creation'!
 
-update
-	self renderTabs
+on: aBrowser
+	^self new 
+		browser: aBrowser; 
+		yourself
 ! !
 
-TabManager class instanceVariableNames: 'current'!
+Widget subclass: #ClassesListNode
+	instanceVariableNames: 'browser theClass level nodes'
+	package: 'IDE'!
 
-!TabManager class methodsFor: 'instance creation'!
+!ClassesListNode methodsFor: ''!
 
-current
-    ^current ifNil: [current := super new]
-!
+renderOn: html
+	| li cssClass |
+	cssClass := ''.
+	li := html li 
+		onClick: [self browser selectClass: self theClass]. 
+	li asJQuery html: self label.
 
-new
-    self shouldNotImplement
-! !
+	self browser selectedClass = self theClass ifTrue:  [
+		cssClass := cssClass, ' selected'].
 
-Widget subclass: #TabWidget
-	instanceVariableNames: 'div'
-	category: 'IDE'!
+	self theClass comment isEmpty ifFalse: [
+		cssClass := cssClass, ' commented'].
 
-!TabWidget methodsFor: 'accessing'!
+	li class: cssClass.
 
-label
-    self subclassResponsibility
+	self nodes do: [:each |
+		each renderOn: html]
 ! !
 
-!TabWidget methodsFor: 'actions'!
+!ClassesListNode methodsFor: 'accessing'!
 
-open
-    TabManager current addTab: self.
-    TabManager current selectTab: self
+browser
+	^browser
 !
 
-show
-	div asJQuery show
+browser: aBrowser
+	browser := aBrowser
 !
 
-hide
-	div asJQuery hide
+getNodesFrom: aCollection
+	| children others |
+	children := #().
+	others := #().
+	aCollection do: [:each |
+		(each superclass = self theClass)
+			ifTrue: [children add: each]
+			ifFalse: [others add: each]].
+	nodes:= children collect: [:each |
+		ClassesListNode on: each browser: self browser classes: others level: self level + 1]
 !
 
-remove
-	div asJQuery remove
+label
+	| str |
+	str := String new writeStream.
+	self level timesRepeat: [
+		str nextPutAll: '&nbsp;&nbsp;&nbsp;&nbsp;'].
+	str nextPutAll: self theClass name.
+	^str contents
 !
 
-close
-    TabManager current closeTab: self
-! !
-
-!TabWidget methodsFor: 'rendering'!
-
-renderOn: html
-	div := html div
-		class: 'jtalkTool';
-		yourself.
-	self renderTab
+level
+	^level
 !
 
-renderBoxOn: html
+level: anInteger
+	level := anInteger
 !
 
-renderButtonsOn: html
+nodes
+	^nodes
 !
 
-update
-	self renderTab
+theClass
+	^theClass
 !
 
-renderTab
-	div contents: [:html |
-	    html div
-		class: 'jt_box';
-		with: [self renderBoxOn: html].
-	    html div
-		class: 'jt_buttons';
-		with: [self renderButtonsOn: html]]
+theClass: aClass
+	theClass := aClass
 ! !
 
-!TabWidget methodsFor: 'testing'!
+!ClassesListNode class methodsFor: 'instance creation'!
 
-canBeClosed
-    ^false
+on: aClass browser: aBrowser classes: aCollection level: anInteger
+	^self new
+		theClass: aClass;
+		browser: aBrowser;
+		level: anInteger;
+		getNodesFrom: aCollection;
+		yourself
 ! !
 
-!TabWidget class methodsFor: 'instance creation'!
+ErrorHandler subclass: #DebugErrorHandler
+	instanceVariableNames: ''
+	package: 'IDE'!
 
-open
-    ^self new open
+!DebugErrorHandler methodsFor: 'error handling'!
+
+handleError: anError
+	[Debugger new
+		error: anError;
+		open] on: Error do: [:error |
+			ErrorHandler new handleError: error]
+! !
+
+!DebugErrorHandler class methodsFor: 'initialization'!
+
+initialize
+	self register
 ! !
 
 Widget subclass: #SourceArea
 	instanceVariableNames: 'editor div receiver onDoIt'
-	category: 'IDE'!
+	package: 'IDE'!
 
 !SourceArea methodsFor: 'accessing'!
 
-val
-    ^editor getValue
+currentLine
+    ^editor getLine: (editor getCursor line)
 !
 
-val: aString
-    editor setValue: aString
+currentLineOrSelection
+    ^editor somethingSelected
+	ifFalse: [self currentLine]
+	ifTrue: [self selection]
 !
 
-currentLine
-    ^editor getLine: (editor getCursor line)
+editor
+	^editor
+!
+
+onDoIt
+	^onDoIt
+!
+
+onDoIt: aBlock
+	onDoIt := aBlock
+!
+
+receiver
+	^receiver ifNil: [DoIt new]
+!
+
+receiver: anObject
+	receiver := anObject
 !
 
 selection
@@ -304,6 +212,10 @@ selectionEnd
    ^textarea element selectionEnd
 !
 
+selectionEnd: anInteger
+   textarea element selectionEnd: anInteger
+!
+
 selectionStart
    ^textarea element selectionStart
 !
@@ -312,10 +224,6 @@ selectionStart: anInteger
    textarea element selectionStart: anInteger
 !
 
-selectionEnd: anInteger
-   textarea element selectionEnd: anInteger
-!
-
 setEditorOn: aTextarea
 	<self['@editor'] = CodeMirror.fromTextArea(aTextarea, {
 		theme: 'jtalk',
@@ -326,30 +234,12 @@ setEditorOn: aTextarea
 	})>
 !
 
-editor
-	^editor
-!
-
-receiver
-	^receiver ifNil: [DoIt new]
-!
-
-receiver: anObject
-	receiver := anObject
-!
-
-onDoIt: aBlock
-	onDoIt := aBlock
-!
-
-onDoIt
-	^onDoIt
+val
+    ^editor getValue
 !
 
-currentLineOrSelection
-    ^editor somethingSelected
-	ifFalse: [self currentLine]
-	ifTrue: [self selection]
+val: aString
+    editor setValue: aString
 ! !
 
 !SourceArea methodsFor: 'actions'!
@@ -373,6 +263,10 @@ eval: aString
 	^(compiler load: 'doIt ^[', aString, '] value' forClass: DoIt) fn applyTo: self receiver arguments: #()
 !
 
+fileIn
+    Importer new import: self currentLineOrSelection readStream
+!
+
 handleKeyDown: anEvent
     <if(anEvent.ctrlKey) {
 		if(anEvent.keyCode === 80) { //ctrl+p
@@ -412,20 +306,16 @@ print: aString
 
 printIt
     self print: self doIt printString
-!
-
-fileIn
-    Importer new import: self currentLineOrSelection readStream
 ! !
 
 !SourceArea methodsFor: 'events'!
 
-onKeyUp: aBlock
-	div onKeyUp: aBlock
-!
-
 onKeyDown: aBlock
 	div onKeyDown: aBlock
+!
+
+onKeyUp: aBlock
+	div onKeyUp: aBlock
 ! !
 
 !SourceArea methodsFor: 'rendering'!
@@ -438,321 +328,293 @@ renderOn: html
     div onKeyDown: [:e | self handleKeyDown: e]
 ! !
 
-Widget subclass: #ClassesList
-	instanceVariableNames: 'browser ul nodes'
-	category: 'IDE'!
-
-!ClassesList methodsFor: 'accessing'!
-
-category
-	^self browser selectedPackage
-!
-
-nodes
-	nodes ifNil: [nodes := self getNodes].
-	^nodes
-!
-
-browser
-	^browser
-!
-
-browser: aBrowser
-	browser := aBrowser
-!
-
-getNodes
-	| classes children others |
-	classes := self browser classes.
-	children := #().
-	others := #().
-	classes do: [:each |
-		(classes includes: each superclass)
-			ifFalse: [children add: each]
-			ifTrue: [others add: each]].
-	^children collect: [:each |
-		ClassesListNode on: each browser: self browser classes: others level: 0]
-!
-
-resetNodes
-	nodes := nil
-! !
+Widget subclass: #TabManager
+	instanceVariableNames: 'selectedTab tabs opened ul input'
+	package: 'IDE'!
 
-!ClassesList methodsFor: 'rendering'!
+!TabManager methodsFor: 'accessing'!
 
-renderOn: html
-	ul := html ul
-		class: 'jt_column browser classes';
-		yourself.
-	self updateNodes
+labelFor: aWidget
+	| label maxSize |
+	maxSize := 15.
+	label := aWidget label copyFrom: 0 to: (aWidget label size min: maxSize).
+	aWidget label size > maxSize ifTrue: [
+		label := label, '...'].
+	^label
 !
 
-updateNodes
-	ul contents: [:html |
-		self nodes do: [:each |
-			each renderOn: html]]
-! !
-
-!ClassesList class methodsFor: 'instance creation'!
-
-on: aBrowser
-	^self new 
-		browser: aBrowser; 
-		yourself
+tabs
+    ^tabs ifNil: [tabs := Array new]
 ! !
 
-Widget subclass: #ClassesListNode
-	instanceVariableNames: 'browser theClass level nodes'
-	category: 'IDE'!
-
-!ClassesListNode methodsFor: ''!
-
-renderOn: html
-	| li cssClass |
-	cssClass := ''.
-	li := html li 
-		onClick: [self browser selectClass: self theClass]. 
-	li asJQuery html: self label.
-
-	self browser selectedClass = self theClass ifTrue:  [
-		cssClass := cssClass, ' selected'].
-
-	self theClass comment isEmpty ifFalse: [
-		cssClass := cssClass, ' commented'].
-
-	li class: cssClass.
-
-	self nodes do: [:each |
-		each renderOn: html]
-! !
+!TabManager methodsFor: 'actions'!
 
-!ClassesListNode methodsFor: 'accessing'!
+close
+    opened ifTrue: [
+	'#jtalk' asJQuery hide.
+	ul asJQuery hide.
+	selectedTab hide.
+	self removeBodyMargin.
+	'body' asJQuery removeClass: 'jtalkBody'.
+	opened := false]
+!
 
-nodes
-	^nodes
+closeTab: aWidget
+    self removeTab: aWidget.
+    self selectTab: self tabs last.
+    aWidget remove.
+    self update
 !
 
-theClass
-	^theClass
+newBrowserTab
+    Browser open
 !
 
-theClass: aClass
-	theClass := aClass
+onResize: aBlock
+    <jQuery('#jtalk').resizable({
+	handles: 'n', 
+	resize: aBlock,
+	minHeight: 230
+})>
 !
 
-browser
-	^browser
+onWindowResize: aBlock
+    <jQuery(window).resize(aBlock)>
 !
 
-browser: aBrowser
-	browser := aBrowser
+open
+    opened ifFalse: [
+	'body' asJQuery addClass: 'jtalkBody'.
+	'#jtalk' asJQuery show.
+	ul asJQuery show.
+	self updateBodyMargin.
+	selectedTab show.
+	opened := true]
 !
 
-level
-	^level
+removeBodyMargin
+    self setBodyMargin: 0
 !
 
-level: anInteger
-	level := anInteger
+search: aString
+	| searchedClass |
+	searchedClass := Smalltalk current at: aString.
+		searchedClass isClass
+			ifTrue: [Browser openOn: searchedClass]
+			ifFalse: [ReferencesBrowser search: aString]
 !
 
-label
-	| str |
-	str := String new writeStream.
-	self level timesRepeat: [
-		str nextPutAll: '&nbsp;&nbsp;&nbsp;&nbsp;'].
-	str nextPutAll: self theClass name.
-	^str contents
+selectTab: aWidget
+    self open.
+    selectedTab := aWidget.
+    self tabs do: [:each |
+	each hide].
+    aWidget show.
+	
+    self update
 !
 
-getNodesFrom: aCollection
-	| children others |
-	children := #().
-	others := #().
-	aCollection do: [:each |
-		(each superclass = self theClass)
-			ifTrue: [children add: each]
-			ifFalse: [others add: each]].
-	nodes:= children collect: [:each |
-		ClassesListNode on: each browser: self browser classes: others level: self level + 1]
-! !
+setBodyMargin: anInteger
+    '.jtalkBody' asJQuery css: 'margin-bottom' put: anInteger asString, 'px'
+!
 
-!ClassesListNode class methodsFor: 'instance creation'!
+updateBodyMargin
+    self setBodyMargin: '#jtalk' asJQuery height
+!
 
-on: aClass browser: aBrowser classes: aCollection level: anInteger
-	^self new
-		theClass: aClass;
-		browser: aBrowser;
-		level: anInteger;
-		getNodesFrom: aCollection;
-		yourself
+updatePosition
+    <jQuery('#jtalk').css('top', '').css('bottom', '0px')>
 ! !
 
-ErrorHandler subclass: #DebugErrorHandler
-	instanceVariableNames: ''
-	category: 'IDE'!
+!TabManager methodsFor: 'adding/Removing'!
 
-!DebugErrorHandler methodsFor: 'error handling'!
+addTab: aWidget
+    self tabs add: aWidget.
+    aWidget appendToJQuery: '#jtalk' asJQuery.
+    aWidget hide
+!
 
-handleError: anError
-	[Debugger new
-		error: anError;
-		open] on: Error do: [:error |
-			ErrorHandler new handleError: error]
+removeTab: aWidget
+    self tabs remove: aWidget.
+    self update
 ! !
 
-!DebugErrorHandler class methodsFor: 'initialization'!
+!TabManager methodsFor: 'initialization'!
 
 initialize
-	self register
-! !
-
-TabWidget subclass: #Workspace
-	instanceVariableNames: 'sourceArea'
-	category: 'IDE'!
-
-!Workspace methodsFor: 'accessing'!
-
-label
-    ^'Workspace'
+    super initialize.
+    opened := true.
+    [:html | html div id: 'jtalk'] appendToJQuery: 'body' asJQuery.
+    'body' asJQuery 
+	addClass: 'jtalkBody'.
+    self appendToJQuery: '#jtalk' asJQuery.
+    self 
+	addTab: IDETranscript current;
+	addTab: Workspace new;
+	addTab: TestRunner new.
+    self selectTab: self tabs last.
+    self 
+	onResize: [self updateBodyMargin; updatePosition];
+	onWindowResize: [self updatePosition]
 ! !
 
-!Workspace methodsFor: 'actions'!
+!TabManager methodsFor: 'rendering'!
 
-clearWorkspace
-    sourceArea clear
+renderOn: html
+	html div id: 'logo'.
+	self renderToolbarOn: html.
+	ul := html ul
+		id: 'jtalkTabs';
+		yourself.
+	self renderTabs
 !
 
-doIt
-   sourceArea doIt
+renderTabFor: aWidget on: html
+	| li |
+	li := html li.
+	selectedTab = aWidget ifTrue: [
+	li class: 'selected'].
+	li with: [
+		html span class: 'ltab'.
+		html span
+			class: 'mtab';
+			with: [
+				aWidget canBeClosed ifTrue: [
+					html span 
+						class: 'close';
+						with: 'x';
+					onClick: [self closeTab: aWidget]].
+			html span with: (self labelFor: aWidget)].
+		html span class: 'rtab'];
+	onClick: [self selectTab: aWidget]
 !
 
-printIt
-	sourceArea printIt
+renderTabs
+	ul contents: [:html |
+	    self tabs do: [:each |
+		self renderTabFor: each on: html].
+	    html li
+		class: 'newtab';
+		with: [
+			html span class: 'ltab'.
+			html span class: 'mtab'; with: ' + '.
+			html span class: 'rtab'];
+		onClick: [self newBrowserTab]]
 !
 
-inspectIt
-    sourceArea inspectIt
-!
+renderToolbarOn: html
+	html div 
+		id: 'jt_toolbar';
+		with: [
+			input := html input 
+				class: 'implementors';
+				yourself.
+			input onKeyPress: [:event |
+				event keyCode = 13 ifTrue: [
+				self search: input asJQuery val]].
+			html div id: 'jt_close'; onClick: [self close]]
+! !
 
-fileIn
-    sourceArea fileIn
+!TabManager methodsFor: 'updating'!
+
+update
+	self renderTabs
 ! !
 
-!Workspace methodsFor: 'rendering'!
+TabManager class instanceVariableNames: 'current'!
 
-renderBoxOn: html
-    sourceArea := SourceArea new.
-    sourceArea renderOn: html
+!TabManager class methodsFor: 'instance creation'!
+
+current
+    ^current ifNil: [current := super new]
 !
 
-renderButtonsOn: html
-    html button
-	with: 'DoIt';
-	title: 'ctrl+d';
-	onClick: [self doIt].
-    html button
-	with: 'PrintIt';
-	title: 'ctrl+p';
-	onClick: [self printIt].
-    html button
-	with: 'InspectIt';
-	title: 'ctrl+i';
-	onClick: [self inspectIt].
-    html button
-	with: 'FileIn';
-	title: 'ctrl+f';
-	onClick: [self fileIn].
-    html button
-	with: 'Clear workspace';
-	onClick: [self clearWorkspace]
+new
+    self shouldNotImplement
 ! !
 
-TabWidget subclass: #Browser
-	instanceVariableNames: 'selectedPackage selectedClass selectedProtocol selectedMethod packagesList classesList protocolsList methodsList sourceArea tabsList selectedTab saveButton classButtons methodButtons unsavedChanges'
-	category: 'IDE'!
+Widget subclass: #TabWidget
+	instanceVariableNames: 'div'
+	package: 'IDE'!
 
-!Browser methodsFor: 'accessing'!
+!TabWidget methodsFor: 'accessing'!
 
 label
-    ^selectedClass 
-	ifNil: ['Browser (nil)']
-	ifNotNil: ['Browser: ', selectedClass name]
+    self subclassResponsibility
+! !
+
+!TabWidget methodsFor: 'actions'!
+
+close
+    TabManager current closeTab: self
 !
 
-packages
-    | packages |
-    packages := Array new.
-    Smalltalk current classes do: [:each |
-	(packages includes: each category) ifFalse: [
-	    packages add: each category]].
-    ^packages sort
+hide
+	div asJQuery hide
+!
+
+open
+    TabManager current addTab: self.
+    TabManager current selectTab: self
 !
 
-classes
-    ^((Smalltalk current classes 
-	select: [:each | each category = selectedPackage])
-	sort: [:a :b | a name < b name]) asSet
+remove
+	div asJQuery remove
 !
 
-protocols
-    | klass |
-    selectedClass ifNotNil: [
-	selectedTab = #comment ifTrue: [^#()].
-	klass := selectedTab = #instance
-	    ifTrue: [selectedClass]
-	    ifFalse: [selectedClass class].
-	klass methodDictionary isEmpty ifTrue: [
-	    ^Array with: 'not yet classified'].
-	^klass protocols].
-    ^Array new
+show
+	div asJQuery show
+! !
+
+!TabWidget methodsFor: 'rendering'!
+
+renderBoxOn: html
 !
 
-methods
-    | klass |
-    selectedTab = #comment ifTrue: [^#()].
-    selectedClass ifNotNil: [
-	klass := selectedTab = #instance
-	    ifTrue: [selectedClass]
-	    ifFalse: [selectedClass class]].
-    ^(selectedProtocol 
-	ifNil: [
-	    klass 
-		ifNil: [#()] 
-		ifNotNil: [klass methodDictionary values]]
-	ifNotNil: [
-	    klass methodDictionary values select: [:each |
-		each category = selectedProtocol]]) sort: [:a :b | a selector < b selector]
+renderButtonsOn: html
 !
 
-source
-    selectedTab = #comment ifFalse: [
-	^(selectedProtocol notNil or: [selectedMethod notNil])
-	    ifFalse: [self declarationSource]
-	    ifTrue: [self methodSource]].
-    ^selectedClass
-	ifNil: ['']
-	ifNotNil: [self classCommentSource]
+renderOn: html
+	div := html div
+		class: 'jtalkTool';
+		yourself.
+	self renderTab
 !
 
-methodSource
-    ^selectedMethod
-	ifNil: [self dummyMethodSource]
-	ifNotNil: [selectedMethod source]
+renderTab
+	div contents: [:html |
+	    html div
+		class: 'jt_box';
+		with: [self renderBoxOn: html].
+	    html div
+		class: 'jt_buttons';
+		with: [self renderButtonsOn: html]]
 !
 
-dummyMethodSource
-    ^'messageSelectorAndArgumentNames
-	"comment stating purpose of message"
+update
+	self renderTab
+! !
 
-	| temporary variable names |
-	statements'
-!
+!TabWidget methodsFor: 'testing'!
 
-declarationSource
-    ^selectedTab = #instance
-	ifTrue: [self classDeclarationSource]
-	ifFalse: [self metaclassDeclarationSource]
+canBeClosed
+    ^false
+! !
+
+!TabWidget class methodsFor: 'instance creation'!
+
+open
+    ^self new open
+! !
+
+TabWidget subclass: #Browser
+	instanceVariableNames: 'selectedPackage selectedClass selectedProtocol selectedMethod packagesList classesList protocolsList methodsList sourceArea tabsList selectedTab saveButton classButtons methodButtons unsavedChanges'
+	package: 'IDE'!
+
+!Browser methodsFor: 'accessing'!
+
+classCommentSource
+    ^selectedClass comment
 !
 
 classDeclarationSource
@@ -776,6 +638,38 @@ classDeclarationSource
 	^stream contents
 !
 
+classDeclarationTemplate
+	^'Object subclass: #NameOfSubclass
+	instanceVariableNames: ''''
+	package: ''', self selectedPackage, ''''
+!
+
+classes
+    ^((Smalltalk current classes 
+	select: [:each | each category = selectedPackage])
+	sort: [:a :b | a name < b name]) asSet
+!
+
+declarationSource
+    ^selectedTab = #instance
+	ifTrue: [self classDeclarationSource]
+	ifFalse: [self metaclassDeclarationSource]
+!
+
+dummyMethodSource
+    ^'messageSelectorAndArgumentNames
+	"comment stating purpose of message"
+
+	| temporary variable names |
+	statements'
+!
+
+label
+    ^selectedClass 
+	ifNil: ['Browser (nil)']
+	ifNotNil: ['Browser: ', selectedClass name]
+!
+
 metaclassDeclarationSource
     | stream |
     stream := '' writeStream.
@@ -791,46 +685,115 @@ metaclassDeclarationSource
     ^stream contents
 !
 
-classCommentSource
-    ^selectedClass comment
+methodSource
+    ^selectedMethod
+	ifNil: [self dummyMethodSource]
+	ifNotNil: [selectedMethod source]
 !
 
-selectedClass
-	^selectedClass
+methods
+    | klass |
+    selectedTab = #comment ifTrue: [^#()].
+    selectedClass ifNotNil: [
+	klass := selectedTab = #instance
+	    ifTrue: [selectedClass]
+	    ifFalse: [selectedClass class]].
+    ^(selectedProtocol 
+	ifNil: [
+	    klass 
+		ifNil: [#()] 
+		ifNotNil: [klass methodDictionary values]]
+	ifNotNil: [
+	    klass methodDictionary values select: [:each |
+		each category = selectedProtocol]]) sort: [:a :b | a selector < b selector]
 !
 
-classDeclarationTemplate
-	^'Object subclass: #NameOfSubclass
-	instanceVariableNames: ''''
-	package: ''', self selectedPackage, ''''
+packages
+    | packages |
+    packages := Array new.
+    Smalltalk current classes do: [:each |
+	(packages includes: each category) ifFalse: [
+	    packages add: each category]].
+    ^packages sort
+!
+
+protocols
+    | klass |
+    selectedClass ifNotNil: [
+	selectedTab = #comment ifTrue: [^#()].
+	klass := selectedTab = #instance
+	    ifTrue: [selectedClass]
+	    ifFalse: [selectedClass class].
+	klass methodDictionary isEmpty ifTrue: [
+	    ^Array with: 'not yet classified'].
+	^klass protocols].
+    ^Array new
+!
+
+selectedClass
+	^selectedClass
 !
 
 selectedPackage
 	^selectedPackage
+!
+
+source
+    selectedTab = #comment ifFalse: [
+	^(selectedProtocol notNil or: [selectedMethod notNil])
+	    ifFalse: [self declarationSource]
+	    ifTrue: [self methodSource]].
+    ^selectedClass
+	ifNil: ['']
+	ifNotNil: [self classCommentSource]
 ! !
 
 !Browser methodsFor: 'actions'!
 
-disableSaveButton
-    saveButton ifNotNil: [
-	saveButton at: 'disabled' put: true].
-    unsavedChanges := false
+addInstanceVariableNamed: aString toClass: aClass
+	ClassBuilder new
+		addSubclassOf: aClass superclass 
+		named: aClass name 
+		instanceVariableNames: (aClass instanceVariableNames copy add: aString; yourself)
+		package: aClass package name
 !
 
-hideClassButtons
-    classButtons asJQuery hide
+addNewClass
+	| className |
+	className := window prompt: 'New class'.
+	(className notNil and: [className notEmpty]) ifTrue: [
+		Object subclass: className instanceVariableNames: '' package: self selectedPackage.
+          	 self 
+			resetClassesList;
+			updateClassesList.
+		self selectClass: (Smalltalk current at: className)]
 !
 
-showClassButtons
-    classButtons asJQuery show
+addNewProtocol
+    | newProtocol |
+    newProtocol := window prompt: 'New method protocol'.
+    (newProtocol notNil and: [newProtocol notEmpty]) ifTrue: [
+	selectedMethod category: newProtocol.
+	self setMethodProtocol: newProtocol]
 !
 
-hideMethodButtons
-    methodButtons asJQuery hide
+cancelChanges
+    ^unsavedChanges 
+	ifTrue: [window confirm: 'Cancel changes?']
+	ifFalse: [true]
 !
 
-showMethodButtons
-    methodButtons asJQuery show
+commitPackage
+	selectedPackage ifNotNil: [ |package|
+               						 package := Package named: selectedPackage.
+               						 {	Exporter 			-> (package commitPathJs, '/', selectedPackage, '.js').
+                        					StrippedExporter 	-> (package commitPathJs, '/', selectedPackage, '.deploy.js').
+                       						 ChunkExporter 		-> (package commitPathSt, '/', selectedPackage, '.st') 			} 
+                 
+                						do: [:commitStrategy| |fileContents|
+                                                                     	fileContents := (commitStrategy key new exportPackage: selectedPackage).
+                                                                     	self ajaxPutAt: commitStrategy value data:  fileContents]
+         						]
 !
 
 compile
@@ -849,6 +812,16 @@ compileClassComment
     selectedClass comment: sourceArea val
 !
 
+compileDefinition
+    | newClass |
+    newClass := Compiler new loadExpression: sourceArea val.
+    self 
+	resetClassesList;
+	updateCategoriesList;
+	updateClassesList.
+    self selectClass: newClass
+!
+
 compileMethodDefinition
     selectedTab = #instance
 	ifTrue: [self compileMethodDefinitionFor: selectedClass]
@@ -879,20 +852,40 @@ compileMethodDefinitionFor: aClass
     self selectMethod: method
 !
 
-compileDefinition
-    | newClass |
-    newClass := Compiler new loadExpression: sourceArea val.
-    self 
-	resetClassesList;
-	updateCategoriesList;
-	updateClassesList.
-    self selectClass: newClass
+copyClass
+	| className |
+	className := window prompt: 'Copy class'.
+	(className notNil and: [className notEmpty]) ifTrue: [
+		ClassBuilder new copyClass: self selectedClass named: className.
+          	 self 
+			resetClassesList;
+			updateClassesList.
+		self selectClass: (Smalltalk current at: className)]
+!
+
+disableSaveButton
+    saveButton ifNotNil: [
+	saveButton at: 'disabled' put: true].
+    unsavedChanges := false
 !
 
-cancelChanges
-    ^unsavedChanges 
-	ifTrue: [window confirm: 'Cancel changes?']
-	ifFalse: [true]
+handleSourceAreaKeyDown: anEvent
+	 <if(anEvent.ctrlKey) {
+		if(anEvent.keyCode === 83) { //ctrl+s
+			self._compile();
+			anEvent.preventDefault();
+			return false;
+		}
+	}
+	>
+!
+
+hideClassButtons
+    classButtons asJQuery hide
+!
+
+hideMethodButtons
+    methodButtons asJQuery hide
 !
 
 removeClass
@@ -913,26 +906,48 @@ removeMethod
 		self selectMethod: nil]]
 !
 
-setMethodProtocol: aString
-    self cancelChanges ifTrue: [
-	(self protocols includes: aString)
-	    ifFalse: [self addNewProtocol]
-	    ifTrue: [
-		selectedMethod category: aString.
-		selectedProtocol := aString.
-		selectedMethod := selectedMethod.
-		self 
-		    updateProtocolsList;
-		    updateMethodsList;
-		    updateSourceAndButtons]]
+removePackage
+
+  (window confirm: 'Do you really want to remove the whole package ', selectedPackage, ' with all its classes?')
+	ifTrue: [
+	    Smalltalk current removePackage: selectedPackage.
+	    self updateCategoriesList]
 !
 
-addNewProtocol
-    | newProtocol |
-    newProtocol := window prompt: 'New method protocol'.
-    (newProtocol notNil and: [newProtocol notEmpty]) ifTrue: [
-	selectedMethod category: newProtocol.
-	self setMethodProtocol: newProtocol]
+renameClass
+    | newName |
+    newName := window prompt: 'Rename class ', selectedClass name.
+    (newName notNil and: [newName notEmpty]) ifTrue: [
+	selectedClass rename: newName.
+	self 
+		updateClassesList;
+		updateSourceAndButtons]
+!
+
+renamePackage
+
+  | newName |
+  newName := window prompt: 'Rename package ', selectedPackage.
+  newName ifNotNil: [
+    newName notEmpty ifTrue: [
+	Smalltalk current renamePackage: selectedPackage to: newName.
+	self updateCategoriesList]]
+!
+
+search: aString
+	self cancelChanges ifTrue: [| searchedClass |
+		searchedClass := Smalltalk current at: aString.
+		searchedClass isClass
+			ifTrue: [self class openOn: searchedClass]
+			ifFalse: [self searchReferencesOf: aString]]
+!
+
+searchClassReferences
+	ReferencesBrowser search: selectedClass name
+!
+
+searchReferencesOf: aString
+	ReferencesBrowser search: aString
 !
 
 selectCategory: aCategory
@@ -959,19 +974,19 @@ selectClass: aClass
 	    updateSourceAndButtons]
 !
 
-selectProtocol: aString
+selectMethod: aMethod
     self cancelChanges ifTrue: [
-	selectedProtocol := aString.
-	selectedMethod := nil.
+	selectedMethod := aMethod.
 	self 
 	    updateProtocolsList;
 	    updateMethodsList;
 	    updateSourceAndButtons]
 !
 
-selectMethod: aMethod
+selectProtocol: aString
     self cancelChanges ifTrue: [
-	selectedMethod := aMethod.
+	selectedProtocol := aString.
+	selectedMethod := nil.
 	self 
 	    updateProtocolsList;
 	    updateMethodsList;
@@ -985,102 +1000,26 @@ selectTab: aString
 	self updateTabsList]
 !
 
-renameClass
-    | newName |
-    newName := window prompt: 'Rename class ', selectedClass name.
-    (newName notNil and: [newName notEmpty]) ifTrue: [
-	selectedClass rename: newName.
-	self 
-		updateClassesList;
-		updateSourceAndButtons]
-!
-
-addInstanceVariableNamed: aString toClass: aClass
-	ClassBuilder new
-		addSubclassOf: aClass superclass 
-		named: aClass name 
-		instanceVariableNames: (aClass instanceVariableNames copy add: aString; yourself)
-		package: aClass package name
-!
-
-searchReferencesOf: aString
-	ReferencesBrowser search: aString
-!
-
-searchClassReferences
-	ReferencesBrowser search: selectedClass name
-!
-
-search: aString
-	self cancelChanges ifTrue: [| searchedClass |
-		searchedClass := Smalltalk current at: aString.
-		searchedClass isClass
-			ifTrue: [self class openOn: searchedClass]
-			ifFalse: [self searchReferencesOf: aString]]
-!
-
-handleSourceAreaKeyDown: anEvent
-	 <if(anEvent.ctrlKey) {
-		if(anEvent.keyCode === 83) { //ctrl+s
-			self._compile();
-			anEvent.preventDefault();
-			return false;
-		}
-	}
-	>
-!
-
-commitPackage
-	selectedPackage ifNotNil: [ |package|
-               						 package := Package named: selectedPackage.
-               						 {	Exporter 			-> (package commitPathJs, '/', selectedPackage, '.js').
-                        					StrippedExporter 	-> (package commitPathJs, '/', selectedPackage, '.deploy.js').
-                       						 ChunkExporter 		-> (package commitPathSt, '/', selectedPackage, '.st') 			} 
-                 
-                						do: [:commitStrategy| |fileContents|
-                                                                     	fileContents := (commitStrategy key new exportPackage: selectedPackage).
-                                                                     	self ajaxPutAt: commitStrategy value data:  fileContents]
-         						]
-!
-
-renamePackage
-
-  | newName |
-  newName := window prompt: 'Rename package ', selectedPackage.
-  newName ifNotNil: [
-    newName notEmpty ifTrue: [
-	Smalltalk current renamePackage: selectedPackage to: newName.
-	self updateCategoriesList]]
-!
-
-removePackage
-
-  (window confirm: 'Do you really want to remove the whole package ', selectedPackage, ' with all its classes?')
-	ifTrue: [
-	    Smalltalk current removePackage: selectedPackage.
-	    self updateCategoriesList]
+setMethodProtocol: aString
+    self cancelChanges ifTrue: [
+	(self protocols includes: aString)
+	    ifFalse: [self addNewProtocol]
+	    ifTrue: [
+		selectedMethod category: aString.
+		selectedProtocol := aString.
+		selectedMethod := selectedMethod.
+		self 
+		    updateProtocolsList;
+		    updateMethodsList;
+		    updateSourceAndButtons]]
 !
 
-addNewClass
-	| className |
-	className := window prompt: 'New class'.
-	(className notNil and: [className notEmpty]) ifTrue: [
-		Object subclass: className instanceVariableNames: '' package: self selectedPackage.
-          	 self 
-			resetClassesList;
-			updateClassesList.
-		self selectClass: (Smalltalk current at: className)]
+showClassButtons
+    classButtons asJQuery show
 !
 
-copyClass
-	| className |
-	className := window prompt: 'Copy class'.
-	(className notNil and: [className notEmpty]) ifTrue: [
-		ClassBuilder new copyClass: self selectedClass named: className.
-          	 self 
-			resetClassesList;
-			updateClassesList.
-		self selectClass: (Smalltalk current at: className)]
+showMethodButtons
+    methodButtons asJQuery show
 ! !
 
 !Browser methodsFor: 'initialization'!
@@ -1096,55 +1035,13 @@ initialize
 
 ajaxPutAt: anURL data: aString
 	jQuery 
-		ajax: anURL	options: #{	'type' -> 'PUT'.
-								'data' -> aString.
-								'contentType' -> 'text/plain;charset=UTF-8'.
-								'error' -> [window alert: 'PUT request failed at:  ', anURL] }
-! !
-
-!Browser methodsFor: 'rendering'!
-
-renderBoxOn: html
-    self 
-	renderTopPanelOn: html;
-	renderTabsOn: html;
-	renderBottomPanelOn: html
-!
-
-renderTopPanelOn: html
-	html div 
-		class: 'top'; 
-		with: [
-			packagesList := html ul class: 'jt_column browser packages'.
-          		html div class: 'jt_packagesButtons'; with: [
-				html button 
-					title: 'Commit classes in this package to disk';
-					onClick: [self commitPackage];
-					with: 'Commit'.
-        			html button
-					title: 'Rename package';
-					onClick: [self renamePackage];
-					with: 'Rename'.
-        			html button
-					title: 'Remove this package from the system';
-					onClick: [self removePackage];
-					with: 'Remove'].
-			classesList := ClassesList on: self.
-			classesList renderOn: html.
-			protocolsList := html ul class: 'jt_column browser protocols'.
-			methodsList := html ul class: 'jt_column browser methods'.
-			self
-				updateCategoriesList;
-				updateClassesList;
-				updateProtocolsList;
-				updateMethodsList.
-			html div class: 'jt_clear']
-!
+		ajax: anURL	options: #{	'type' -> 'PUT'.
+								'data' -> aString.
+								'contentType' -> 'text/plain;charset=UTF-8'.
+								'error' -> [window alert: 'PUT request failed at:  ', anURL] }
+! !
 
-renderTabsOn: html
-    tabsList := html ul class: 'jt_tabs jt_browser'.
-    self updateTabsList.
-!
+!Browser methodsFor: 'rendering'!
 
 renderBottomPanelOn: html
     html div
@@ -1157,6 +1054,13 @@ renderBottomPanelOn: html
 	    sourceArea onKeyUp: [self updateStatus]]
 !
 
+renderBoxOn: html
+    self 
+	renderTopPanelOn: html;
+	renderTabsOn: html;
+	renderBottomPanelOn: html
+!
+
 renderButtonsOn: html
     saveButton := html button.
     saveButton 
@@ -1176,6 +1080,41 @@ renderButtonsOn: html
 		html button with: 'InspectIt';
 			onClick: [sourceArea inspectIt]]. 
     self updateSourceAndButtons
+!
+
+renderTabsOn: html
+    tabsList := html ul class: 'jt_tabs jt_browser'.
+    self updateTabsList.
+!
+
+renderTopPanelOn: html
+	html div 
+		class: 'top'; 
+		with: [
+			packagesList := html ul class: 'jt_column browser packages'.
+          		html div class: 'jt_packagesButtons'; with: [
+				html button 
+					title: 'Commit classes in this package to disk';
+					onClick: [self commitPackage];
+					with: 'Commit'.
+        			html button
+					title: 'Rename package';
+					onClick: [self renamePackage];
+					with: 'Rename'.
+        			html button
+					title: 'Remove this package from the system';
+					onClick: [self removePackage];
+					with: 'Remove'].
+			classesList := ClassesList on: self.
+			classesList renderOn: html.
+			protocolsList := html ul class: 'jt_column browser protocols'.
+			methodsList := html ul class: 'jt_column browser methods'.
+			self
+				updateCategoriesList;
+				updateClassesList;
+				updateProtocolsList;
+				updateMethodsList.
+			html div class: 'jt_clear']
 ! !
 
 !Browser methodsFor: 'testing'!
@@ -1186,6 +1125,10 @@ canBeClosed
 
 !Browser methodsFor: 'updating'!
 
+resetClassesList
+	classesList resetNodes
+!
+
 updateCategoriesList
     packagesList contents: [:html |
 	self packages do: [:each || li label |
@@ -1205,17 +1148,6 @@ updateClassesList
     classesList updateNodes
 !
 
-updateProtocolsList
-    protocolsList contents: [:html |
-	self protocols do: [:each || li |
-	    li := html li.
-	    selectedProtocol = each ifTrue: [
-		li class: 'selected'].
-	    li 
-		with: each;
-		onClick: [self selectProtocol: each]]]
-!
-
 updateMethodsList
     methodsList contents: [:html |
 	self methods do: [:each || li |
@@ -1227,32 +1159,15 @@ updateMethodsList
 		onClick: [self selectMethod: each]]]
 !
 
-updateTabsList
-    tabsList contents: [:html || li |
-	li := html li.
-	selectedTab = #instance ifTrue: [li class: 'selected'].
-	li
-	    with: [
-		html span class: 'ltab'.
-		html span class: 'mtab'; with: 'Instance'.
-		html span class: 'rtab'];
-	    onClick: [self selectTab: #instance].
-	li := html li.
-	selectedTab = #class ifTrue: [li class: 'selected'].
-	li
-	    with: [
-		html span class: 'ltab'.
-		html span class: 'mtab'; with: 'Class'.
-		html span class: 'rtab'];
-	    onClick: [self selectTab: #class].
-	li := html li.
-	selectedTab = #comment ifTrue: [li class: 'selected'].
-	li
-	    with: [
-		html span class: 'ltab'.
-		html span class: 'mtab'; with: 'Comment'.
-		html span class: 'rtab'];
-	    onClick: [self selectTab: #comment]]
+updateProtocolsList
+    protocolsList contents: [:html |
+	self protocols do: [:each || li |
+	    li := html li.
+	    selectedProtocol = each ifTrue: [
+		li class: 'selected'].
+	    li 
+		with: each;
+		onClick: [self selectProtocol: each]]]
 !
 
 updateSourceAndButtons
@@ -1328,8 +1243,32 @@ updateStatus
 			unsavedChanges := true]
 !
 
-resetClassesList
-	classesList resetNodes
+updateTabsList
+    tabsList contents: [:html || li |
+	li := html li.
+	selectedTab = #instance ifTrue: [li class: 'selected'].
+	li
+	    with: [
+		html span class: 'ltab'.
+		html span class: 'mtab'; with: 'Instance'.
+		html span class: 'rtab'];
+	    onClick: [self selectTab: #instance].
+	li := html li.
+	selectedTab = #class ifTrue: [li class: 'selected'].
+	li
+	    with: [
+		html span class: 'ltab'.
+		html span class: 'mtab'; with: 'Class'.
+		html span class: 'rtab'];
+	    onClick: [self selectTab: #class].
+	li := html li.
+	selectedTab = #comment ifTrue: [li class: 'selected'].
+	li
+	    with: [
+		html span class: 'ltab'.
+		html span class: 'mtab'; with: 'Comment'.
+		html span class: 'rtab'];
+	    onClick: [self selectTab: #comment]]
 ! !
 
 !Browser class methodsFor: 'accessing'!
@@ -1344,562 +1283,456 @@ commitPathSt
 
 !Browser class methodsFor: 'convenience'!
 
+open
+    self new open
+!
+
 openOn: aClass
     ^self new
 	open;
 	selectCategory: aClass category;
 	selectClass: aClass
-!
-
-open
-    self new open
 ! !
 
-TabWidget subclass: #Inspector
-	instanceVariableNames: 'label variables object selectedVariable variablesList valueTextarea diveButton sourceArea'
-	category: 'IDE'!
-
-!Inspector methodsFor: 'accessing'!
-
-label
-	^label ifNil: ['Inspector (nil)']
-!
+TabWidget subclass: #Debugger
+	instanceVariableNames: 'error selectedContext sourceArea ul ul2 inspector saveButton unsavedChanges selectedVariable selectedVariableName inspectButton'
+	package: 'IDE'!
 
-variables
-	^variables
-!
+!Debugger methodsFor: 'accessing'!
 
-setVariables: aCollection
-	variables := aCollection
+arguments
+	^self method 
+		ifNil: [selectedContext temps collect: [:each | nil]]
+		ifNotNil: [self method arguments]
 !
 
-setLabel: aString
-	label := aString
+error
+	^error
 !
 
-selectedVariable
-	^selectedVariable
+error: anError
+	error := anError
 !
 
-selectedVariable: aString
-	selectedVariable := aString
+label
+	^'[Debugger]'
 !
 
-sourceArea
-	^sourceArea
-! !
-
-!Inspector methodsFor: 'actions'!
-
-inspect: anObject
-	object := anObject.
-	variables := #().
-	object inspectOn: self
+method
+	^selectedContext receiver class methodAt: selectedContext selector
 !
 
-dive
-	(self variables at: self selectedVariable) inspect
+receiver
+	^selectedContext receiver
 !
 
-refresh
-	self 
-		inspect: object; 
-		updateVariablesList;
-		updateValueTextarea
+source
+	^self method 
+		ifNil: ['Method doesn''t exist!!']
+		ifNotNil: [self method source]
 ! !
 
-!Inspector methodsFor: 'rendering'!
-
-renderBoxOn: html
-	self 
-		renderTopPanelOn: html;
-		renderBottomPanelOn: html
-!
-
-renderTopPanelOn: html
-	html div 
-		class: 'top'; 
-		with: [
-			variablesList := html ul class: 'jt_column variables'.
-			valueTextarea := html textarea class: 'jt_column value'; at: 'readonly' put: 'readonly'.
-			html div class: 'jt_tabs inspector'; with: [
-				html button
-					class: 'jt_button inspector refresh';
-					with: 'Refresh';
-					onClick: [self refresh].
-				diveButton := html button 
-					class: 'jt_button inspector dive';
-					with: 'Dive'; 
-					onClick: [self dive]].
-			html div class: 'jt_clear'].
-	self
-		updateVariablesList;
-		updateValueTextarea.
-!
+!Debugger methodsFor: 'actions'!
 
-renderBottomPanelOn: html
-    html div
-	class: 'jt_sourceCode';
-	with: [
-	    sourceArea := SourceArea new
-		receiver: object;
-		onDoIt: [self refresh];
-		yourself.
-            sourceArea renderOn: html]
+inspectSelectedVariable
+	selectedVariable inspect
 !
 
-renderButtonsOn: html
-	html button 
-		with: 'DoIt';
-		onClick: [self sourceArea doIt].
-	html button 
-		with: 'PrintIt';
-		onClick: [self sourceArea printIt].
-	html button 
-		with: 'InspectIt';
-		onClick: [self sourceArea inspectIt].
-	self updateButtons
-! !
-
-!Inspector methodsFor: 'testing'!
-
-canBeClosed
-	^true
-! !
-
-!Inspector methodsFor: 'updating'!
+proceed
+	self close.
+	selectedContext receiver perform: selectedContext selector withArguments: selectedContext temps
+!
 
-updateVariablesList
-	variablesList contents: [:html |
-		self variables keys do: [:each || li |
-			li := html li.
-			li
-				with: each;
-				onClick: [self selectVariable: each].
-			self selectedVariable = each ifTrue: [
-				li class: 'selected']]]
+save
+	| protocol |
+	protocol := (selectedContext receiver class methodDictionary at: selectedContext selector) category.
+	selectedContext receiver class compile: sourceArea val category: protocol.
+	self updateStatus
 !
 
-selectVariable: aString
-	self selectedVariable: aString.
+selectContext: aContext
+	selectedContext := aContext.
+	selectedVariable := nil.
+	selectedVariableName := nil.
 	self 
+		updateContextsList;
+		updateSourceArea;
+		updateInspector;
 		updateVariablesList;
-		updateValueTextarea;
-		updateButtons
-!
-
-updateValueTextarea
-	valueTextarea asJQuery val: (self selectedVariable isNil
-		ifTrue: ['']
-		ifFalse: [(self variables at: self selectedVariable) printString])
+		updateStatus
 !
 
-updateButtons
-	(self selectedVariable notNil and: [(self variables at: self selectedVariable) notNil])
-		ifFalse: [diveButton at: 'disabled' put: true] 
-		ifTrue: [diveButton removeAt: 'disabled']
+selectVariable: anObject named: aString
+	selectedVariable := anObject.
+	selectedVariableName := aString.
+	inspector contents: [:html | html with: anObject printString].
+	self updateVariablesList
 ! !
 
-!Inspector class methodsFor: 'instance creation'!
+!Debugger methodsFor: 'initialization'!
 
-on: anObject
-	^self new
-		inspect: anObject;
-		yourself
+initialize
+	super initialize.
+	unsavedChanges = false
 ! !
 
-TabWidget subclass: #ReferencesBrowser
-	instanceVariableNames: 'implementors senders implementorsList input timer selector sendersList referencedClasses referencedClassesList'
-	category: 'IDE'!
-
-!ReferencesBrowser methodsFor: 'accessing'!
+!Debugger methodsFor: 'rendering'!
 
-implementors
-	^implementors ifNil: [implementors := Array new]
+renderBottomPanelOn: html
+	html div
+		class: 'jt_sourceCode debugger';
+		with: [
+			sourceArea := SourceArea new.
+			sourceArea renderOn: html].
+	ul2 := html ul class: 'jt_column debugger variables'.
+	inspector := html div class: 'jt_column debugger inspector'.
+	sourceArea
+		onKeyUp: [self updateStatus]
 !
 
-label
-	^'[References]'
+renderBoxOn: html
+    self 
+	renderTopPanelOn: html;
+	renderBottomPanelOn: html
 !
 
-selector
-	^selector
+renderButtonsOn: html
+	saveButton := html button
+		with: 'Save';
+		onClick: [self save].
+	html button
+		with: 'DoIt';
+		onClick: [sourceArea doIt].
+	html button
+		with: 'PrintIt';
+		onClick: [sourceArea printIt].
+	html button
+		with: 'InspectIt';
+		onClick: [sourceArea inspectIt].
+	html button 
+		with: 'Proceed';
+		onClick: [self proceed].
+	html button
+		with: 'Abandon';
+		onClick: [self close].
+	inspectButton := html button
+		class: 'jt_button debugger inspect';
+		with: 'Inspect';
+		onClick: [self inspectSelectedVariable].
+	 self 
+		updateSourceArea;
+		updateStatus;
+		updateVariablesList;
+		updateInspector
 !
 
-senders
-	^senders ifNil: [senders := Array new]
+renderContext: aContext on: html
+	| li |
+	li := html li.
+	selectedContext = aContext ifTrue: [
+		li class: 'selected'].
+	li 
+		with: aContext asString;
+		onClick: [self selectContext: aContext].
+	aContext home ifNotNil: [self renderContext: aContext home on: html]
 !
 
-classesAndMetaclasses
-	^Smalltalk current classes, (Smalltalk current classes collect: [:each | each class])
-!
+renderTopPanelOn: html
+	selectedContext := self error context.
+	html div 
+		class: 'top'; 
+		with: [
+			html div 
+				class: 'label';
+				with: self error messageText.
+			ul := html ul 
+				class: 'jt_column debugger contexts';
+				with: [self renderContext: self error context on: html]]
+! !
 
-referencedClasses
-	^referencedClasses ifNil: [referencedClasses := Array new]
+!Debugger methodsFor: 'testing'!
+
+canBeClosed
+    ^true
 ! !
 
-!ReferencesBrowser methodsFor: 'actions'!
+!Debugger methodsFor: 'updating'!
 
-openBrowserOn: aMethod
-       | browser |
-       browser := Browser openOn: (aMethod methodClass isMetaclass 
-		ifTrue: [aMethod methodClass instanceClass] ifFalse: [aMethod methodClass]).
-       aMethod methodClass isMetaclass ifTrue: [browser selectTab: #class].
-       browser
-               selectProtocol: aMethod category;
-               selectMethod: aMethod
+updateContextsList
+	ul contents: [:html |
+		self renderContext: self error context on: html]
 !
 
-searchReferencesFor: aString
-	selector := aString.
-	implementors := Array new.
-	senders := Array new.
-	referencedClasses := Array new.
-	(selector match: '^[A-Z]') 
-		ifFalse: [self searchSelectorReferencesFor: selector]
-		ifTrue: [self searchReferencedClassesFor: selector]
+updateInspector
+	inspector contents: [:html |]
 !
 
-search: aString
-	self 
-		searchReferencesFor: aString;
-		updateImplementorsList;
-		updateSendersList;
-		updateReferencedClassesList
+updateSourceArea
+	 sourceArea val: self source
 !
 
-searchReferencedClassesFor: aString
-	self classesAndMetaclasses do: [:each |
-		each methodDictionary values do: [:value |
-			(value referencedClasses includes: selector) ifTrue: [
-				self referencedClasses add: value]]]
+updateStatus
+	sourceArea val = self source
+		ifTrue: [
+			saveButton ifNotNil: [
+				saveButton at: 'disabled' put: true].
+			unsavedChanges := false]
+		ifFalse: [
+			saveButton ifNotNil: [
+				saveButton removeAt: 'disabled'].
+			unsavedChanges := true]
 !
 
-searchSelectorReferencesFor: aString
-	self classesAndMetaclasses do: [:each | 
-		each methodDictionary keysAndValuesDo: [:key :value | 
-			key = selector ifTrue: [self implementors add: value].
-			(value messageSends includes: selector) ifTrue: [
-				self senders add: value]]]
+updateVariablesList
+	ul2 contents: [:html | | li |
+		li := html li 
+			with: 'self';
+			onClick: [self selectVariable: self receiver named: 'self'].
+                selectedVariableName = 'self' ifTrue: [
+			li class: 'selected'].
+                self arguments withIndexDo: [:each :index | | param |
+                        param := selectedContext temps at: index.
+                        li := html li 
+				with: each;
+				onClick: [self selectVariable: param named: each].
+                         selectedVariableName = each ifTrue: [
+				li class: 'selected']].
+                self receiver class allInstanceVariableNames do: [:each | | ivar |
+                        ivar := self receiver instVarAt: each.
+                        li := html li 
+				with: each;
+				onClick: [self selectVariable: ivar named: each].
+                         selectedVariableName = each ifTrue: [
+				li class: 'selected']]].
+	selectedVariable ifNil: [inspectButton at: 'disabled' put: true] ifNotNil: [inspectButton removeAt: 'disabled']
 ! !
 
-!ReferencesBrowser methodsFor: 'initialization'!
-
-initialize
-	super initialize.
-	selector := ''
-! !
+TabWidget subclass: #IDETranscript
+	instanceVariableNames: 'textarea'
+	package: 'IDE'!
 
-!ReferencesBrowser methodsFor: 'private'!
+!IDETranscript methodsFor: 'accessing'!
 
-setInputEvents
-	input
-		onKeyUp: [timer := [self search: input asJQuery val] valueWithTimeout: 100];
-		onKeyDown: [timer ifNotNil: [timer clearTimeout]]
+label
+    ^'Transcript'
 ! !
 
-!ReferencesBrowser methodsFor: 'rendering'!
+!IDETranscript methodsFor: 'actions'!
 
-renderBoxOn: html
-	self 
-		renderInputOn: html;
-		renderImplementorsOn: html;
-		renderSendersOn: html;
-		renderReferencedClassesOn: html
+clear
+    textarea asJQuery val: ''
 !
 
-renderInputOn: html
-	input := html input 
-		class: 'implementors';
-		yourself.
-	input asJQuery val: selector.
-	self setInputEvents
+cr
+    textarea asJQuery val: textarea asJQuery val, String cr.
 !
 
-renderImplementorsOn: html
-	implementorsList := html ul class: 'jt_column implementors'.
-	self updateImplementorsList
+open
+    TabManager current 
+	open;
+	selectTab: self
 !
 
-renderSendersOn: html
-	sendersList := html ul class: 'jt_column senders'.
-	self updateSendersList
+show: anObject
+    textarea ifNil: [self open].
+    textarea asJQuery val: textarea asJQuery val, anObject asString.
+! !
+
+!IDETranscript methodsFor: 'rendering'!
+
+renderBoxOn: html
+    textarea := html textarea.
+    textarea 
+	class: 'jt_transcript';
+	at: 'spellcheck' put: 'false'
 !
 
-renderReferencedClassesOn: html
-	referencedClassesList := html ul class: 'jt_column referenced_classes'.
-	self updateReferencedClassesList
+renderButtonsOn: html
+    html button
+	with: 'Clear transcript';
+	onClick: [self clear]
 ! !
 
-!ReferencesBrowser methodsFor: 'testing'!
+IDETranscript class instanceVariableNames: 'current'!
 
-canBeClosed
-	^true
+!IDETranscript class methodsFor: 'initialization'!
+
+initialize
+	Transcript register: self current
 ! !
 
-!ReferencesBrowser methodsFor: 'updating'!
+!IDETranscript class methodsFor: 'instance creation'!
 
-updateImplementorsList
-    implementorsList contents: [:html |
-	html li
-		class: 'column_label'; 
-		with: 'Implementors (', self implementors size asString, ')';
-		style: 'font-weight: bold'.
-	self implementors do: [:each || li |
-	    li := html li.
-	    li
-		with: (each methodClass asString, ' >> ', self selector);
-		onClick: [self openBrowserOn: each]]]
+current
+	^current ifNil: [current := super new]
 !
 
-updateSendersList
-	sendersList contents: [:html |
-	html li
-		class: 'column_label'; 
-		with: 'Senders (', self senders size asString, ')';
-		style: 'font-weight: bold'.
-	self senders do: [:each |
-		html li
-			with: (each methodClass asString, ' >> ', each selector);
-			onClick: [self openBrowserOn: each]]]
+new
+    self shouldNotImplement
 !
 
-updateReferencedClassesList
-	referencedClassesList contents: [:html |
-	html li
-		class: 'column_label'; 
-		with: 'Class references (', self referencedClasses size asString, ')';
-		style: 'font-weight: bold'.
-	self referencedClasses do: [:each |
-		html li
-			with: (each methodClass asString, ' >> ', each selector);
-			onClick: [self openBrowserOn: each]]]
-! !
-
-!ReferencesBrowser class methodsFor: 'instance creation'!
-
-search: aString
-	^self new
-		searchReferencesFor: aString;
-		open
+open
+    TabManager current 
+	open;
+	selectTab: self current
 ! !
 
-TabWidget subclass: #Debugger
-	instanceVariableNames: 'error selectedContext sourceArea ul ul2 inspector saveButton unsavedChanges selectedVariable selectedVariableName inspectButton'
-	category: 'IDE'!
+TabWidget subclass: #Inspector
+	instanceVariableNames: 'label variables object selectedVariable variablesList valueTextarea diveButton sourceArea'
+	package: 'IDE'!
 
-!Debugger methodsFor: 'accessing'!
+!Inspector methodsFor: 'accessing'!
 
-error
-	^error
+label
+	^label ifNil: ['Inspector (nil)']
 !
 
-error: anError
-	error := anError
+selectedVariable
+	^selectedVariable
 !
 
-label
-	^'[Debugger]'
+selectedVariable: aString
+	selectedVariable := aString
 !
 
-source
-	^self method 
-		ifNil: ['Method doesn''t exist!!']
-		ifNotNil: [self method source]
+setLabel: aString
+	label := aString
 !
 
-method
-	^selectedContext receiver class methodAt: selectedContext selector
+setVariables: aCollection
+	variables := aCollection
 !
 
-arguments
-	^self method 
-		ifNil: [selectedContext temps collect: [:each | nil]]
-		ifNotNil: [self method arguments]
+sourceArea
+	^sourceArea
 !
 
-receiver
-	^selectedContext receiver
+variables
+	^variables
 ! !
 
-!Debugger methodsFor: 'actions'!
-
-selectContext: aContext
-	selectedContext := aContext.
-	selectedVariable := nil.
-	selectedVariableName := nil.
-	self 
-		updateContextsList;
-		updateSourceArea;
-		updateInspector;
-		updateVariablesList;
-		updateStatus
-!
-
-proceed
-	self close.
-	selectedContext receiver perform: selectedContext selector withArguments: selectedContext temps
-!
+!Inspector methodsFor: 'actions'!
 
-save
-	| protocol |
-	protocol := (selectedContext receiver class methodDictionary at: selectedContext selector) category.
-	selectedContext receiver class compile: sourceArea val category: protocol.
-	self updateStatus
+dive
+	(self variables at: self selectedVariable) inspect
 !
 
-selectVariable: anObject named: aString
-	selectedVariable := anObject.
-	selectedVariableName := aString.
-	inspector contents: [:html | html with: anObject printString].
-	self updateVariablesList
+inspect: anObject
+	object := anObject.
+	variables := #().
+	object inspectOn: self
 !
 
-inspectSelectedVariable
-	selectedVariable inspect
-! !
-
-!Debugger methodsFor: 'initialization'!
-
-initialize
-	super initialize.
-	unsavedChanges = false
+refresh
+	self 
+		inspect: object; 
+		updateVariablesList;
+		updateValueTextarea
 ! !
 
-!Debugger methodsFor: 'rendering'!
-
-renderTopPanelOn: html
-	selectedContext := self error context.
-	html div 
-		class: 'top'; 
-		with: [
-			html div 
-				class: 'label';
-				with: self error messageText.
-			ul := html ul 
-				class: 'jt_column debugger contexts';
-				with: [self renderContext: self error context on: html]]
-!
+!Inspector methodsFor: 'rendering'!
 
-renderContext: aContext on: html
-	| li |
-	li := html li.
-	selectedContext = aContext ifTrue: [
-		li class: 'selected'].
-	li 
-		with: aContext asString;
-		onClick: [self selectContext: aContext].
-	aContext home ifNotNil: [self renderContext: aContext home on: html]
+renderBottomPanelOn: html
+    html div
+	class: 'jt_sourceCode';
+	with: [
+	    sourceArea := SourceArea new
+		receiver: object;
+		onDoIt: [self refresh];
+		yourself.
+            sourceArea renderOn: html]
 !
 
-renderBottomPanelOn: html
-	html div
-		class: 'jt_sourceCode debugger';
-		with: [
-			sourceArea := SourceArea new.
-			sourceArea renderOn: html].
-	ul2 := html ul class: 'jt_column debugger variables'.
-	inspector := html div class: 'jt_column debugger inspector'.
-	sourceArea
-		onKeyUp: [self updateStatus]
+renderBoxOn: html
+	self 
+		renderTopPanelOn: html;
+		renderBottomPanelOn: html
 !
 
 renderButtonsOn: html
-	saveButton := html button
-		with: 'Save';
-		onClick: [self save].
-	html button
+	html button 
 		with: 'DoIt';
-		onClick: [sourceArea doIt].
-	html button
+		onClick: [self sourceArea doIt].
+	html button 
 		with: 'PrintIt';
-		onClick: [sourceArea printIt].
-	html button
-		with: 'InspectIt';
-		onClick: [sourceArea inspectIt].
+		onClick: [self sourceArea printIt].
 	html button 
-		with: 'Proceed';
-		onClick: [self proceed].
-	html button
-		with: 'Abandon';
-		onClick: [self close].
-	inspectButton := html button
-		class: 'jt_button debugger inspect';
-		with: 'Inspect';
-		onClick: [self inspectSelectedVariable].
-	 self 
-		updateSourceArea;
-		updateStatus;
+		with: 'InspectIt';
+		onClick: [self sourceArea inspectIt].
+	self updateButtons
+!
+
+renderTopPanelOn: html
+	html div 
+		class: 'top'; 
+		with: [
+			variablesList := html ul class: 'jt_column variables'.
+			valueTextarea := html textarea class: 'jt_column value'; at: 'readonly' put: 'readonly'.
+			html div class: 'jt_tabs inspector'; with: [
+				html button
+					class: 'jt_button inspector refresh';
+					with: 'Refresh';
+					onClick: [self refresh].
+				diveButton := html button 
+					class: 'jt_button inspector dive';
+					with: 'Dive'; 
+					onClick: [self dive]].
+			html div class: 'jt_clear'].
+	self
 		updateVariablesList;
-		updateInspector
-!
-
-renderBoxOn: html
-    self 
-	renderTopPanelOn: html;
-	renderBottomPanelOn: html
+		updateValueTextarea.
 ! !
 
-!Debugger methodsFor: 'testing'!
+!Inspector methodsFor: 'testing'!
 
 canBeClosed
-    ^true
+	^true
 ! !
 
-!Debugger methodsFor: 'updating'!
-
-updateContextsList
-	ul contents: [:html |
-		self renderContext: self error context on: html]
-!
+!Inspector methodsFor: 'updating'!
 
-updateSourceArea
-	 sourceArea val: self source
+selectVariable: aString
+	self selectedVariable: aString.
+	self 
+		updateVariablesList;
+		updateValueTextarea;
+		updateButtons
 !
 
-updateStatus
-	sourceArea val = self source
-		ifTrue: [
-			saveButton ifNotNil: [
-				saveButton at: 'disabled' put: true].
-			unsavedChanges := false]
-		ifFalse: [
-			saveButton ifNotNil: [
-				saveButton removeAt: 'disabled'].
-			unsavedChanges := true]
+updateButtons
+	(self selectedVariable notNil and: [(self variables at: self selectedVariable) notNil])
+		ifFalse: [diveButton at: 'disabled' put: true] 
+		ifTrue: [diveButton removeAt: 'disabled']
 !
 
-updateInspector
-	inspector contents: [:html |]
+updateValueTextarea
+	valueTextarea asJQuery val: (self selectedVariable isNil
+		ifTrue: ['']
+		ifFalse: [(self variables at: self selectedVariable) printString])
 !
 
 updateVariablesList
-	ul2 contents: [:html | | li |
-		li := html li 
-			with: 'self';
-			onClick: [self selectVariable: self receiver named: 'self'].
-                selectedVariableName = 'self' ifTrue: [
-			li class: 'selected'].
-                self arguments withIndexDo: [:each :index | | param |
-                        param := selectedContext temps at: index.
-                        li := html li 
-				with: each;
-				onClick: [self selectVariable: param named: each].
-                         selectedVariableName = each ifTrue: [
-				li class: 'selected']].
-                self receiver class allInstanceVariableNames do: [:each | | ivar |
-                        ivar := self receiver instVarAt: each.
-                        li := html li 
+	variablesList contents: [:html |
+		self variables keys do: [:each || li |
+			li := html li.
+			li
 				with: each;
-				onClick: [self selectVariable: ivar named: each].
-                         selectedVariableName = each ifTrue: [
-				li class: 'selected']]].
-	selectedVariable ifNil: [inspectButton at: 'disabled' put: true] ifNotNil: [inspectButton removeAt: 'disabled']
+				onClick: [self selectVariable: each].
+			self selectedVariable = each ifTrue: [
+				li class: 'selected']]]
+! !
+
+!Inspector class methodsFor: 'instance creation'!
+
+on: anObject
+	^self new
+		inspect: anObject;
+		yourself
 ! !
 
 TabWidget subclass: #ProgressBar
 	instanceVariableNames: 'percent progressDiv div'
-	category: 'IDE'!
+	package: 'IDE'!
 
 !ProgressBar methodsFor: 'accessing'!
 
@@ -1934,12 +1767,198 @@ updatePercent: aNumber
 	self renderProgressBar
 ! !
 
+TabWidget subclass: #ReferencesBrowser
+	instanceVariableNames: 'implementors senders implementorsList input timer selector sendersList referencedClasses referencedClassesList'
+	package: 'IDE'!
+
+!ReferencesBrowser methodsFor: 'accessing'!
+
+classesAndMetaclasses
+	^Smalltalk current classes, (Smalltalk current classes collect: [:each | each class])
+!
+
+implementors
+	^implementors ifNil: [implementors := Array new]
+!
+
+label
+	^'[References]'
+!
+
+referencedClasses
+	^referencedClasses ifNil: [referencedClasses := Array new]
+!
+
+selector
+	^selector
+!
+
+senders
+	^senders ifNil: [senders := Array new]
+! !
+
+!ReferencesBrowser methodsFor: 'actions'!
+
+openBrowserOn: aMethod
+       | browser |
+       browser := Browser openOn: (aMethod methodClass isMetaclass 
+		ifTrue: [aMethod methodClass instanceClass] ifFalse: [aMethod methodClass]).
+       aMethod methodClass isMetaclass ifTrue: [browser selectTab: #class].
+       browser
+               selectProtocol: aMethod category;
+               selectMethod: aMethod
+!
+
+search: aString
+	self 
+		searchReferencesFor: aString;
+		updateImplementorsList;
+		updateSendersList;
+		updateReferencedClassesList
+!
+
+searchReferencedClassesFor: aString
+	self classesAndMetaclasses do: [:each |
+		each methodDictionary values do: [:value |
+			(value referencedClasses includes: selector) ifTrue: [
+				self referencedClasses add: value]]]
+!
+
+searchReferencesFor: aString
+	selector := aString.
+	implementors := Array new.
+	senders := Array new.
+	referencedClasses := Array new.
+	(selector match: '^[A-Z]') 
+		ifFalse: [self searchSelectorReferencesFor: selector]
+		ifTrue: [self searchReferencedClassesFor: selector]
+!
+
+searchSelectorReferencesFor: aString
+	self classesAndMetaclasses do: [:each | 
+		each methodDictionary keysAndValuesDo: [:key :value | 
+			key = selector ifTrue: [self implementors add: value].
+			(value messageSends includes: selector) ifTrue: [
+				self senders add: value]]]
+! !
+
+!ReferencesBrowser methodsFor: 'initialization'!
+
+initialize
+	super initialize.
+	selector := ''
+! !
+
+!ReferencesBrowser methodsFor: 'private'!
+
+setInputEvents
+	input
+		onKeyUp: [timer := [self search: input asJQuery val] valueWithTimeout: 100];
+		onKeyDown: [timer ifNotNil: [timer clearTimeout]]
+! !
+
+!ReferencesBrowser methodsFor: 'rendering'!
+
+renderBoxOn: html
+	self 
+		renderInputOn: html;
+		renderImplementorsOn: html;
+		renderSendersOn: html;
+		renderReferencedClassesOn: html
+!
+
+renderImplementorsOn: html
+	implementorsList := html ul class: 'jt_column implementors'.
+	self updateImplementorsList
+!
+
+renderInputOn: html
+	input := html input 
+		class: 'implementors';
+		yourself.
+	input asJQuery val: selector.
+	self setInputEvents
+!
+
+renderReferencedClassesOn: html
+	referencedClassesList := html ul class: 'jt_column referenced_classes'.
+	self updateReferencedClassesList
+!
+
+renderSendersOn: html
+	sendersList := html ul class: 'jt_column senders'.
+	self updateSendersList
+! !
+
+!ReferencesBrowser methodsFor: 'testing'!
+
+canBeClosed
+	^true
+! !
+
+!ReferencesBrowser methodsFor: 'updating'!
+
+updateImplementorsList
+    implementorsList contents: [:html |
+	html li
+		class: 'column_label'; 
+		with: 'Implementors (', self implementors size asString, ')';
+		style: 'font-weight: bold'.
+	self implementors do: [:each || li |
+	    li := html li.
+	    li
+		with: (each methodClass asString, ' >> ', self selector);
+		onClick: [self openBrowserOn: each]]]
+!
+
+updateReferencedClassesList
+	referencedClassesList contents: [:html |
+	html li
+		class: 'column_label'; 
+		with: 'Class references (', self referencedClasses size asString, ')';
+		style: 'font-weight: bold'.
+	self referencedClasses do: [:each |
+		html li
+			with: (each methodClass asString, ' >> ', each selector);
+			onClick: [self openBrowserOn: each]]]
+!
+
+updateSendersList
+	sendersList contents: [:html |
+	html li
+		class: 'column_label'; 
+		with: 'Senders (', self senders size asString, ')';
+		style: 'font-weight: bold'.
+	self senders do: [:each |
+		html li
+			with: (each methodClass asString, ' >> ', each selector);
+			onClick: [self openBrowserOn: each]]]
+! !
+
+!ReferencesBrowser class methodsFor: 'instance creation'!
+
+search: aString
+	^self new
+		searchReferencesFor: aString;
+		open
+! !
+
 TabWidget subclass: #TestRunner
 	instanceVariableNames: 'selectedCategories packagesList selectedClasses classesList selectedMethods progressBar methodsList result statusDiv'
-	category: 'IDE'!
+	package: 'IDE'!
 
 !TestRunner methodsFor: 'accessing'!
 
+allClasses
+	^TestCase allSubclasses
+!
+
+classes
+    ^(self allClasses 
+	select: [:each | self selectedCategories includes: each category])
+	sort: [:a :b | a name > b name]
+!
+
 label
     ^'SUnit'
 !
@@ -1953,36 +1972,26 @@ packages
     ^packages sort
 !
 
-classes
-    ^(self allClasses 
-	select: [:each | self selectedCategories includes: each category])
-	sort: [:a :b | a name > b name]
+progressBar
+	^progressBar ifNil: [progressBar := ProgressBar new]
 !
 
-selectedCategories
-	^selectedCategories ifNil: [selectedCategories := Array new]
+result
+	^result
 !
 
-allClasses
-	^TestCase allSubclasses
+selectedCategories
+	^selectedCategories ifNil: [selectedCategories := Array new]
 !
 
 selectedClasses
 	^selectedClasses  ifNil: [selectedClasses := Array new]
 !
 
-progressBar
-	^progressBar ifNil: [progressBar := ProgressBar new]
-!
-
 statusInfo
 	^self printTotal, self printPasses, self printErrors, self printFailures
 !
 
-result
-	^result
-!
-
 testCases
 	| testCases |
 	testCases := #().
@@ -1992,6 +2001,24 @@ testCases
 
 !TestRunner methodsFor: 'actions'!
 
+performFailure: aTestCase
+	aTestCase perform: aTestCase selector
+!
+
+run: aCollection
+	result := TestResult new.
+	self 
+		updateStatusDiv;
+		updateMethodsList.
+	self progressBar updatePercent: 0.
+	result total: aCollection size.
+	aCollection do: [:each | 
+		[each runCaseFor: result.
+		self progressBar updatePercent: result runs / result total * 100.
+		self updateStatusDiv.
+		self updateMethodsList] valueWithTimeout: 100].
+!
+
 selectAllCategories
 	self packages do: [:each | 
 		(selectedCategories includes: each) ifFalse: [
@@ -2001,6 +2028,15 @@ selectAllCategories
 	    updateClassesList
 !
 
+selectAllClasses
+	self classes do: [:each | 
+		(selectedClasses includes: each) ifFalse: [
+			self selectedClasses add: each]].
+	self 
+	    updateCategoriesList;
+	    updateClassesList
+!
+
 toggleCategory: aCategory
 	(self isSelectedCategory: aCategory) 
 		ifFalse: [selectedCategories add: aCategory]
@@ -2016,33 +2052,6 @@ toggleClass: aClass
 		ifTrue: [selectedClasses remove: aClass].
 	self 
 	    updateClassesList
-!
-
-selectAllClasses
-	self classes do: [:each | 
-		(selectedClasses includes: each) ifFalse: [
-			self selectedClasses add: each]].
-	self 
-	    updateCategoriesList;
-	    updateClassesList
-!
-
-run: aCollection
-	result := TestResult new.
-	self 
-		updateStatusDiv;
-		updateMethodsList.
-	self progressBar updatePercent: 0.
-	result total: aCollection size.
-	aCollection do: [:each | 
-		[each runCaseFor: result.
-		self progressBar updatePercent: result runs / result total * 100.
-		self updateStatusDiv.
-		self updateMethodsList] valueWithTimeout: 100].
-!
-
-performFailure: aTestCase
-	aTestCase perform: aTestCase selector
 ! !
 
 !TestRunner methodsFor: 'initialization'!
@@ -2095,12 +2104,12 @@ renderClassesOn: html
 	self updateClassesList
 !
 
-renderResultsOn: html
-	statusDiv := html div.
-	html with: self progressBar.
-	methodsList := html ul class: 'jt_column sunit results'.
-	self updateMethodsList.
-	self updateStatusDiv
+renderErrorsOn: html
+	self result errors do: [:each |
+		html li 
+			class: 'errors';
+			with: each class name, ' >> ', each selector;
+                        onClick: [self performFailure: each]]
 !
 
 renderFailuresOn: html
@@ -2111,22 +2120,22 @@ renderFailuresOn: html
                         onClick: [self performFailure: each]]
 !
 
-renderErrorsOn: html
-	self result errors do: [:each |
-		html li 
-			class: 'errors';
-			with: each class name, ' >> ', each selector;
-                        onClick: [self performFailure: each]]
+renderResultsOn: html
+	statusDiv := html div.
+	html with: self progressBar.
+	methodsList := html ul class: 'jt_column sunit results'.
+	self updateMethodsList.
+	self updateStatusDiv
 ! !
 
 !TestRunner methodsFor: 'testing'!
 
-isSelectedClass: aClass
-	^(self selectedClasses includes: aClass)
-!
-
 isSelectedCategory: aCategory
 	^(self selectedCategories includes: aCategory)
+!
+
+isSelectedClass: aClass
+	^(self selectedClasses includes: aClass)
 ! !
 
 !TestRunner methodsFor: 'updating'!
@@ -2174,74 +2183,65 @@ updateStatusDiv
 		html span with: self statusInfo]
 ! !
 
-TabWidget subclass: #IDETranscript
-	instanceVariableNames: 'textarea'
-	category: 'IDE'!
+TabWidget subclass: #Workspace
+	instanceVariableNames: 'sourceArea'
+	package: 'IDE'!
 
-!IDETranscript methodsFor: 'accessing'!
+!Workspace methodsFor: 'accessing'!
 
 label
-    ^'Transcript'
+    ^'Workspace'
 ! !
 
-!IDETranscript methodsFor: 'actions'!
+!Workspace methodsFor: 'actions'!
 
-clear
-    textarea asJQuery val: ''
+clearWorkspace
+    sourceArea clear
 !
 
-cr
-    textarea asJQuery val: textarea asJQuery val, String cr.
+doIt
+   sourceArea doIt
 !
 
-show: anObject
-    textarea ifNil: [self open].
-    textarea asJQuery val: textarea asJQuery val, anObject asString.
+fileIn
+    sourceArea fileIn
 !
 
-open
-    TabManager current 
-	open;
-	selectTab: self
+inspectIt
+    sourceArea inspectIt
+!
+
+printIt
+	sourceArea printIt
 ! !
 
-!IDETranscript methodsFor: 'rendering'!
+!Workspace methodsFor: 'rendering'!
 
 renderBoxOn: html
-    textarea := html textarea.
-    textarea 
-	class: 'jt_transcript';
-	at: 'spellcheck' put: 'false'
+    sourceArea := SourceArea new.
+    sourceArea renderOn: html
 !
 
 renderButtonsOn: html
     html button
-	with: 'Clear transcript';
-	onClick: [self clear]
-! !
-
-IDETranscript class instanceVariableNames: 'current'!
-
-!IDETranscript class methodsFor: 'initialization'!
-
-initialize
-	Transcript register: self current
-! !
-
-!IDETranscript class methodsFor: 'instance creation'!
-
-new
-    self shouldNotImplement
-!
-
-open
-    TabManager current 
-	open;
-	selectTab: self current
-!
-
-current
-	^current ifNil: [current := super new]
+	with: 'DoIt';
+	title: 'ctrl+d';
+	onClick: [self doIt].
+    html button
+	with: 'PrintIt';
+	title: 'ctrl+p';
+	onClick: [self printIt].
+    html button
+	with: 'InspectIt';
+	title: 'ctrl+i';
+	onClick: [self inspectIt].
+    html button
+	with: 'FileIn';
+	title: 'ctrl+f';
+	onClick: [self fileIn].
+    html button
+	with: 'Clear workspace';
+	onClick: [self clearWorkspace]
 ! !
 
 !Object methodsFor: '*IDE'!
@@ -2263,32 +2263,28 @@ inspectOn: anInspector
 		setVariables: variables
 ! !
 
-!Date methodsFor: '*IDE'!
+!Collection methodsFor: '*IDE'!
 
 inspectOn: anInspector
 	| variables |
 	variables := Dictionary new.
 	variables at: '#self' put: self.
-	variables at: '#year' put: self year.
-	variables at: '#month' put: self month.
-	variables at: '#day' put: self day.
-	variables at: '#hours' put: self hours.
-	variables at: '#minutes' put: self minutes.
-	variables at: '#seconds' put: self seconds.
-	variables at: '#milliseconds' put: self milliseconds.
+	self withIndexDo: [:each :i |
+		variables at: i put: each].
 	anInspector 
 		setLabel: self printString;
 		setVariables: variables
 ! !
 
-!Collection methodsFor: '*IDE'!
+!HashedCollection methodsFor: '*IDE'!
 
 inspectOn: anInspector
 	| variables |
 	variables := Dictionary new.
 	variables at: '#self' put: self.
-	self withIndexDo: [:each :i |
-		variables at: i put: each].
+	variables at: '#keys' put: self keys.
+	self keysAndValuesDo: [:key :value |
+		variables at: key put: value].
 	anInspector 
 		setLabel: self printString;
 		setVariables: variables
@@ -2305,18 +2301,14 @@ inspectOn: anInspector
 	anInspector setLabel: label
 ! !
 
-!MethodContext methodsFor: '*IDE'!
+!Set methodsFor: '*IDE'!
 
 inspectOn: anInspector
 	| variables |
 	variables := Dictionary new.
 	variables at: '#self' put: self.
-	variables at: '#home' put: self home.
-	variables at: '#receiver' put: self receiver.
-	variables at: '#selector' put: self selector.
-	variables at: '#temps' put: self temps.
-	self class instanceVariableNames do: [:each |
-		variables at: each put: (self instVarAt: each)].
+	elements withIndexDo: [:each :i |
+		variables at: i put: each].
 	anInspector 
 		setLabel: self printString;
 		setVariables: variables
@@ -2340,28 +2332,36 @@ inspectOn: anInspector
 		setVariables: variables
 ! !
 
-!Set methodsFor: '*IDE'!
+!Date methodsFor: '*IDE'!
 
 inspectOn: anInspector
 	| variables |
 	variables := Dictionary new.
 	variables at: '#self' put: self.
-	elements withIndexDo: [:each :i |
-		variables at: i put: each].
+	variables at: '#year' put: self year.
+	variables at: '#month' put: self month.
+	variables at: '#day' put: self day.
+	variables at: '#hours' put: self hours.
+	variables at: '#minutes' put: self minutes.
+	variables at: '#seconds' put: self seconds.
+	variables at: '#milliseconds' put: self milliseconds.
 	anInspector 
 		setLabel: self printString;
 		setVariables: variables
 ! !
 
-!HashedCollection methodsFor: '*IDE'!
+!MethodContext methodsFor: '*IDE'!
 
 inspectOn: anInspector
 	| variables |
 	variables := Dictionary new.
 	variables at: '#self' put: self.
-	variables at: '#keys' put: self keys.
-	self keysAndValuesDo: [:key :value |
-		variables at: key put: value].
+	variables at: '#home' put: self home.
+	variables at: '#receiver' put: self receiver.
+	variables at: '#selector' put: self selector.
+	variables at: '#temps' put: self temps.
+	self class instanceVariableNames do: [:each |
+		variables at: each put: (self instVarAt: each)].
 	anInspector 
 		setLabel: self printString;
 		setVariables: variables
diff --git a/amber/src/st/Kernel-Announcements.st b/amber/src/st/Kernel-Announcements.st
index 7bc64daeeb7..ea4d21805b7 100644
--- a/amber/src/st/Kernel-Announcements.st
+++ b/amber/src/st/Kernel-Announcements.st
@@ -1,7 +1,7 @@
 Smalltalk current createPackage: 'Kernel-Announcements' properties: #{}!
 Object subclass: #AnnouncementSubscription
 	instanceVariableNames: 'block announcementClass'
-	category: 'Kernel-Announcements'!
+	package: 'Kernel-Announcements'!
 
 !AnnouncementSubscription methodsFor: 'accessing'!
 
@@ -34,7 +34,7 @@ handlesAnnouncement: anAnnouncement
 
 Object subclass: #Announcer
 	instanceVariableNames: 'registry subscriptions'
-	category: 'Kernel-Announcements'!
+	package: 'Kernel-Announcements'!
 
 !Announcer methodsFor: 'announcing'!
 
diff --git a/amber/src/st/Kernel-Classes.st b/amber/src/st/Kernel-Classes.st
index fbf367cf7a1..38e48494ab0 100644
--- a/amber/src/st/Kernel-Classes.st
+++ b/amber/src/st/Kernel-Classes.st
@@ -1,7 +1,7 @@
 Smalltalk current createPackage: 'Kernel-Classes' properties: #{}!
 Object subclass: #Behavior
 	instanceVariableNames: ''
-	category: 'Kernel-Classes'!
+	package: 'Kernel-Classes'!
 !Behavior commentStamp!
 Behavior is the superclass of all class objects. 
 
@@ -13,16 +13,12 @@ Behavior also  provides methods for compiling methods, examining the method dict
 
 !Behavior methodsFor: 'accessing'!
 
-name
-	<return self.className || nil>
-!
-
-superclass
-	<return self.superclass || nil>
-!
-
-subclasses
-	<return smalltalk.subclasses(self)>
+allInstanceVariableNames
+	| result |
+	result := self instanceVariableNames copy.
+	self superclass ifNotNil: [
+	    result addAll: self superclass allInstanceVariableNames].
+	^result
 !
 
 allSubclasses
@@ -33,12 +29,30 @@ allSubclasses
 	^result
 !
 
-withAllSubclasses
-	^(Array with: self) addAll: self allSubclasses; yourself
+comment
+    ^(self basicAt: 'comment') ifNil: ['']
 !
 
-prototype
-	<return self.fn.prototype>
+comment: aString
+    self basicAt: 'comment' put: aString
+!
+
+commentStamp
+    ^ClassCommentReader new
+	class: self;
+	yourself
+!
+
+commentStamp: aStamp prior: prior
+        ^self commentStamp
+!
+
+instanceVariableNames
+	<return self.iVarNames>
+!
+
+methodAt: aString
+	<return smalltalk.methods(self)[aString]>
 !
 
 methodDictionary
@@ -58,22 +72,13 @@ methodsFor: aString
 	    yourself
 !
 
-instanceVariableNames
-	<return self.iVarNames>
-!
-
-comment
-    ^(self basicAt: 'comment') ifNil: ['']
-!
-
-comment: aString
-    self basicAt: 'comment' put: aString
+methodsFor: aString stamp: aStamp
+	"Added for compatibility, right now ignores stamp."
+	^self methodsFor: aString
 !
 
-commentStamp
-    ^ClassCommentReader new
-	class: self;
-	yourself
+name
+	<return self.className || nil>
 !
 
 protocols
@@ -98,25 +103,20 @@ protocolsDo: aBlock
 		aBlock value: category value: (methodsByCategory at: category)]
 !
 
-allInstanceVariableNames
-	| result |
-	result := self instanceVariableNames copy.
-	self superclass ifNotNil: [
-	    result addAll: self superclass allInstanceVariableNames].
-	^result
+prototype
+	<return self.fn.prototype>
 !
 
-methodAt: aString
-	<return smalltalk.methods(self)[aString]>
+subclasses
+	<return smalltalk.subclasses(self)>
 !
 
-methodsFor: aString stamp: aStamp
-	"Added for compatibility, right now ignores stamp."
-	^self methodsFor: aString
+superclass
+	<return self.superclass || nil>
 !
 
-commentStamp: aStamp prior: prior
-        ^self commentStamp
+withAllSubclasses
+	^(Array with: self) addAll: self allSubclasses; yourself
 ! !
 
 !Behavior methodsFor: 'compiling'!
@@ -125,12 +125,6 @@ addCompiledMethod: aMethod
 	<smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self)>
 !
 
-removeCompiledMethod: aMethod
-	<delete self.fn.prototype[aMethod.selector._asSelector()];
-	delete self.fn.prototype.methods[aMethod.selector];
-	smalltalk.init(self);>
-!
-
 compile: aString
 	self compile: aString category: ''
 !
@@ -140,16 +134,22 @@ compile: aString category: anotherString
 	method := Compiler new load: aString forClass: self.
 	method category: anotherString.
 	self addCompiledMethod: method
+!
+
+removeCompiledMethod: aMethod
+	<delete self.fn.prototype[aMethod.selector._asSelector()];
+	delete self.fn.prototype.methods[aMethod.selector];
+	smalltalk.init(self);>
 ! !
 
 !Behavior methodsFor: 'instance creation'!
 
-new
-	^self basicNew initialize
-!
-
 basicNew
 	<return new self.fn()>
+!
+
+new
+	^self basicNew initialize
 ! !
 
 !Behavior methodsFor: 'testing'!
@@ -160,7 +160,7 @@ inheritsFrom: aClass
 
 Behavior subclass: #Class
 	instanceVariableNames: ''
-	category: 'Kernel-Classes'!
+	package: 'Kernel-Classes'!
 !Class commentStamp!
 Class is __the__ class object. 
 
@@ -173,20 +173,20 @@ category
 	^self package ifNil: ['Unclassified'] ifNotNil: [self package name]
 !
 
-rename: aString
-	<
-		smalltalk[aString] = self;
-		delete smalltalk[self.className];
-		self.className = aString;
-	>
-!
-
 package
 	<return self.pkg>
 !
 
 package: aPackage
 	<self.pkg = aPackage>
+!
+
+rename: aString
+	<
+		smalltalk[aString] = self;
+		delete smalltalk[self.className];
+		self.className = aString;
+	>
 ! !
 
 !Class methodsFor: 'class creation'!
@@ -226,7 +226,7 @@ isClass
 
 Behavior subclass: #Metaclass
 	instanceVariableNames: ''
-	category: 'Kernel-Classes'!
+	package: 'Kernel-Classes'!
 !Metaclass commentStamp!
 Metaclass is the root of the class hierarchy.
 
@@ -258,7 +258,7 @@ isMetaclass
 
 Object subclass: #ClassBuilder
 	instanceVariableNames: ''
-	category: 'Kernel-Classes'!
+	package: 'Kernel-Classes'!
 !ClassBuilder commentStamp!
 ClassBuilder is responsible for compiling new classes or modifying existing classes in the system.
 
@@ -266,16 +266,16 @@ Rather than using ClassBuilder directly to compile a class, use `Class >> subcla
 
 !ClassBuilder methodsFor: 'class creation'!
 
-superclass: aClass subclass: aString
-	^self superclass: aClass subclass: aString instanceVariableNames: '' package: nil
-!
-
 class: aClass instanceVariableNames: aString
 	aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].
 	aClass basicAt: 'iVarNames' put: (self instanceVariableNamesFor: aString).
 	self setupClass: aClass
 !
 
+superclass: aClass subclass: aString
+	^self superclass: aClass subclass: aString instanceVariableNames: '' package: nil
+!
+
 superclass: aClass subclass: aString instanceVariableNames: aString2 package: aString3
 	| newClass |
 	newClass := self addSubclassOf: aClass
@@ -287,19 +287,11 @@ superclass: aClass subclass: aString instanceVariableNames: aString2 package: aS
 
 !ClassBuilder methodsFor: 'private'!
 
-instanceVariableNamesFor: aString
-	^(aString tokenize: ' ') reject: [:each | each isEmpty]
-!
-
 addSubclassOf: aClass named: aString instanceVariableNames: aCollection
 	<smalltalk.addClass(aString, aClass, aCollection);
 	    return smalltalk[aString]>
 !
 
-setupClass: aClass
-	<smalltalk.init(aClass);>
-!
-
 addSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName
 	<smalltalk.addClass(aString, aClass, aCollection, packageName);
 	    return smalltalk[aString]>
@@ -326,11 +318,19 @@ copyClass: aClass named: aString
 
 	self setupClass: newClass.
 	^newClass
+!
+
+instanceVariableNamesFor: aString
+	^(aString tokenize: ' ') reject: [:each | each isEmpty]
+!
+
+setupClass: aClass
+	<smalltalk.init(aClass);>
 ! !
 
 Object subclass: #ClassCategoryReader
 	instanceVariableNames: 'class category chunkParser'
-	category: 'Kernel-Classes'!
+	package: 'Kernel-Classes'!
 !ClassCategoryReader commentStamp!
 ClassCategoryReader represents a mechanism for retrieving class descriptions stored on a file.!
 
@@ -360,15 +360,16 @@ initialize
 !ClassCategoryReader methodsFor: 'private'!
 
 compileMethod: aString
-	| method |
-	method := Compiler new load: aString forClass: class.
+	| method compiler |
+	method := (compiler := Compiler new) load: aString forClass: class.
 	method category: category.
-	class addCompiledMethod: method
+	class addCompiledMethod: method.
+	compiler setupClass: class.
 ! !
 
 Object subclass: #ClassCommentReader
 	instanceVariableNames: 'class chunkParser'
-	category: 'Kernel-Classes'!
+	package: 'Kernel-Classes'!
 !ClassCommentReader commentStamp!
 ClassCommentReader represents a mechanism for retrieving class descriptions stored on a file.
 See `ClassCategoryReader` too.!
@@ -401,3 +402,61 @@ setComment: aString
     class comment: aString
 ! !
 
+Object subclass: #ClassSorterNode
+	instanceVariableNames: 'theClass level nodes'
+	package: 'Kernel-Classes'!
+
+!ClassSorterNode methodsFor: 'accessing'!
+
+getNodesFrom: aCollection
+	| children others |
+	children := #().
+	others := #().
+	aCollection do: [:each |
+		(each superclass = self theClass)
+			ifTrue: [children add: each]
+			ifFalse: [others add: each]].
+	nodes:= children collect: [:each |
+		ClassSorterNode on: each classes: others level: self level + 1]
+!
+
+level
+	^level
+!
+
+level: anInteger
+	level := anInteger
+!
+
+nodes
+	^nodes
+!
+
+theClass
+	^theClass
+!
+
+theClass: aClass
+	theClass := aClass
+! !
+
+!ClassSorterNode methodsFor: 'visiting'!
+
+traverseClassesWith: aCollection
+	"sort classes alphabetically Issue #143"
+
+	aCollection add: self theClass.
+	(self nodes sorted: [:a :b | a theClass name <= b theClass name ]) do: [:aNode |
+		aNode traverseClassesWith: aCollection ].
+! !
+
+!ClassSorterNode class methodsFor: 'instance creation'!
+
+on: aClass classes: aCollection level: anInteger
+	^self new
+		theClass: aClass;
+		level: anInteger;
+		getNodesFrom: aCollection;
+		yourself
+! !
+
diff --git a/amber/src/st/Kernel-Collections.st b/amber/src/st/Kernel-Collections.st
index 88024caee5e..06fc1aeec49 100644
--- a/amber/src/st/Kernel-Collections.st
+++ b/amber/src/st/Kernel-Collections.st
@@ -1,24 +1,24 @@
 Smalltalk current createPackage: 'Kernel-Collections' properties: #{}!
 Object subclass: #Association
 	instanceVariableNames: 'key value'
-	category: 'Kernel-Collections'!
+	package: 'Kernel-Collections'!
 
 !Association methodsFor: 'accessing'!
 
-key: aKey
-	key := aKey
-!
-
 key
 	^key
 !
 
-value: aValue
-	value := aValue
+key: aKey
+	key := aKey
 !
 
 value
 	^value
+!
+
+value: aValue
+	value := aValue
 ! !
 
 !Association methodsFor: 'comparing'!
@@ -48,183 +48,18 @@ key: aKey value: aValue
 		yourself
 ! !
 
-Object subclass: #Stream
-	instanceVariableNames: 'collection position streamSize'
-	category: 'Kernel-Collections'!
-
-!Stream methodsFor: 'accessing'!
-
-collection
-	^collection
-!
-
-setCollection: aCollection
-	collection := aCollection
-!
-
-position
-	^position ifNil: [position := 0]
-!
-
-position: anInteger
-	position := anInteger
-!
-
-streamSize
-	^streamSize
-!
-
-setStreamSize: anInteger
-	streamSize := anInteger
-!
-
-contents
-	^self collection
-	    copyFrom: 1 
-	    to: self streamSize
-!
-
-size
-	^self streamSize
-! !
-
-!Stream methodsFor: 'actions'!
-
-reset
-	self position: 0
-!
-
-close
-!
-
-flush
-!
-
-resetContents
-	self reset.
-	self setStreamSize: 0
-! !
-
-!Stream methodsFor: 'enumerating'!
-
-do: aBlock
-	[self atEnd] whileFalse: [aBlock value: self next]
-! !
-
-!Stream methodsFor: 'positioning'!
-
-setToEnd
-	self position: self size
-!
-
-skip: anInteger
-	self position: ((self position + anInteger) min: self size max: 0)
-! !
-
-!Stream methodsFor: 'reading'!
-
-next
-	^self atEnd 
-		ifTrue: [nil]
-		ifFalse: [
-			self position: self position + 1. 
-			collection at: self position]
-!
-
-next: anInteger
-	| tempCollection |
-	tempCollection := self collection class new.
-	anInteger timesRepeat: [
-	    self atEnd ifFalse: [
-		tempCollection add: self next]].
-	^tempCollection
-!
-
-peek
-	^self atEnd ifFalse: [
-	    self collection at: self position + 1]
-! !
-
-!Stream methodsFor: 'testing'!
-
-atEnd
-	^self position = self size
-!
-
-atStart
-	^self position = 0
-!
-
-isEmpty
-	^self size = 0
-! !
-
-!Stream methodsFor: 'writing'!
-
-nextPut: anObject
-	self position: self position + 1.
-	self collection at: self position put: anObject.
-	self setStreamSize: (self streamSize max: self position)
-!
-
-nextPutAll: aCollection
-	aCollection do: [:each |
-	    self nextPut: each]
-! !
-
-!Stream class methodsFor: 'instance creation'!
-
-on: aCollection
-	    ^self new 
-		setCollection: aCollection;
-		setStreamSize: aCollection size;
-		yourself
-! !
-
-Object subclass: #RegularExpression
-	instanceVariableNames: ''
-	category: 'Kernel-Collections'!
-
-!RegularExpression methodsFor: 'evaluating'!
-
-compile: aString
-	<return self.compile(aString)>
-!
-
-exec: aString
-	<return self.exec(aString) || nil>
-!
-
-test: aString
-	<return self.test(aString)>
-! !
-
-!RegularExpression class methodsFor: 'instance creation'!
-
-fromString: aString flag: anotherString
-	<return new RegExp(aString, anotherString)>
-!
-
-fromString: aString
-	    ^self fromString: aString flag: ''
-! !
-
 Object subclass: #Collection
 	instanceVariableNames: ''
-	category: 'Kernel-Collections'!
+	package: 'Kernel-Collections'!
 
 !Collection methodsFor: 'accessing'!
 
-size
-	self subclassResponsibility
-!
-
 readStream
 	^self stream
 !
 
-writeStream
-	^self stream
+size
+	self subclassResponsibility
 !
 
 stream
@@ -233,6 +68,10 @@ stream
 
 streamClass
 	^self class streamClass
+!
+
+writeStream
+	^self stream
 ! !
 
 !Collection methodsFor: 'adding/removing'!
@@ -261,16 +100,16 @@ asArray
 	^Array withAll: self
 !
 
-asSet
-	^Set withAll: self
+asJSON
+	^self asArray collect: [:each | each asJSON]
 !
 
 asOrderedCollection
 	^self asArray
 !
 
-asJSON
-	^self asArray collect: [:each | each asJSON]
+asSet
+	^Set withAll: self
 ! !
 
 !Collection methodsFor: 'copying'!
@@ -298,10 +137,6 @@ copyWithoutAll: aCollection
 
 !Collection methodsFor: 'enumerating'!
 
-do: aBlock
-	<for(var i=0;i<self.length;i++){aBlock(self[i]);}>
-!
-
 collect: aBlock
 	| newCollection |
 	newCollection := self class new.
@@ -323,6 +158,10 @@ detect: aBlock ifNone: anotherBlock
 	>
 !
 
+do: aBlock
+	<for(var i=0;i<self.length;i++){aBlock(self[i]);}>
+!
+
 do: aBlock separatedBy: anotherBlock
 	| first |
 	first := true.
@@ -362,6 +201,18 @@ errorNotFound
 
 !Collection methodsFor: 'testing'!
 
+ifEmpty: aBlock
+	"Evaluate the given block with the receiver as argument, answering its value if the receiver is empty, otherwise answer the receiver. Note that the fact that this method returns its argument in case the receiver is not empty allows one to write expressions like the following ones: self classifyMethodAs: 
+		(myProtocol ifEmpty: ['As yet unclassified'])"
+	^ self isEmpty 
+		ifTrue: [ aBlock value ]
+		ifFalse: [ self ]
+!
+
+ifNotEmpty: aBlock
+	self notEmpty ifTrue: aBlock.
+!
+
 includes: anObject
 	<
 		var i = self.length;
@@ -372,24 +223,12 @@ includes: anObject
 	>
 !
 
-notEmpty
-	^self isEmpty not
-!
-
 isEmpty
 	^self size = 0
 !
 
-ifNotEmpty: aBlock
-	self notEmpty ifTrue: aBlock.
-!
-
-ifEmpty: aBlock
-	"Evaluate the given block with the receiver as argument, answering its value if the receiver is empty, otherwise answer the receiver. Note that the fact that this method returns its argument in case the receiver is not empty allows one to write expressions like the following ones: self classifyMethodAs: 
-		(myProtocol ifEmpty: ['As yet unclassified'])"
-	^ self isEmpty 
-		ifTrue: [ aBlock value ]
-		ifFalse: [ self ]
+notEmpty
+	^self isEmpty not
 ! !
 
 !Collection class methodsFor: 'accessing'!
@@ -400,6 +239,10 @@ streamClass
 
 !Collection class methodsFor: 'instance creation'!
 
+new: anInteger
+	^self new
+!
+
 with: anObject
 	    ^self new
 		add: anObject;
@@ -425,699 +268,642 @@ withAll: aCollection
 	    ^self new
 		addAll: aCollection;
 		yourself
-!
-
-new: anInteger
-	^self new
 ! !
 
-Collection subclass: #SequenceableCollection
+Collection subclass: #HashedCollection
 	instanceVariableNames: ''
-	category: 'Kernel-Collections'!
+	package: 'Kernel-Collections'!
+!HashedCollection commentStamp!
+A HashedCollection is a traditional JavaScript object, or a Smalltalk Dictionary.
 
-!SequenceableCollection methodsFor: 'accessing'!
+Unlike a Dictionary, it can only have strings as keys.!
 
-at: anIndex
-	^self at: anIndex ifAbsent: [
-	    self errorNotFound]
+!HashedCollection methodsFor: 'accessing'!
+
+associations
+	| associations |
+	associations := #().
+	self keys do: [:each |
+	    associations add: (Association key: each value: (self at: each))].
+	^associations
 !
 
-at: anIndex ifAbsent: aBlock
-	self subclassResponsibility
+at: aKey
+	^self at: aKey ifAbsent: [self errorNotFound]
 !
 
-at: anIndex put: anObject
-	self subclassResponsibility
+at: aKey ifAbsent: aBlock
+	^(self includesKey: aKey)
+		ifTrue: [self basicAt: aKey]
+		ifFalse: aBlock
 !
 
-first
-	^self at: 1
+at: aKey ifAbsentPut: aBlock
+	^self at: aKey ifAbsent: [
+	    self at: aKey put: aBlock value]
 !
 
-fourth
-	^self at: 4
+at: aKey ifPresent: aBlock
+	^(self basicAt: aKey) ifNotNil: [aBlock value: (self at: aKey)]
 !
 
-last
-	^self at: self size
+at: aKey ifPresent: aBlock ifAbsent: anotherBlock
+	^(self basicAt: aKey)
+	    ifNil: anotherBlock
+	    ifNotNil: [aBlock value: (self at: aKey)]
 !
 
-second
-	^self at: 2
+at: aKey put: aValue
+	^self basicAt: aKey put: aValue
 !
 
-third
-	^self at: 3
+keys
+	<
+		var keys = [];
+		for(var i in self) {
+			if(self.hasOwnProperty(i)) {
+				keys.push(i);
+			}
+		};
+		return keys;
+	>
 !
 
-allButFirst
-	^self copyFrom: 2 to: self size
+size
+	^self keys size
 !
 
-allButLast
-	^self copyFrom: 1 to: self size - 1
-!
+values
+	^self keys collect: [:each | self at: each]
+! !
 
-indexOf: anObject
-	^self indexOf: anObject ifAbsent: [self errorNotFound]
-!
+!HashedCollection methodsFor: 'adding/removing'!
 
-indexOf: anObject ifAbsent: aBlock
-	<
-		for(var i=0;i<self.length;i++){
-			if(self[i].__eq(anObject)) {return i+1}
-		}
-		return aBlock();
-	>
+add: anAssociation
+	self at: anAssociation key put: anAssociation value
 !
 
-indexOf: anObject startingAt: start ifAbsent: aBlock
-	<
-		for(var i=start-1;i<self.length;i++){
-			if(self[i].__eq(anObject)) {return i+1}
-		}
-		return aBlock();
-	>
+addAll: aHashedCollection
+	super addAll: aHashedCollection associations.
+	^aHashedCollection
 !
 
-indexOf: anObject startingAt: start
-	"Answer the index of the first occurence of anElement after start
-	within the receiver. If the receiver does not contain anElement, 
-	answer 0."
-	^self indexOf: anObject startingAt: start ifAbsent: [0]
+remove: aKey ifAbsent: aBlock
+    ^self removeKey: aKey ifAbsent: aBlock
 !
 
-atRandom
-	^ self at: self size atRandom
+removeKey: aKey
+    ^self remove: aKey
 !
 
-first: n
-	"Answer the first n elements of the receiver.
-	Raise an error if there are not enough elements."
-
-	^ self copyFrom: 1 to: n
+removeKey: aKey ifAbsent: aBlock
+	^(self includesKey: aKey) 
+		ifFalse: [aBlock value]
+		ifTrue: [self basicDelete: aKey]
 ! !
 
-!SequenceableCollection methodsFor: 'adding'!
-
-removeLast
-	self remove: self last
-!
+!HashedCollection methodsFor: 'comparing'!
 
-addLast: anObject
-	self add: anObject
+= aHashedCollection
+	self class = aHashedCollection class ifFalse: [^false].
+	self size = aHashedCollection size ifFalse: [^false].
+	^self associations = aHashedCollection associations
 ! !
 
-!SequenceableCollection methodsFor: 'comparing'!
-
-= aCollection
-	(self class = aCollection class and: [
-		self size = aCollection size]) ifFalse: [^false].
-	self withIndexDo: [:each :i |
-                 (aCollection at: i) = each ifFalse: [^false]].
-	^true
-! !
+!HashedCollection methodsFor: 'converting'!
 
-!SequenceableCollection methodsFor: 'converting'!
+asDictionary
+	^Dictionary fromPairs: self associations
+!
 
-reversed
-	self subclassResponsibility
+asJSON
+	| c |
+	c := self class new.
+	self keysAndValuesDo: [:key :value |
+		c at: key put: value asJSON].
+	^c
 ! !
 
-!SequenceableCollection methodsFor: 'copying'!
+!HashedCollection methodsFor: 'copying'!
 
-copyFrom: anIndex to: anotherIndex
-	| range newCollection |
-	range := anIndex to: anotherIndex.
-	newCollection := self class new: range size.
-	range withIndexDo: [:each :i |
-	    newCollection at: i put: (self at: each)].
-	^newCollection
+, aCollection
+	self shouldNotImplement
 !
 
-shallowCopy
-	| newCollection |
-	newCollection := self class new: self size.
-	self withIndexDo: [ :each :index | 
-		newCollection at: index put: each].
-	^newCollection
+copyFrom: anIndex to: anotherIndex
+	self shouldNotImplement
 !
 
 deepCopy
-	| newCollection |
-	newCollection := self class new: self size.
-	self withIndexDo: [:each :index | 
-		newCollection at: index put: each deepCopy].
-	^newCollection
-! !
-
-!SequenceableCollection methodsFor: 'enumerating'!
-
-withIndexDo: aBlock
-	<for(var i=0;i<self.length;i++){aBlock(self[i], i+1);}>
-! !
-
-!SequenceableCollection methodsFor: 'printing'!
-
-printString
-	| str |
-	str := '' writeStream.
-	str nextPutAll: super printString, ' ('.
-	self 
-		do: [:each | str nextPutAll: each printString]
-		separatedBy: [str nextPutAll: ' '].
-	str nextPutAll: ')'.
-	^str contents
-! !
-
-SequenceableCollection subclass: #CharacterArray
-	instanceVariableNames: ''
-	category: 'Kernel-Collections'!
-
-!CharacterArray methodsFor: 'accessing'!
+	| copy |
+	copy := self class new.
+	self associationsDo: [:each |
+	    copy at: each key  put: each value deepCopy].
+	^copy
+!
 
-at: anIndex put: anObject
-	self errorReadOnly
+shallowCopy
+	| copy |
+	copy := self class new.
+	self associationsDo: [:each |
+	    copy at: each key  put: each value].
+	^copy
 ! !
 
-!CharacterArray methodsFor: 'adding'!
+!HashedCollection methodsFor: 'enumerating'!
 
-add: anObject
-	self errorReadOnly
+associationsDo: aBlock
+	self associations do: aBlock
 !
 
-remove: anObject
-	self errorReadOnly
-! !
-
-!CharacterArray methodsFor: 'converting'!
+collect: aBlock
+	| newDict |
+	newDict := self class new.
+	self keysAndValuesDo: [:key :value |
+	    newDict at: key put: (aBlock value: value)].
+	^newDict
+!
 
-asString
-	^self subclassResponsibility
+detect: aBlock ifNone: anotherBlock
+	^self values detect: aBlock ifNone: anotherBlock
 !
 
-asNumber
-	^self asString asNumber
+do: aBlock
+	self values do: aBlock
 !
 
-asUppercase
-	^self class fromString: self asString asUppercase
+includes: anObject
+	^self values includes: anObject
 !
 
-asSymbol
-	^self subclassResponsibility
+keysAndValuesDo: aBlock
+	self associationsDo: [:each |
+	    aBlock value: each key value: each value]
 !
 
-asLowercase
-	^self class fromString: self asString asLowercase
+select: aBlock
+	| newDict |
+	newDict := self class new.
+	self keysAndValuesDo: [:key :value |
+	    (aBlock value: value) ifTrue: [newDict at: key put: value]].
+	^newDict
 ! !
 
-!CharacterArray methodsFor: 'copying'!
+!HashedCollection methodsFor: 'printing'!
 
-, aString
-	^self asString, aString asString
+printString
+	^String streamContents: [:aStream|  
+		aStream 
+			nextPutAll: super printString;
+			nextPutAll: '('.
+				self associations 
+					do: [:anAssociation|  
+						aStream 
+							nextPutAll: anAssociation key printString;
+								nextPutAll: ' -> ';
+								nextPutAll: anAssociation value printString]
+							separatedBy: [aStream nextPutAll: ' , '].
+						aStream nextPutAll: ')']
+!
+
+storeOn: aStream
+	aStream nextPutAll: '#{'.
+	self associations
+		do: [:each | each storeOn: aStream]
+		separatedBy: [ aStream nextPutAll: '. '].
+	aStream nextPutAll: '}'
 ! !
 
-!CharacterArray methodsFor: 'error handling'!
+!HashedCollection methodsFor: 'testing'!
 
-errorReadOnly
-	self error: 'Object is read-only'
+includesKey: aKey
+	<return self.hasOwnProperty(aKey)>
 ! !
 
-!CharacterArray methodsFor: 'printing'!
+!HashedCollection class methodsFor: 'instance creation'!
 
-printString
-	^self asString printString
+fromPairs: aCollection
+	| dict |
+	dict := self new.
+	aCollection do: [:each | dict add: each].
+	^dict
 ! !
 
-!CharacterArray class methodsFor: 'instance creation'!
+HashedCollection subclass: #Dictionary
+	instanceVariableNames: 'keys values'
+	package: 'Kernel-Collections'!
 
-fromString: aString
-	self subclassResponsibility
-! !
+!Dictionary methodsFor: 'accessing'!
 
-CharacterArray subclass: #String
-	instanceVariableNames: ''
-	category: 'Kernel-Collections'!
+at: aKey ifAbsent: aBlock
+	<
+		var index;
+		for(var i=0;i<self['@keys'].length;i++){
+			if(self['@keys'][i].__eq(aKey)) {index = i;}
+		};
+		if(typeof index === 'undefined') {
+			return aBlock();
+		} else {
+			return self['@values'][index];
+		}
+	>
+!
 
-!String methodsFor: 'accessing'!
+at: aKey put: aValue
+	<
+		var index = self['@keys'].indexOf(aKey);
+		if(index === -1) {
+			self['@values'].push(aValue);
+			self['@keys'].push(aKey);
+		} else {
+			self['@values'][index] = aValue;
+		};
 
-size
-	<return self.length>
+		return aValue;
+	>
 !
 
-at: anIndex ifAbsent: aBlock
-	<return self[anIndex - 1] || aBlock()>
+keys
+	^keys copy
 !
 
-escaped
-	<return escape(self)>
-!
+values
+	^values copy
+! !
 
-unescaped
-	<return unescape(self)>
-!
+!Dictionary methodsFor: 'adding/removing'!
 
-asciiValue
-	<return self.charCodeAt(0);>
+removeKey: aKey ifAbsent: aBlock
+    <
+            var index = self['@keys'].indexOf(aKey);
+            if(index === -1) {
+                return aBlock()
+            } else {
+                var value;
+                self['@keys'].splice(index, 1);
+                value = self['@values'].splice(index, 1);
+                return value[0];
+            };
+    >
 ! !
 
-!String methodsFor: 'comparing'!
+!Dictionary methodsFor: 'converting'!
 
-= aString
-	aString class = self class ifFalse: [^false].
-	<return String(self) === String(aString)>
+asHashedCollection
+	^HashedCollection fromPairs: self associations
 !
 
-> aString
-	<return String(self) >> aString._asString()>
-!
+asJSON
+	^self asHashedCollection asJSON
+! !
 
-< aString
-	<return String(self) < aString._asString()>
-!
+!Dictionary methodsFor: 'initialization'!
 
->= aString
-	<return String(self) >>= aString._asString()>
-!
+initialize
+	super initialize.
+	keys := #().
+	values := #()
+! !
 
-<= aString
-	<return String(self) <= aString._asString()>
+!Dictionary methodsFor: 'testing'!
+
+includesKey: aKey
+	^keys includes: aKey
 ! !
 
-!String methodsFor: 'converting'!
+Collection subclass: #SequenceableCollection
+	instanceVariableNames: ''
+	package: 'Kernel-Collections'!
 
-asSelector
-	"If you change this method, change smalltalk.convertSelector too (see js/boot.js file)"
+!SequenceableCollection methodsFor: 'accessing'!
 
-	| selector |
-	selector := '_', self.
-	selector := selector replace: ':' with: '_'.
-	selector := selector replace: '[+]' with: '_plus'.
-	selector := selector replace: '-' with: '_minus'.
-	selector := selector replace: '[*]' with: '_star'.
-	selector := selector replace: '[/]' with: '_slash'.
-	selector := selector replace: '>' with: '_gt'.
-	selector := selector replace: '<' with: '_lt'.
-	selector := selector replace: '=' with: '_eq'.
-	selector := selector replace: ',' with: '_comma'.
-	selector := selector replace: '[@]' with: '_at'.
-	^selector
+allButFirst
+	^self copyFrom: 2 to: self size
 !
 
-asJavascript
-	<
-		if(self.search(/^[a-zA-Z0-9_:.$ ]*$/) == -1)
-			return "unescape(\"" + escape(self) + "\")";
-		else
-			return "\"" + self + "\"";
-	>
+allButLast
+	^self copyFrom: 1 to: self size - 1
 !
 
-tokenize: aString
-	<return self.split(aString)>
+at: anIndex
+	^self at: anIndex ifAbsent: [
+	    self errorNotFound]
 !
 
-asString
-	^self
+at: anIndex ifAbsent: aBlock
+	self subclassResponsibility
 !
 
-asNumber
-	<return Number(self)>
+at: anIndex put: anObject
+	self subclassResponsibility
 !
 
-asLowercase
-	<return self.toLowerCase()>
+atRandom
+	^ self at: self size atRandom
 !
 
-asUppercase
-	<return self.toUpperCase()>
+first
+	^self at: 1
 !
 
-reversed
-	<return self.split("").reverse().join("")>
+first: n
+	"Answer the first n elements of the receiver.
+	Raise an error if there are not enough elements."
+
+	^ self copyFrom: 1 to: n
 !
 
-asJavaScriptSelector
-	^(self asSelector replace: '^_' with: '') replace: '_.*' with: ''.
+fourth
+	^self at: 4
 !
 
-asSymbol
-	^Symbol lookup: self
+indexOf: anObject
+	^self indexOf: anObject ifAbsent: [self errorNotFound]
 !
 
-asJSON
-	^self
-! !
+indexOf: anObject ifAbsent: aBlock
+	<
+		for(var i=0;i<self.length;i++){
+			if(self[i].__eq(anObject)) {return i+1}
+		}
+		return aBlock();
+	>
+!
 
-!String methodsFor: 'copying'!
+indexOf: anObject startingAt: start
+	"Answer the index of the first occurence of anElement after start
+	within the receiver. If the receiver does not contain anElement, 
+	answer 0."
+	^self indexOf: anObject startingAt: start ifAbsent: [0]
+!
 
-, aString
-	<return self + aString>
+indexOf: anObject startingAt: start ifAbsent: aBlock
+	<
+		for(var i=start-1;i<self.length;i++){
+			if(self[i].__eq(anObject)) {return i+1}
+		}
+		return aBlock();
+	>
 !
 
-copyFrom: anIndex to: anotherIndex
-	<return self.substring(anIndex - 1, anotherIndex)>
+last
+	^self at: self size
 !
 
-shallowCopy
-	^self class fromString: self
+second
+	^self at: 2
 !
 
-deepCopy
-	^self shallowCopy
+third
+	^self at: 3
 ! !
 
-!String methodsFor: 'printing'!
+!SequenceableCollection methodsFor: 'adding'!
 
-printString
-	^'''', self, ''''
+addLast: anObject
+	self add: anObject
 !
 
-printNl
-	<console.log(self)>
+removeLast
+	self remove: self last
 ! !
 
-!String methodsFor: 'regular expressions'!
+!SequenceableCollection methodsFor: 'comparing'!
 
-replace: aString with: anotherString
-	^self replaceRegexp: (RegularExpression fromString: aString flag: 'g') with: anotherString
-!
+= aCollection
+	(self class = aCollection class and: [
+		self size = aCollection size]) ifFalse: [^false].
+	self withIndexDo: [:each :i |
+                 (aCollection at: i) = each ifFalse: [^false]].
+	^true
+! !
 
-replaceRegexp: aRegexp with: aString
-	<return self.replace(aRegexp, aString)>
-!
+!SequenceableCollection methodsFor: 'converting'!
 
-match: aRegexp
-	<return self.search(aRegexp) !!= -1>
-!
+reversed
+	self subclassResponsibility
+! !
 
-trimLeft: separators
+!SequenceableCollection methodsFor: 'copying'!
 
-	^self replaceRegexp: (RegularExpression fromString: '^[', separators, ']+' flag: 'g') with: ''
+copyFrom: anIndex to: anotherIndex
+	| range newCollection |
+	range := anIndex to: anotherIndex.
+	newCollection := self class new: range size.
+	range withIndexDo: [:each :i |
+	    newCollection at: i put: (self at: each)].
+	^newCollection
 !
 
-trimRight: separators
-
-	^self replaceRegexp: (RegularExpression fromString: '[', separators, ']+$' flag: 'g') with: ''
+deepCopy
+	| newCollection |
+	newCollection := self class new: self size.
+	self withIndexDo: [:each :index | 
+		newCollection at: index put: each deepCopy].
+	^newCollection
 !
 
-trimLeft
-	^self trimLeft: '\s'
-!
+shallowCopy
+	| newCollection |
+	newCollection := self class new: self size.
+	self withIndexDo: [ :each :index | 
+		newCollection at: index put: each].
+	^newCollection
+! !
 
-trimRight
-	^self trimRight: '\s'
-!
+!SequenceableCollection methodsFor: 'enumerating'!
 
-trimBoth
-	^self trimBoth: '\s'
-!
+withIndexDo: aBlock
+	<for(var i=0;i<self.length;i++){aBlock(self[i], i+1);}>
+! !
 
-trimBoth: separators
+!SequenceableCollection methodsFor: 'printing'!
 
-	^(self trimLeft: separators) trimRight: separators
+printString
+	| str |
+	str := '' writeStream.
+	str nextPutAll: super printString, ' ('.
+	self 
+		do: [:each | str nextPutAll: each printString]
+		separatedBy: [str nextPutAll: ' '].
+	str nextPutAll: ')'.
+	^str contents
 ! !
 
-!String methodsFor: 'split join'!
+SequenceableCollection subclass: #Array
+	instanceVariableNames: ''
+	package: 'Kernel-Collections'!
 
-join: aCollection 
-	^ String
-		streamContents: [:stream | aCollection
-				do: [:each | stream nextPutAll: each asString] 
-				separatedBy: [stream nextPutAll: self]]
-!
+!Array methodsFor: 'accessing'!
 
-lineIndicesDo: aBlock
-	"execute aBlock with 3 arguments for each line:
-	- start index of line
-	- end index of line without line delimiter
-	- end index of line including line delimiter(s) CR, LF or CRLF"
-	
-	| cr lf start sz nextLF nextCR |
-	start := 1.
-	sz := self size.
-	cr := String cr.
-	nextCR := self indexOf: cr startingAt: 1.
-	lf := String lf.
-	nextLF := self indexOf: lf startingAt: 1.
-	[ start <= sz ] whileTrue: [
-		(nextLF = 0 and: [ nextCR = 0 ])
-			ifTrue: [ "No more CR, nor LF, the string is over"
-					aBlock value: start value: sz value: sz.
-					^self ].
-		(nextCR = 0 or: [ 0 < nextLF and: [ nextLF < nextCR ] ])
-			ifTrue: [ "Found a LF"
-					aBlock value: start value: nextLF - 1 value: nextLF.
-					start := 1 + nextLF.
-					nextLF := self indexOf: lf startingAt: start ]
-			ifFalse: [ 1 + nextCR = nextLF
-				ifTrue: [ "Found a CR-LF pair"
-					aBlock value: start value: nextCR - 1 value: nextLF.
-					start := 1 + nextLF.
-					nextCR := self indexOf: cr startingAt: start.
-					nextLF := self indexOf: lf startingAt: start ]
-				ifFalse: [ "Found a CR"
-					aBlock value: start value: nextCR - 1 value: nextCR.
-					start := 1 + nextCR.
-					nextCR := self indexOf: cr startingAt: start ]]]
+at: anIndex ifAbsent: aBlock
+	<
+	    var value = self[anIndex - 1];
+	    if(value === undefined) {
+		return aBlock();
+	    } else {
+		return value;
+	    }
+	>
 !
 
-linesDo: aBlock
-	"Execute aBlock with each line in this string. The terminating line
-	delimiters CR, LF or CRLF pairs are not included in what is passed to aBlock"
-
-	self lineIndicesDo: [:start :endWithoutDelimiters :end |
-		aBlock value: (self copyFrom: start to: endWithoutDelimiters)]
+at: anIndex put: anObject
+	<return self[anIndex - 1] = anObject>
 !
 
-lines
-	"Answer an array of lines composing this receiver without the line ending delimiters."
+size
+	<return self.length>
+! !
 
-	| lines |
-	lines := Array new.
-	self linesDo: [:aLine | lines add: aLine].
-	^lines
+!Array methodsFor: 'adding/removing'!
+
+add: anObject
+	<self.push(anObject); return anObject;>
 !
 
-lineNumber: anIndex
-	"Answer a string containing the characters in the given line number."
+remove: anObject
+	<
+		for(var i=0;i<self.length;i++) {
+			if(self[i] == anObject) {
+				self.splice(i,1);
+				break;
+			}
+		}
+	>
+!
 
-	| lineCount |
-	lineCount := 0.
-	self lineIndicesDo: [:start :endWithoutDelimiters :end |
-		(lineCount := lineCount + 1) = anIndex ifTrue: [^self copyFrom: start to: endWithoutDelimiters]].
-	^nil
+removeFrom: aNumber to: anotherNumber
+	<self.splice(aNumber - 1,anotherNumber - 1)>
 ! !
 
-!String methodsFor: 'testing'!
+!Array methodsFor: 'converting'!
 
-isString
-	^true
+asJavascript
+	^'[', ((self collect: [:each | each asJavascript]) join: ', '),  ']'
 !
 
-includesSubString: subString
-	< return self.indexOf(subString) !!= -1 >
+reversed
+	<return self._copy().reverse()>
 ! !
 
-!String class methodsFor: 'accessing'!
-
-streamClass
-	    ^StringStream
-!
+!Array methodsFor: 'enumerating'!
 
-cr
-	<return '\r'>
+join: aString
+	<return self.join(aString)>
 !
 
-lf
-	<return '\n'>
+sort
+    ^self basicPerform: 'sort'
 !
 
-space
-	<return ' '>
+sort: aBlock
+	<
+		return self.sort(function(a, b) {
+			if(aBlock(a,b)) {return -1} else {return 1}
+		})
+	>
 !
 
-tab
-	<return '\t'>
+sorted
+	^self copy sort
 !
 
-crlf
-	<return '\r\n'>
+sorted: aBlock
+	^self copy sort: aBlock
 ! !
 
-!String class methodsFor: 'instance creation'!
+!Array class methodsFor: 'instance creation'!
 
-fromString: aString
-	    <return new self.fn(aString)>
+new: anInteger
+	<return new Array(anInteger)>
 !
 
-streamContents: blockWithArg
-	|stream|
-	stream := (self streamClass on: String new).
-	blockWithArg value: stream.
-	^ stream contents
+with: anObject
+	    ^(self new: 1)
+		at: 1 put: anObject;
+		yourself
 !
 
-value: aUTFCharCode
+with: anObject with: anObject2
+	    ^(self new: 2)
+		at: 1 put: anObject;
+		at: 2 put: anObject2;
+		yourself
+!
 
-	<return String.fromCharCode(aUTFCharCode);>
+with: anObject with: anObject2 with: anObject3
+	    ^(self new: 3)
+		at: 1 put: anObject;
+		at: 2 put: anObject2;
+		at: 3 put: anObject3;
+		yourself
+!
+
+withAll: aCollection
+	| instance |
+	instance := self new: aCollection size.
+	aCollection withIndexDo: [:each :index  |
+		instance at: index put: each].
+	^instance
 ! !
 
-CharacterArray subclass: #Symbol
+SequenceableCollection subclass: #Array
 	instanceVariableNames: ''
-	category: 'Kernel-Collections'!
+	package: 'Kernel-Collections'!
 
-!Symbol methodsFor: 'accessing'!
+!Array methodsFor: 'accessing'!
 
 at: anIndex ifAbsent: aBlock
-	^self asString at: anIndex ifAbsent: aBlock
+	<
+	    var value = self[anIndex - 1];
+	    if(value === undefined) {
+		return aBlock();
+	    } else {
+		return value;
+	    }
+	>
+!
+
+at: anIndex put: anObject
+	<return self[anIndex - 1] = anObject>
 !
 
 size
-	^self asString size
+	<return self.length>
 ! !
 
-!Symbol methodsFor: 'comparing'!
+!Array methodsFor: 'adding/removing'!
 
-< aSymbol
-	^self asString < aSymbol asString
+add: anObject
+	<self.push(anObject); return anObject;>
 !
 
-<= aSymbol
-	^self asString <= aSymbol asString
+remove: anObject
+	<
+		for(var i=0;i<self.length;i++) {
+			if(self[i] == anObject) {
+				self.splice(i,1);
+				break;
+			}
+		}
+	>
 !
 
->= aSymbol
-	^self asString >= aSymbol asString
-!
+removeFrom: aNumber to: anotherNumber
+	<self.splice(aNumber - 1,anotherNumber - 1)>
+! !
 
-= aSymbol
-	aSymbol class = self class ifFalse: [^false].
-	^self asString = aSymbol asString
+!Array methodsFor: 'converting'!
+
+asJavascript
+	^'[', ((self collect: [:each | each asJavascript]) join: ', '),  ']'
 !
 
-> aSymbol
-	^self asString > aSymbol asString
+reversed
+	<return self._copy().reverse()>
 ! !
 
-!Symbol methodsFor: 'converting'!
-
-asString
-	<return self.value>
-!
-
-asSymbol
-	^self
-!
-
-asJavascript
-	^'smalltalk.symbolFor("', self asString, '")'
-!
-
-asSelector
-	^self asString asSelector
-!
-
-asJSON
-	^self asString asJSON
-! !
-
-!Symbol methodsFor: 'copying'!
-
-copyFrom: anIndex to: anotherIndex
-	^self class fromString: (self asString copyFrom: anIndex to: anotherIndex)
-!
-
-deepCopy
-	^self
-!
-
-shallowCopy
-	^self
-! !
-
-!Symbol methodsFor: 'printing'!
-
-printString
-	^'#', self asString
-!
-
-isSymbol
-	^true
-! !
-
-!Symbol class methodsFor: 'instance creation'!
-
-lookup: aString
-	<return smalltalk.symbolFor(aString);>
-!
-
-basicNew
-	self shouldNotImplement
-!
-
-fromString: aString
-	^self lookup: aString
-! !
-
-SequenceableCollection subclass: #Array
-	instanceVariableNames: ''
-	category: 'Kernel-Collections'!
-
-!Array methodsFor: 'accessing'!
-
-size
-	<return self.length>
-!
-
-at: anIndex put: anObject
-	<return self[anIndex - 1] = anObject>
-!
-
-at: anIndex ifAbsent: aBlock
-	<
-	    var value = self[anIndex - 1];
-	    if(value === undefined) {
-		return aBlock();
-	    } else {
-		return value;
-	    }
-	>
-! !
-
-!Array methodsFor: 'adding/removing'!
-
-add: anObject
-	<self.push(anObject); return anObject;>
-!
-
-remove: anObject
-	<
-		for(var i=0;i<self.length;i++) {
-			if(self[i] == anObject) {
-				self.splice(i,1);
-				break;
-			}
-		}
-	>
-!
-
-removeFrom: aNumber to: anotherNumber
-	<self.splice(aNumber - 1,anotherNumber - 1)>
-! !
-
-!Array methodsFor: 'converting'!
-
-asJavascript
-	^'[', ((self collect: [:each | each asJavascript]) join: ', '),  ']'
-!
-
-reversed
-	<return self._copy().reverse()>
-! !
-
-!Array methodsFor: 'enumerating'!
+!Array methodsFor: 'enumerating'!
 
 join: aString
 	<return self.join(aString)>
@@ -1178,540 +964,755 @@ withAll: aCollection
 	^instance
 ! !
 
-SequenceableCollection subclass: #Array
+SequenceableCollection subclass: #CharacterArray
 	instanceVariableNames: ''
-	category: 'Kernel-Collections'!
-
-!Array methodsFor: 'accessing'!
+	package: 'Kernel-Collections'!
 
-size
-	<return self.length>
-!
+!CharacterArray methodsFor: 'accessing'!
 
 at: anIndex put: anObject
-	<return self[anIndex - 1] = anObject>
-!
-
-at: anIndex ifAbsent: aBlock
-	<
-	    var value = self[anIndex - 1];
-	    if(value === undefined) {
-		return aBlock();
-	    } else {
-		return value;
-	    }
-	>
+	self errorReadOnly
 ! !
 
-!Array methodsFor: 'adding/removing'!
+!CharacterArray methodsFor: 'adding'!
 
 add: anObject
-	<self.push(anObject); return anObject;>
+	self errorReadOnly
 !
 
 remove: anObject
-	<
-		for(var i=0;i<self.length;i++) {
-			if(self[i] == anObject) {
-				self.splice(i,1);
-				break;
-			}
-		}
-	>
-!
-
-removeFrom: aNumber to: anotherNumber
-	<self.splice(aNumber - 1,anotherNumber - 1)>
+	self errorReadOnly
 ! !
 
-!Array methodsFor: 'converting'!
+!CharacterArray methodsFor: 'converting'!
 
-asJavascript
-	^'[', ((self collect: [:each | each asJavascript]) join: ', '),  ']'
+asLowercase
+	^self class fromString: self asString asLowercase
 !
 
-reversed
-	<return self._copy().reverse()>
-! !
-
-!Array methodsFor: 'enumerating'!
-
-join: aString
-	<return self.join(aString)>
+asNumber
+	^self asString asNumber
 !
 
-sort
-    ^self basicPerform: 'sort'
+asString
+	^self subclassResponsibility
 !
 
-sort: aBlock
-	<
-		return self.sort(function(a, b) {
-			if(aBlock(a,b)) {return -1} else {return 1}
-		})
-	>
+asSymbol
+	^self subclassResponsibility
 !
 
-sorted
-	^self copy sort
-!
+asUppercase
+	^self class fromString: self asString asUppercase
+! !
 
-sorted: aBlock
-	^self copy sort: aBlock
+!CharacterArray methodsFor: 'copying'!
+
+, aString
+	^self asString, aString asString
 ! !
 
-!Array class methodsFor: 'instance creation'!
+!CharacterArray methodsFor: 'error handling'!
 
-new: anInteger
-	<return new Array(anInteger)>
-!
+errorReadOnly
+	self error: 'Object is read-only'
+! !
 
-with: anObject
-	    ^(self new: 1)
-		at: 1 put: anObject;
-		yourself
-!
+!CharacterArray methodsFor: 'printing'!
 
-with: anObject with: anObject2
-	    ^(self new: 2)
-		at: 1 put: anObject;
-		at: 2 put: anObject2;
-		yourself
-!
+printString
+	^self asString printString
+! !
 
-with: anObject with: anObject2 with: anObject3
-	    ^(self new: 3)
-		at: 1 put: anObject;
-		at: 2 put: anObject2;
-		at: 3 put: anObject3;
-		yourself
-!
+!CharacterArray class methodsFor: 'instance creation'!
 
-withAll: aCollection
-	| instance |
-	instance := self new: aCollection size.
-	aCollection withIndexDo: [:each :index  |
-		instance at: index put: each].
-	^instance
+fromString: aString
+	self subclassResponsibility
 ! !
 
-Stream subclass: #StringStream
+CharacterArray subclass: #String
 	instanceVariableNames: ''
-	category: 'Kernel-Collections'!
+	package: 'Kernel-Collections'!
 
-!StringStream methodsFor: 'reading'!
+!String methodsFor: 'accessing'!
 
-next: anInteger
-	| tempCollection |
-	tempCollection := self collection class new.
-	anInteger timesRepeat: [
-	    self atEnd ifFalse: [
-		tempCollection := tempCollection, self next]].
-	^tempCollection
-! !
+asciiValue
+	<return self.charCodeAt(0);>
+!
 
-!StringStream methodsFor: 'writing'!
+at: anIndex ifAbsent: aBlock
+	<return self[anIndex - 1] || aBlock()>
+!
 
-nextPut: aString
-	self nextPutAll: aString
+escaped
+	<return escape(self)>
 !
 
-nextPutAll: aString
-	self setCollection: 
-	    (self collection copyFrom: 1 to: self position),
-	    aString,
-	    (self collection copyFrom: (self position + 1 + aString size) to: self collection size).
-	self position: self position + aString size.
-	self setStreamSize: (self streamSize max: self position)
+size
+	<return self.length>
 !
 
-cr
-	^self nextPutAll: String cr
+unescaped
+	<return unescape(self)>
+! !
+
+!String methodsFor: 'comparing'!
+
+< aString
+	<return String(self) < aString._asString()>
 !
 
-crlf
-	^self nextPutAll: String crlf
+<= aString
+	<return String(self) <= aString._asString()>
 !
 
-lf
-	^self nextPutAll: String lf
+= aString
+	aString class = self class ifFalse: [^false].
+	<return String(self) === String(aString)>
 !
 
-space
-	self nextPut: ' '
-! !
+> aString
+	<return String(self) >> aString._asString()>
+!
 
-Collection subclass: #Set
-	instanceVariableNames: 'elements'
-	category: 'Kernel-Collections'!
+>= aString
+	<return String(self) >>= aString._asString()>
+! !
 
-!Set methodsFor: 'accessing'!
+!String methodsFor: 'converting'!
 
-size
-	^elements size
-! !
+asJSON
+	^self
+!
 
-!Set methodsFor: 'adding/removing'!
+asJavaScriptSelector
+	^(self asSelector replace: '^_' with: '') replace: '_.*' with: ''.
+!
 
-add: anObject
+asJavascript
 	<
-		var found;
-		for(var i=0; i < self['@elements'].length; i++) {
-			if(anObject == self['@elements'][i]) {
-				found = true;
-				break;
-			}
-		}
-		if(!!found) {self['@elements'].push(anObject)}
+		if(self.search(/^[a-zA-Z0-9_:.$ ]*$/) == -1)
+			return "unescape(\"" + escape(self) + "\")";
+		else
+			return "\"" + self + "\"";
 	>
 !
 
-remove: anObject
-	elements remove: anObject
-! !
+asLowercase
+	<return self.toLowerCase()>
+!
 
-!Set methodsFor: 'comparing'!
+asNumber
+	<return Number(self)>
+!
 
-= aCollection
-	^self class = aCollection class and: [
-		elements = aCollection asArray]
-! !
+asSelector
+	"If you change this method, change smalltalk.convertSelector too (see js/boot.js file)"
 
-!Set methodsFor: 'converting'!
+	| selector |
+	selector := '_', self.
+	selector := selector replace: ':' with: '_'.
+	selector := selector replace: '[+]' with: '_plus'.
+	selector := selector replace: '-' with: '_minus'.
+	selector := selector replace: '[*]' with: '_star'.
+	selector := selector replace: '[/]' with: '_slash'.
+	selector := selector replace: '>' with: '_gt'.
+	selector := selector replace: '<' with: '_lt'.
+	selector := selector replace: '=' with: '_eq'.
+	selector := selector replace: ',' with: '_comma'.
+	selector := selector replace: '[@]' with: '_at'.
+	^selector
+!
 
-asArray
-	^elements copy
-! !
+asString
+	^self
+!
 
-!Set methodsFor: 'enumerating'!
+asSymbol
+	^Symbol lookup: self
+!
 
-detect: aBlock ifNone: anotherBlock
-	^elements detect: aBlock ifNone: anotherBlock
+asUppercase
+	<return self.toUpperCase()>
 !
 
-do: aBlock
-	elements do: aBlock
+reversed
+	<return self.split("").reverse().join("")>
 !
 
-select: aBlock
-	| collection |
-	collection := self class new. 
-	self do: [:each |
-		(aBlock value: each) ifTrue: [
-			collection add: each]].
-	^collection
+tokenize: aString
+	<return self.split(aString)>
 ! !
 
-!Set methodsFor: 'initialization'!
-
-initialize
-	super initialize.
-	elements := #()
-! !
+!String methodsFor: 'copying'!
 
-!Set methodsFor: 'testing'!
+, aString
+	<return self + aString>
+!
 
-includes: anObject
-	^elements includes: anObject
-! !
+copyFrom: anIndex to: anotherIndex
+	<return self.substring(anIndex - 1, anotherIndex)>
+!
 
-Collection subclass: #HashedCollection
-	instanceVariableNames: ''
-	category: 'Kernel-Collections'!
-!HashedCollection commentStamp!
-A HashedCollection is a traditional JavaScript object, or a Smalltalk Dictionary.
+deepCopy
+	^self shallowCopy
+!
 
-Unlike a Dictionary, it can only have strings as keys.!
+shallowCopy
+	^self class fromString: self
+! !
 
-!HashedCollection methodsFor: 'accessing'!
+!String methodsFor: 'printing'!
 
-size
-	^self keys size
+printNl
+	<console.log(self)>
 !
 
-associations
-	| associations |
-	associations := #().
-	self keys do: [:each |
-	    associations add: (Association key: each value: (self at: each))].
-	^associations
-!
+printString
+	^'''', self, ''''
+! !
 
-keys
-	<
-		var keys = [];
-		for(var i in self) {
-			if(self.hasOwnProperty(i)) {
-				keys.push(i);
-			}
-		};
-		return keys;
-	>
-!
+!String methodsFor: 'regular expressions'!
 
-values
-	^self keys collect: [:each | self at: each]
+match: aRegexp
+	<return self.search(aRegexp) !!= -1>
 !
 
-at: aKey put: aValue
-	^self basicAt: aKey put: aValue
+replace: aString with: anotherString
+	^self replaceRegexp: (RegularExpression fromString: aString flag: 'g') with: anotherString
 !
 
-at: aKey ifAbsent: aBlock
-	^(self includesKey: aKey)
-		ifTrue: [self basicAt: aKey]
-		ifFalse: aBlock
+replaceRegexp: aRegexp with: aString
+	<return self.replace(aRegexp, aString)>
 !
 
-at: aKey ifAbsentPut: aBlock
-	^self at: aKey ifAbsent: [
-	    self at: aKey put: aBlock value]
+trimBoth
+	^self trimBoth: '\s'
 !
 
-at: aKey ifPresent: aBlock
-	^(self basicAt: aKey) ifNotNil: [aBlock value: (self at: aKey)]
-!
+trimBoth: separators
 
-at: aKey ifPresent: aBlock ifAbsent: anotherBlock
-	^(self basicAt: aKey)
-	    ifNil: anotherBlock
-	    ifNotNil: [aBlock value: (self at: aKey)]
+	^(self trimLeft: separators) trimRight: separators
 !
 
-at: aKey
-	^self at: aKey ifAbsent: [self errorNotFound]
-! !
-
-!HashedCollection methodsFor: 'adding/removing'!
-
-add: anAssociation
-	self at: anAssociation key put: anAssociation value
+trimLeft
+	^self trimLeft: '\s'
 !
 
-addAll: aHashedCollection
-	super addAll: aHashedCollection associations.
-	^aHashedCollection
-!
+trimLeft: separators
 
-removeKey: aKey
-    self remove: aKey
+	^self replaceRegexp: (RegularExpression fromString: '^[', separators, ']+' flag: 'g') with: ''
 !
 
-remove: aKey ifAbsent: aBlock
-    ^self removeKey: aKey ifAbsent: aBlock
+trimRight
+	^self trimRight: '\s'
 !
 
-removeKey: aKey ifAbsent: aBlock
-	^(self includesKey: aKey) 
-		ifFalse: [aBlock value]
-		ifTrue: [self basicDelete: aKey]
-! !
-
-!HashedCollection methodsFor: 'comparing'!
+trimRight: separators
 
-= aHashedCollection
-	self class = aHashedCollection class ifFalse: [^false].
-	self size = aHashedCollection size ifFalse: [^false].
-	^self associations = aHashedCollection associations
+	^self replaceRegexp: (RegularExpression fromString: '[', separators, ']+$' flag: 'g') with: ''
 ! !
 
-!HashedCollection methodsFor: 'converting'!
+!String methodsFor: 'split join'!
 
-asDictionary
-	^Dictionary fromPairs: self associations
+join: aCollection 
+	^ String
+		streamContents: [:stream | aCollection
+				do: [:each | stream nextPutAll: each asString] 
+				separatedBy: [stream nextPutAll: self]]
+!
+
+lineIndicesDo: aBlock
+	"execute aBlock with 3 arguments for each line:
+	- start index of line
+	- end index of line without line delimiter
+	- end index of line including line delimiter(s) CR, LF or CRLF"
+	
+	| cr lf start sz nextLF nextCR |
+	start := 1.
+	sz := self size.
+	cr := String cr.
+	nextCR := self indexOf: cr startingAt: 1.
+	lf := String lf.
+	nextLF := self indexOf: lf startingAt: 1.
+	[ start <= sz ] whileTrue: [
+		(nextLF = 0 and: [ nextCR = 0 ])
+			ifTrue: [ "No more CR, nor LF, the string is over"
+					aBlock value: start value: sz value: sz.
+					^self ].
+		(nextCR = 0 or: [ 0 < nextLF and: [ nextLF < nextCR ] ])
+			ifTrue: [ "Found a LF"
+					aBlock value: start value: nextLF - 1 value: nextLF.
+					start := 1 + nextLF.
+					nextLF := self indexOf: lf startingAt: start ]
+			ifFalse: [ 1 + nextCR = nextLF
+				ifTrue: [ "Found a CR-LF pair"
+					aBlock value: start value: nextCR - 1 value: nextLF.
+					start := 1 + nextLF.
+					nextCR := self indexOf: cr startingAt: start.
+					nextLF := self indexOf: lf startingAt: start ]
+				ifFalse: [ "Found a CR"
+					aBlock value: start value: nextCR - 1 value: nextCR.
+					start := 1 + nextCR.
+					nextCR := self indexOf: cr startingAt: start ]]]
+!
+
+lineNumber: anIndex
+	"Answer a string containing the characters in the given line number."
+
+	| lineCount |
+	lineCount := 0.
+	self lineIndicesDo: [:start :endWithoutDelimiters :end |
+		(lineCount := lineCount + 1) = anIndex ifTrue: [^self copyFrom: start to: endWithoutDelimiters]].
+	^nil
+!
+
+lines
+	"Answer an array of lines composing this receiver without the line ending delimiters."
+
+	| lines |
+	lines := Array new.
+	self linesDo: [:aLine | lines add: aLine].
+	^lines
+!
+
+linesDo: aBlock
+	"Execute aBlock with each line in this string. The terminating line
+	delimiters CR, LF or CRLF pairs are not included in what is passed to aBlock"
+
+	self lineIndicesDo: [:start :endWithoutDelimiters :end |
+		aBlock value: (self copyFrom: start to: endWithoutDelimiters)]
+! !
+
+!String methodsFor: 'testing'!
+
+includesSubString: subString
+	< return self.indexOf(subString) !!= -1 >
+!
+
+isString
+	^true
+! !
+
+!String class methodsFor: 'accessing'!
+
+cr
+	<return '\r'>
+!
+
+crlf
+	<return '\r\n'>
+!
+
+lf
+	<return '\n'>
+!
+
+space
+	<return ' '>
+!
+
+streamClass
+	    ^StringStream
+!
+
+tab
+	<return '\t'>
+! !
+
+!String class methodsFor: 'instance creation'!
+
+fromString: aString
+	    <return new self.fn(aString)>
+!
+
+streamContents: blockWithArg
+	|stream|
+	stream := (self streamClass on: String new).
+	blockWithArg value: stream.
+	^ stream contents
+!
+
+value: aUTFCharCode
+
+	<return String.fromCharCode(aUTFCharCode);>
+! !
+
+CharacterArray subclass: #Symbol
+	instanceVariableNames: ''
+	package: 'Kernel-Collections'!
+
+!Symbol methodsFor: 'accessing'!
+
+at: anIndex ifAbsent: aBlock
+	^self asString at: anIndex ifAbsent: aBlock
+!
+
+size
+	^self asString size
+! !
+
+!Symbol methodsFor: 'comparing'!
+
+< aSymbol
+	^self asString < aSymbol asString
+!
+
+<= aSymbol
+	^self asString <= aSymbol asString
+!
+
+= aSymbol
+	aSymbol class = self class ifFalse: [^false].
+	^self asString = aSymbol asString
+!
+
+> aSymbol
+	^self asString > aSymbol asString
+!
+
+>= aSymbol
+	^self asString >= aSymbol asString
+! !
+
+!Symbol methodsFor: 'converting'!
+
+asJSON
+	^self asString asJSON
+!
+
+asJavascript
+	^'smalltalk.symbolFor("', self asString, '")'
+!
+
+asSelector
+	^self asString asSelector
+!
+
+asString
+	<return self.value>
+!
+
+asSymbol
+	^self
+! !
+
+!Symbol methodsFor: 'copying'!
+
+copyFrom: anIndex to: anotherIndex
+	^self class fromString: (self asString copyFrom: anIndex to: anotherIndex)
+!
+
+deepCopy
+	^self
 !
 
-asJSON
-	| c |
-	c := self class new.
-	self keysAndValuesDo: [:key :value |
-		c at: key put: value asJSON].
-	^c
-! !
-
-!HashedCollection methodsFor: 'copying'!
-
 shallowCopy
-	| copy |
-	copy := self class new.
-	self associationsDo: [:each |
-	    copy at: each key  put: each value].
-	^copy
+	^self
+! !
+
+!Symbol methodsFor: 'printing'!
+
+isSymbol
+	^true
+!
+
+printString
+	^'#', self asString
+! !
+
+!Symbol class methodsFor: 'instance creation'!
+
+basicNew
+	self shouldNotImplement
+!
+
+fromString: aString
+	^self lookup: aString
+!
+
+lookup: aString
+	<return smalltalk.symbolFor(aString);>
+! !
+
+Collection subclass: #Set
+	instanceVariableNames: 'elements'
+	package: 'Kernel-Collections'!
+
+!Set methodsFor: 'accessing'!
+
+size
+	^elements size
+! !
+
+!Set methodsFor: 'adding/removing'!
+
+add: anObject
+	<
+		var found;
+		for(var i=0; i < self['@elements'].length; i++) {
+			if(anObject == self['@elements'][i]) {
+				found = true;
+				break;
+			}
+		}
+		if(!!found) {self['@elements'].push(anObject)}
+	>
+!
+
+remove: anObject
+	elements remove: anObject
+! !
+
+!Set methodsFor: 'comparing'!
+
+= aCollection
+	^self class = aCollection class and: [
+		elements = aCollection asArray]
+! !
+
+!Set methodsFor: 'converting'!
+
+asArray
+	^elements copy
+! !
+
+!Set methodsFor: 'enumerating'!
+
+detect: aBlock ifNone: anotherBlock
+	^elements detect: aBlock ifNone: anotherBlock
+!
+
+do: aBlock
+	elements do: aBlock
+!
+
+select: aBlock
+	| collection |
+	collection := self class new. 
+	self do: [:each |
+		(aBlock value: each) ifTrue: [
+			collection add: each]].
+	^collection
+! !
+
+!Set methodsFor: 'initialization'!
+
+initialize
+	super initialize.
+	elements := #()
+! !
+
+!Set methodsFor: 'testing'!
+
+includes: anObject
+	^elements includes: anObject
+! !
+
+Object subclass: #RegularExpression
+	instanceVariableNames: ''
+	package: 'Kernel-Collections'!
+
+!RegularExpression methodsFor: 'evaluating'!
+
+compile: aString
+	<return self.compile(aString)>
 !
 
-, aCollection
-	self shouldNotImplement
+exec: aString
+	<return self.exec(aString) || nil>
 !
 
-copyFrom: anIndex to: anotherIndex
-	self shouldNotImplement
+test: aString
+	<return self.test(aString)>
+! !
+
+!RegularExpression class methodsFor: 'instance creation'!
+
+fromString: aString
+	    ^self fromString: aString flag: ''
 !
 
-deepCopy
-	| copy |
-	copy := self class new.
-	self associationsDo: [:each |
-	    copy at: each key  put: each value deepCopy].
-	^copy
+fromString: aString flag: anotherString
+	<return new RegExp(aString, anotherString)>
 ! !
 
-!HashedCollection methodsFor: 'enumerating'!
+Object subclass: #Stream
+	instanceVariableNames: 'collection position streamSize'
+	package: 'Kernel-Collections'!
 
-associationsDo: aBlock
-	self associations do: aBlock
+!Stream methodsFor: 'accessing'!
+
+collection
+	^collection
 !
 
-keysAndValuesDo: aBlock
-	self associationsDo: [:each |
-	    aBlock value: each key value: each value]
+contents
+	^self collection
+	    copyFrom: 1 
+	    to: self streamSize
 !
 
-do: aBlock
-	self values do: aBlock
+position
+	^position ifNil: [position := 0]
 !
 
-select: aBlock
-	| newDict |
-	newDict := self class new.
-	self keysAndValuesDo: [:key :value |
-	    (aBlock value: value) ifTrue: [newDict at: key put: value]].
-	^newDict
+position: anInteger
+	position := anInteger
 !
 
-collect: aBlock
-	| newDict |
-	newDict := self class new.
-	self keysAndValuesDo: [:key :value |
-	    newDict at: key put: (aBlock value: value)].
-	^newDict
+setCollection: aCollection
+	collection := aCollection
 !
 
-detect: aBlock ifNone: anotherBlock
-	^self values detect: aBlock ifNone: anotherBlock
+setStreamSize: anInteger
+	streamSize := anInteger
 !
 
-includes: anObject
-	^self values includes: anObject
+size
+	^self streamSize
+!
+
+streamSize
+	^streamSize
 ! !
 
-!HashedCollection methodsFor: 'printing'!
+!Stream methodsFor: 'actions'!
 
-printString
-	^String streamContents: [:aStream|  
-		aStream 
-			nextPutAll: super printString;
-			nextPutAll: '('.
-				self associations 
-					do: [:anAssociation|  
-						aStream 
-							nextPutAll: anAssociation key printString;
-								nextPutAll: ' -> ';
-								nextPutAll: anAssociation value printString]
-							separatedBy: [aStream nextPutAll: ' , '].
-						aStream nextPutAll: ')']
+close
 !
 
-storeOn: aStream
-	aStream nextPutAll: '#{'.
-	self associations
-		do: [:each | each storeOn: aStream]
-		separatedBy: [ aStream nextPutAll: '. '].
-	aStream nextPutAll: '}'
+flush
+!
+
+reset
+	self position: 0
+!
+
+resetContents
+	self reset.
+	self setStreamSize: 0
 ! !
 
-!HashedCollection methodsFor: 'testing'!
+!Stream methodsFor: 'enumerating'!
 
-includesKey: aKey
-	<return self.hasOwnProperty(aKey)>
+do: aBlock
+	[self atEnd] whileFalse: [aBlock value: self next]
 ! !
 
-!HashedCollection class methodsFor: 'instance creation'!
+!Stream methodsFor: 'positioning'!
 
-fromPairs: aCollection
-	| dict |
-	dict := self new.
-	aCollection do: [:each | dict add: each].
-	^dict
+setToEnd
+	self position: self size
+!
+
+skip: anInteger
+	self position: ((self position + anInteger) min: self size max: 0)
 ! !
 
-HashedCollection subclass: #Dictionary
-	instanceVariableNames: 'keys values'
-	category: 'Kernel-Collections'!
+!Stream methodsFor: 'reading'!
 
-!Dictionary methodsFor: 'accessing'!
+next
+	^self atEnd 
+		ifTrue: [nil]
+		ifFalse: [
+			self position: self position + 1. 
+			collection at: self position]
+!
 
-at: aKey ifAbsent: aBlock
-	<
-		var index;
-		for(var i=0;i<self['@keys'].length;i++){
-			if(self['@keys'][i].__eq(aKey)) {index = i;}
-		};
-		if(typeof index === 'undefined') {
-			return aBlock();
-		} else {
-			return self['@values'][index];
-		}
-	>
+next: anInteger
+	| tempCollection |
+	tempCollection := self collection class new.
+	anInteger timesRepeat: [
+	    self atEnd ifFalse: [
+		tempCollection add: self next]].
+	^tempCollection
 !
 
-keys
-	^keys copy
+peek
+	^self atEnd ifFalse: [
+	    self collection at: self position + 1]
+! !
+
+!Stream methodsFor: 'testing'!
+
+atEnd
+	^self position = self size
 !
 
-values
-	^values copy
+atStart
+	^self position = 0
 !
 
-at: aKey put: aValue
-	<
-		var index = self['@keys'].indexOf(aKey);
-		if(index === -1) {
-			self['@values'].push(aValue);
-			self['@keys'].push(aKey);
-		} else {
-			self['@values'][index] = aValue;
-		};
+isEmpty
+	^self size = 0
+! !
 
-		return aValue;
-	>
+!Stream methodsFor: 'writing'!
+
+nextPut: anObject
+	self position: self position + 1.
+	self collection at: self position put: anObject.
+	self setStreamSize: (self streamSize max: self position)
+!
+
+nextPutAll: aCollection
+	aCollection do: [:each |
+	    self nextPut: each]
 ! !
 
-!Dictionary methodsFor: 'adding/removing'!
+!Stream class methodsFor: 'instance creation'!
 
-removeKey: aKey ifAbsent: aBlock
-	<
-		var index = self['@keys'].indexOf(aKey);
-		if(index === -1) {
-			return aBlock()
-		} else {
-			self['@keys'].splice(i, 1);
-			self['@values'].splice(i, 1);
-			return aKey
-		};
-	>
+on: aCollection
+	    ^self new 
+		setCollection: aCollection;
+		setStreamSize: aCollection size;
+		yourself
 ! !
 
-!Dictionary methodsFor: 'converting'!
+Stream subclass: #StringStream
+	instanceVariableNames: ''
+	package: 'Kernel-Collections'!
 
-asHashedCollection
-	^HashedCollection fromPairs: self associations
-!
+!StringStream methodsFor: 'reading'!
 
-asJSON
-	^self asHashedCollection asJSON
+next: anInteger
+	| tempCollection |
+	tempCollection := self collection class new.
+	anInteger timesRepeat: [
+	    self atEnd ifFalse: [
+		tempCollection := tempCollection, self next]].
+	^tempCollection
 ! !
 
-!Dictionary methodsFor: 'initialization'!
+!StringStream methodsFor: 'writing'!
 
-initialize
-	super initialize.
-	keys := #().
-	values := #()
-! !
+cr
+	^self nextPutAll: String cr
+!
 
-!Dictionary methodsFor: 'testing'!
+crlf
+	^self nextPutAll: String crlf
+!
 
-includesKey: aKey
-	^keys includes: aKey
+lf
+	^self nextPutAll: String lf
+!
+
+nextPut: aString
+	self nextPutAll: aString
+!
+
+nextPutAll: aString
+	self setCollection: 
+	    (self collection copyFrom: 1 to: self position),
+	    aString,
+	    (self collection copyFrom: (self position + 1 + aString size) to: self collection size).
+	self position: self position + aString size.
+	self setStreamSize: (self streamSize max: self position)
+!
+
+space
+	self nextPut: ' '
 ! !
 
diff --git a/amber/src/st/Kernel-Exceptions.st b/amber/src/st/Kernel-Exceptions.st
index 79abb6bc506..4beab37cb84 100644
--- a/amber/src/st/Kernel-Exceptions.st
+++ b/amber/src/st/Kernel-Exceptions.st
@@ -1,24 +1,24 @@
 Smalltalk current createPackage: 'Kernel-Exceptions' properties: #{}!
 Object subclass: #Error
 	instanceVariableNames: 'messageText'
-	category: 'Kernel-Exceptions'!
+	package: 'Kernel-Exceptions'!
 
 !Error methodsFor: 'accessing'!
 
-messageText
-	^messageText
-!
-
-messageText: aString
-	messageText := aString
-!
-
 context
 	<return self.context>
 !
 
 jsStack
 	<return self.stack>
+!
+
+messageText
+	^messageText
+!
+
+messageText: aString
+	messageText := aString
 ! !
 
 !Error methodsFor: 'signaling'!
@@ -43,7 +43,7 @@ signal: aString
 
 Error subclass: #MessageNotUnderstood
 	instanceVariableNames: 'message receiver'
-	category: 'Kernel-Exceptions'!
+	package: 'Kernel-Exceptions'!
 
 !MessageNotUnderstood methodsFor: 'accessing'!
 
@@ -55,21 +55,21 @@ message: aMessage
 	message := aMessage
 !
 
+messageText
+	^self receiver asString, ' does not understand #', self message selector
+!
+
 receiver
 	^receiver
 !
 
 receiver: anObject
 	receiver := anObject
-!
-
-messageText
-	^self receiver asString, ' does not understand #', self message selector
 ! !
 
 Object subclass: #ErrorHandler
 	instanceVariableNames: ''
-	category: 'Kernel-Exceptions'!
+	package: 'Kernel-Exceptions'!
 
 !ErrorHandler methodsFor: 'error handling'!
 
@@ -80,24 +80,24 @@ handleError: anError
 
 !ErrorHandler methodsFor: 'private'!
 
+log: aString
+	console log: aString
+!
+
 logContext: aContext
 	aContext home ifNotNil: [
 		self logContext: aContext home].
 	self log: aContext receiver asString, '>>', aContext selector
 !
 
-logErrorContext: aContext
-	aContext ifNotNil: [
-		aContext home ifNotNil: [
-			self logContext: aContext home]]
-!
-
 logError: anError
 	self log: anError messageText
 !
 
-log: aString
-	console log: aString
+logErrorContext: aContext
+	aContext ifNotNil: [
+		aContext home ifNotNil: [
+			self logContext: aContext home]]
 ! !
 
 ErrorHandler class instanceVariableNames: 'current'!
diff --git a/amber/src/st/Kernel-Methods.st b/amber/src/st/Kernel-Methods.st
index 704c58e45c5..2f77e6f79f5 100644
--- a/amber/src/st/Kernel-Methods.st
+++ b/amber/src/st/Kernel-Methods.st
@@ -1,95 +1,7 @@
 Smalltalk current createPackage: 'Kernel-Methods' properties: #{}!
-Object subclass: #Message
-	instanceVariableNames: 'selector arguments'
-	category: 'Kernel-Methods'!
-!Message commentStamp!
-Generally, the system does not use instances of Message for efficiency reasons.
-However, when a message is not understood by its receiver, the interpreter will make up an instance of it in order to capture the information involved in an actual message transmission. 
-This instance is sent it as an argument with the message `doesNotUnderstand:` to the receiver.
-
-See boot.js, `messageNotUnderstood`  and its counterpart `Object>>doesNotUnderstand:`!
-
-!Message methodsFor: 'accessing'!
-
-selector
-	^selector
-!
-
-selector: aString
-	selector := aString
-!
-
-arguments: anArray
-	arguments := anArray
-!
-
-arguments
-	^arguments
-! !
-
-!Message methodsFor: 'printing'!
-
-printString
-	^ String streamContents: [:aStream|  
-                                  				aStream 
-                                  					nextPutAll: super printString;
-                                  					nextPutAll: '(';
-                                  					nextPutAll: selector;
-                                  					nextPutAll: ')' 				]
-!
-
-sendTo: anObject
-	Smalltalk current send: self selector to: anObject arguments: self arguments
-! !
-
-!Message class methodsFor: 'instance creation'!
-
-selector: aString arguments: anArray
-	^self new
-		selector: aString;
-		arguments: anArray;
-		yourself
-! !
-
-Object subclass: #MethodContext
-	instanceVariableNames: ''
-	category: 'Kernel-Methods'!
-!MethodContext commentStamp!
-MethodContext holds all the dynamic state associated with the execution of either a method activation resulting from a message send. That is used to build the call stack while debugging.
-  
-MethodContext instances are JavaScript `SmalltalkMethodContext` objects defined in boot.js 
-
-Current limitation: MethodContext instances are not created on Block evaluation. That means it's actually impossible to debug inside a Block.!
-
-!MethodContext methodsFor: 'accessing'!
-
-receiver
-	<return self.receiver>
-!
-
-selector
-	<return smalltalk.convertSelector(self.selector)>
-!
-
-home
-	<return self.homeContext>
-!
-
-temps
-	<return self.temps>
-!
-
-printString
-	^super printString, '(', self asString, ')'
-!
-
-asString
-	^self receiver class printString, ' >> ', self selector
-! !
-
 Object subclass: #BlockClosure
 	instanceVariableNames: ''
-	category: 'Kernel-Methods'!
+	package: 'Kernel-Methods'!
 !BlockClosure commentStamp!
 A BlockClosure is a lexical closure.
 The JavaScript representation is a function.
@@ -108,9 +20,9 @@ numArgs
 
 !BlockClosure methodsFor: 'controlling'!
 
-whileTrue: aBlock
+whileFalse
 	"inlined in the Compiler"
-	<while(self()) {aBlock()}>
+	self whileFalse: []
 !
 
 whileFalse: aBlock
@@ -118,14 +30,14 @@ whileFalse: aBlock
 	<while(!!self()) {aBlock()}>
 !
 
-whileFalse
+whileTrue
 	"inlined in the Compiler"
-	self whileFalse: []
+	self whileTrue: []
 !
 
-whileTrue
+whileTrue: aBlock
 	"inlined in the Compiler"
-	self whileTrue: []
+	<while(self()) {aBlock()}>
 ! !
 
 !BlockClosure methodsFor: 'error handling'!
@@ -139,46 +51,10 @@ on: anErrorClass do: aBlock
 
 !BlockClosure methodsFor: 'evaluating'!
 
-value
-	"inlined in the Compiler"
-	<return self();>
-!
-
-value: anArg
-	"inlined in the Compiler"
-	<return self(anArg);>
-!
-
-value: firstArg value: secondArg
-	"inlined in the Compiler"
-	<return self(firstArg, secondArg);>
-!
-
-value: firstArg value: secondArg value: thirdArg
-	"inlined in the Compiler"
-	<return self(firstArg, secondArg, thirdArg);>
-!
-
-valueWithPossibleArguments: aCollection
-	<return self.apply(null, aCollection);>
-!
-
-new
-	"Use the receiver as a JS constructor. 
-	*Do not* use this method to instanciate Smalltalk objects!!"
-	<return new self()>
-!
-
 applyTo: anObject arguments: aCollection
 	<return self.apply(anObject, aCollection)>
 !
 
-timeToRun
-	"Answer the number of milliseconds taken to execute this block."
-
-	^ Date millisecondsToRun: self
-!
-
 ensure: aBlock
 	| success |
 	success := false.
@@ -189,6 +65,12 @@ ensure: aBlock
 			ex signal]
 !
 
+new
+	"Use the receiver as a JS constructor. 
+	*Do not* use this method to instanciate Smalltalk objects!!"
+	<return new self()>
+!
+
 newValue: anObject
 	"Use the receiver as a JS constructor. 
 	*Do not* use this method to instanciate Smalltalk objects!!"
@@ -205,21 +87,51 @@ newValue:  anObject value: anObject2 value: anObject3
 	"Use the receiver as a JS constructor. 
 	*Do not* use this method to instanciate Smalltalk objects!!"
 	<return new self(anObject, anObject2)>
-! !
+!
 
-!BlockClosure methodsFor: 'timeout/interval'!
+timeToRun
+	"Answer the number of milliseconds taken to execute this block."
 
-valueWithTimeout: aNumber
-	<return setTimeout(self, aNumber)>
+	^ Date millisecondsToRun: self
+!
+
+value
+	"inlined in the Compiler"
+	<return self();>
 !
 
+value: anArg
+	"inlined in the Compiler"
+	<return self(anArg);>
+!
+
+value: firstArg value: secondArg
+	"inlined in the Compiler"
+	<return self(firstArg, secondArg);>
+!
+
+value: firstArg value: secondArg value: thirdArg
+	"inlined in the Compiler"
+	<return self(firstArg, secondArg, thirdArg);>
+!
+
+valueWithPossibleArguments: aCollection
+	<return self.apply(null, aCollection);>
+! !
+
+!BlockClosure methodsFor: 'timeout/interval'!
+
 valueWithInterval: aNumber
 	<return setInterval(self, aNumber)>
+!
+
+valueWithTimeout: aNumber
+	<return setTimeout(self, aNumber)>
 ! !
 
 Object subclass: #CompiledMethod
 	instanceVariableNames: ''
-	category: 'Kernel-Methods'!
+	package: 'Kernel-Methods'!
 !CompiledMethod commentStamp!
 CompiledMethod hold the source and compiled code of a class method.
 
@@ -241,12 +153,8 @@ or messages sent from this method:
 
 !CompiledMethod methodsFor: 'accessing'!
 
-source
-	^(self basicAt: 'source') ifNil: ['']
-!
-
-source: aString
-	self basicAt: 'source' put: aString
+arguments
+	<return self.args || []>
 !
 
 category
@@ -257,14 +165,6 @@ category: aString
 	self basicAt: 'category' put: aString
 !
 
-selector
-	^self basicAt: 'selector'
-!
-
-selector: aString
-	self basicAt: 'selector' put: aString
-!
-
 fn
 	^self basicAt: 'fn'
 !
@@ -285,7 +185,107 @@ referencedClasses
 	^self basicAt: 'referencedClasses'
 !
 
+selector
+	^self basicAt: 'selector'
+!
+
+selector: aString
+	self basicAt: 'selector' put: aString
+!
+
+source
+	^(self basicAt: 'source') ifNil: ['']
+!
+
+source: aString
+	self basicAt: 'source' put: aString
+! !
+
+Object subclass: #Message
+	instanceVariableNames: 'selector arguments'
+	package: 'Kernel-Methods'!
+!Message commentStamp!
+Generally, the system does not use instances of Message for efficiency reasons.
+However, when a message is not understood by its receiver, the interpreter will make up an instance of it in order to capture the information involved in an actual message transmission. 
+This instance is sent it as an argument with the message `doesNotUnderstand:` to the receiver.
+
+See boot.js, `messageNotUnderstood`  and its counterpart `Object>>doesNotUnderstand:`!
+
+!Message methodsFor: 'accessing'!
+
 arguments
-	<return self.args || []>
+	^arguments
+!
+
+arguments: anArray
+	arguments := anArray
+!
+
+selector
+	^selector
+!
+
+selector: aString
+	selector := aString
+! !
+
+!Message methodsFor: 'printing'!
+
+printString
+	^ String streamContents: [:aStream|  
+                                  				aStream 
+                                  					nextPutAll: super printString;
+                                  					nextPutAll: '(';
+                                  					nextPutAll: selector;
+                                  					nextPutAll: ')' 				]
+!
+
+sendTo: anObject
+	Smalltalk current send: self selector to: anObject arguments: self arguments
+! !
+
+!Message class methodsFor: 'instance creation'!
+
+selector: aString arguments: anArray
+	^self new
+		selector: aString;
+		arguments: anArray;
+		yourself
+! !
+
+Object subclass: #MethodContext
+	instanceVariableNames: ''
+	package: 'Kernel-Methods'!
+!MethodContext commentStamp!
+MethodContext holds all the dynamic state associated with the execution of either a method activation resulting from a message send. That is used to build the call stack while debugging.
+  
+MethodContext instances are JavaScript `SmalltalkMethodContext` objects defined in boot.js 
+
+Current limitation: MethodContext instances are not created on Block evaluation. That means it's actually impossible to debug inside a Block.!
+
+!MethodContext methodsFor: 'accessing'!
+
+asString
+	^self receiver class printString, ' >> ', self selector
+!
+
+home
+	<return self.homeContext>
+!
+
+printString
+	^super printString, '(', self asString, ')'
+!
+
+receiver
+	<return self.receiver>
+!
+
+selector
+	<return smalltalk.convertSelector(self.selector)>
+!
+
+temps
+	<return self.temps>
 ! !
 
diff --git a/amber/src/st/Kernel-Objects.st b/amber/src/st/Kernel-Objects.st
index f9484af0a88..90d25bd2b52 100644
--- a/amber/src/st/Kernel-Objects.st
+++ b/amber/src/st/Kernel-Objects.st
@@ -1,7 +1,7 @@
 Smalltalk current createPackage: 'Kernel-Objects' properties: #{}!
 nil subclass: #Object
 	instanceVariableNames: ''
-	category: 'Kernel-Objects'!
+	package: 'Kernel-Objects'!
 !Object commentStamp!
 *Object is the root of the Smalltalk class system*. All classes in the system are subclasses of Object.
 
@@ -41,16 +41,24 @@ Objects understand equality  `#=` and identity `#==` comparison.
 
 !Object methodsFor: 'accessing'!
 
-yourself
-	^self
+basicAt: aString
+	<return self[aString]>
+!
+
+basicAt: aString put: anObject
+	<return self[aString] = anObject>
+!
+
+basicDelete: aString
+    <delete self[aString]; return aString>
 !
 
 class
 	<return self.klass>
 !
 
-size
-	self error: 'Object not indexable'
+identityHash
+	<return self.identityHash || (self.identityHash = smalltalk.nextId());>
 !
 
 instVarAt: aSymbol
@@ -65,20 +73,12 @@ instVarAt: aSymbol put: anObject
 	<self['@' + varname] = anObject>
 !
 
-basicAt: aString
-	<return self[aString]>
-!
-
-basicAt: aString put: anObject
-	<return self[aString] = anObject>
-!
-
-basicDelete: aString
-    <delete self[aString]; return aString>
+size
+	self error: 'Object not indexable'
 !
 
-identityHash
-	<return self.identityHash || (self.identityHash = smalltalk.nextId());>
+yourself
+	^self
 ! !
 
 !Object methodsFor: 'comparing'!
@@ -87,14 +87,14 @@ identityHash
 	^self == anObject
 !
 
-~= anObject
-	^(self = anObject) = false
-!
-
 == anObject
 	^self identityHash = anObject identityHash
 !
 
+~= anObject
+	^(self = anObject) = false
+!
+
 ~~ anObject
 	^(self == anObject) = false
 ! !
@@ -105,14 +105,6 @@ identityHash
 	^Association key: self value: anObject
 !
 
-asString
-	^self printString
-!
-
-asJavascript
-	^self asString
-!
-
 asJSON
 	| variables |
 	variables := HashedCollection new.
@@ -123,6 +115,14 @@ asJSON
 
 asJSONString
 	^JSON stringify: self asJSON
+!
+
+asJavascript
+	^self asString
+!
+
+asString
+	^self printString
 ! !
 
 !Object methodsFor: 'copying'!
@@ -131,50 +131,40 @@ copy
 	^self shallowCopy postCopy
 !
 
-shallowCopy
-	<
+deepCopy
+	<    
 	    var copy = self.klass._new();
 	    for(var i in self) {
 		if(/^@.+/.test(i)) {
-		    copy[i] = self[i];
+		    copy[i] = self[i]._deepCopy();
 		}
 	    }
 	    return copy;
 	>
 !
 
-deepCopy
-	<    
+postCopy
+!
+
+shallowCopy
+	<
 	    var copy = self.klass._new();
 	    for(var i in self) {
 		if(/^@.+/.test(i)) {
-		    copy[i] = self[i]._deepCopy();
+		    copy[i] = self[i];
 		}
 	    }
 	    return copy;
 	>
-!
-
-postCopy
 ! !
 
 !Object methodsFor: 'error handling'!
 
-error: aString
-	Error signal: aString
-!
-
-subclassResponsibility
-	self error: 'This method is a responsibility of a subclass'
-!
-
-shouldNotImplement
-	self error: 'This method should not be implemented in ', self class name
-!
-
-try: aBlock catch: anotherBlock
-	<try{result = aBlock()} catch(e) {result = anotherBlock(e)};
-	return result;>
+deprecatedAPI
+	"Just a simple way to deprecate methods.
+	#deprecatedAPI is in the 'error handling' protocol even if it doesn't throw an error,
+	but it could in the future."
+	console warn: thisContext home asString, ' is deprecated!! (in ', thisContext home home asString, ')'
 !
 
 doesNotUnderstand: aMessage
@@ -184,15 +174,25 @@ doesNotUnderstand: aMessage
 		signal
 !
 
+error: aString
+	Error signal: aString
+!
+
 halt
 	self error: 'Halt encountered'
 !
 
-deprecatedAPI
-	"Just a simple way to deprecate methods.
-	#deprecatedAPI is in the 'error handling' protocol even if it doesn't throw an error,
-	but it could in the future."
-	console warn: thisContext home asString, ' is deprecated!! (in ', thisContext home home asString, ')'
+shouldNotImplement
+	self error: 'This method should not be implemented in ', self class name
+!
+
+subclassResponsibility
+	self error: 'This method is a responsibility of a subclass'
+!
+
+try: aBlock catch: anotherBlock
+	<try{result = aBlock()} catch(e) {result = anotherBlock(e)};
+	return result;>
 ! !
 
 !Object methodsFor: 'initialization'!
@@ -202,37 +202,41 @@ initialize
 
 !Object methodsFor: 'message handling'!
 
-perform: aSymbol
-	^self perform: aSymbol withArguments: #()
-!
-
-perform: aSymbol withArguments: aCollection
-	^self basicPerform: aSymbol asSelector withArguments: aCollection
-!
-
 basicPerform: aSymbol 
 	^self basicPerform: aSymbol withArguments: #()
 !
 
 basicPerform: aSymbol withArguments: aCollection
 	<return self[aSymbol].apply(self, aCollection);>
+!
+
+perform: aSymbol
+	^self perform: aSymbol withArguments: #()
+!
+
+perform: aSymbol withArguments: aCollection
+	^self basicPerform: aSymbol asSelector withArguments: aCollection
 ! !
 
 !Object methodsFor: 'printing'!
 
-printString
-	^'a ', self class name
+log: aString block: aBlock
+
+	| result |
+	console log:  aString,  ' time: ', (Date millisecondsToRun: [result := aBlock value]) printString.
+	^result
 !
 
 printNl
 	<console.log(self)>
 !
 
-log: aString block: aBlock
+printString
+	^'a ', self class name
+!
 
-	| result |
-	console log:  aString,  ' time: ', (Date millisecondsToRun: [result := aBlock value]) printString.
-	^result
+storeOn: aStream
+	aStream nextPutAll: self printString
 !
 
 storeString
@@ -240,24 +244,10 @@ storeString
 	can be reconstructed."
 
 	^ String streamContents: [:s | self storeOn: s]
-!
-
-storeOn: aStream
-	aStream nextPutAll: self printString
 ! !
 
 !Object methodsFor: 'testing'!
 
-isKindOf: aClass
-	^(self isMemberOf: aClass)
-	    ifTrue: [true]
-	    ifFalse: [self class inheritsFrom: aClass]
-!
-
-isMemberOf: aClass
-	^self class = aClass
-!
-
 ifNil: aBlock
 	"inlined in the Compiler"
 	^self
@@ -278,27 +268,29 @@ ifNotNil: aBlock ifNil: anotherBlock
 	^aBlock value
 !
 
-isNil
+isClass
 	^false
 !
 
-notNil
-	^self isNil not
+isKindOf: aClass
+	^(self isMemberOf: aClass)
+	    ifTrue: [true]
+	    ifFalse: [self class inheritsFrom: aClass]
 !
 
-isClass
-	^false
+isMemberOf: aClass
+	^self class = aClass
 !
 
 isMetaclass
 	^false
 !
 
-isNumber
+isNil
 	^false
 !
 
-isString
+isNumber
 	^false
 !
 
@@ -306,8 +298,16 @@ isParseFailure
 	^false
 !
 
+isString
+	^false
+!
+
 isSymbol
 	^false
+!
+
+notNil
+	^self isNil not
 ! !
 
 !Object class methodsFor: 'initialization'!
@@ -316,1264 +316,1035 @@ initialize
 	"no op"
 ! !
 
-Object subclass: #Smalltalk
+Object subclass: #Boolean
 	instanceVariableNames: ''
-	category: 'Kernel-Objects'!
-!Smalltalk commentStamp!
-Smalltalk has only one instance, accessed with `Smalltalk current`. 
-It represents the global JavaScript variable `smalltalk` declared in `js/boot.js`.
-
-The `smalltalk` object holds all class and packages defined in the system.
-
-## Classes
-
-Classes can be accessed using the following methods:
-
-- `#classes` answers the full list of Smalltalk classes in the system
-- `#at:` answers a specific class of `nil`
-
-## Packages
-
-Packages can be accessed using the following methods:
+	package: 'Kernel-Objects'!
+!Boolean commentStamp!
+Boolean wraps the JavaScript `Boolean()` constructor. The `true` and `false` objects are the JavaScript boolean objects.
 
-- `#packages` answers the full list of packages
-- `#packageAt:` answers a specific class of `nil`
+Boolean defines the protocol for logic testing operations and conditional control structures for the logical values.
+Boolean instances are weither `true` or `false`.!
 
-__note:__ classes and packages are accessed using strings, not symbols
+!Boolean methodsFor: 'comparing'!
 
-## Parsing
+= aBoolean
+	aBoolean class = self class ifFalse: [^false].
+	<return Boolean(self == true) == aBoolean>
+! !
 
-The `#parse:` method is used to parse Smalltalk source code. 
-It requires the `Compiler` package and the `js/parser.js` parser file in order to work!
+!Boolean methodsFor: 'controlling'!
 
-!Smalltalk methodsFor: 'accessing'!
+& aBoolean
+	<
+	    if(self == true) {
+		return aBoolean;
+	    } else {
+		return false;
+	    }
+	>
+!
 
-classes
-	<return self.classes()>
+and: aBlock
+	^self = true
+	    ifTrue: aBlock
+	    ifFalse: [false]
 !
 
-at: aString
-	<return self[aString]>
+ifFalse: aBlock
+	"inlined in the Compiler"
+	^self ifTrue: [] ifFalse: aBlock
 !
 
-basicParse: aString
-	<return smalltalk.parser.parse(aString)>
+ifFalse: aBlock ifTrue: anotherBlock
+	"inlined in the Compiler"
+	^self ifTrue: anotherBlock ifFalse: aBlock
 !
 
-parse: aString
-	| result | 
-	self try: [result := self basicParse: aString] catch: [:ex | (self parseError: ex parsing: aString) signal].
-	^result
+ifTrue: aBlock
+	"inlined in the Compiler"
+	^self ifTrue: aBlock ifFalse: []
 !
 
-parseError: anException parsing: aString
-	| row col message lines badLine code |
-	<row = anException.line;
-	col = anException.column;
-	message = anException.message;>.
-	lines := aString lines.
-	badLine := lines at: row.
-	badLine := (badLine copyFrom: 1 to: col - 1), ' ===>', (badLine copyFrom:  col to: badLine size).
-	lines at: row put: badLine.
-	code := String streamContents: [:s |
-                  lines withIndexDo: [:l :i |
-                     s nextPutAll: i asString, ': ', l, String lf]].
-	^ Error new messageText: ('Parse error on line ' , row , ' column ' , col , ' : ' , message , ' Below is code with line numbers and ===> marker inserted:' , String lf, code)
+ifTrue: aBlock ifFalse: anotherBlock
+	"inlined in the Compiler"
+	<
+	    if(self == true) {
+		return aBlock();
+	    } else {
+		return anotherBlock();
+	    }
+	>
 !
 
-reservedWords
-	"JavaScript reserved words"
-	<return self.reservedWords>
+not
+	^self = false
 !
 
-readJSObject: anObject
-	<return self.readJSObject(anObject)>
+or: aBlock
+	^self = true
+	    ifTrue: [true]
+	    ifFalse: aBlock
 !
 
-send: aSelector to: anObject arguments: aCollection
-	| selector |
-	selector := aSelector asString asSelector.
-	<self.send(anObject, selector, aCollection)>
+| aBoolean
+	<
+	    if(self == true) {
+		return true;
+	    } else {
+		return aBoolean;
+	    }
+	>
 ! !
 
-!Smalltalk methodsFor: 'classes'!
+!Boolean methodsFor: 'converting'!
 
-removeClass: aClass
-	aClass isMetaclass ifTrue: [self error: aClass asString, ' is a Metaclass and cannot be removed!!'].
-	aClass methodDictionary values do: [:each |
-		aClass removeCompiledMethod: each].
-	aClass class methodDictionary values do: [:each |
-		aClass class removeCompiledMethod: each].
-	self basicDelete: aClass name
+asJSON
+	^self
 ! !
 
-!Smalltalk methodsFor: 'packages'!
-
-packages
-	"Return all Package instances in the system."
-
-	<return self.packages.all()>
-!
-
-packageAt: packageName
-       <return self.packages[packageName]>
-!
+!Boolean methodsFor: 'copying'!
 
-packageAt: packageName ifAbsent: aBlock
-       ^(self packageAt: packageName) ifNil: aBlock
+deepCopy
+	^self
 !
 
-removePackage: packageName
-	"Removes a package and all its classes."
-
-	| pkg |
-	pkg := self packageAt: packageName ifAbsent: [self error: 'Missing package: ', packageName].
-	pkg classes do: [:each |
-        	self removeClass: each].
-	self deletePackage: packageName
-!
+shallowCopy
+	^self
+! !
 
-renamePackage: packageName to: newName
-	"Rename a package."
+!Boolean methodsFor: 'printing'!
 
-	| pkg |
-	pkg := self packageAt: packageName ifAbsent: [self error: 'Missing package: ', packageName].
-	(self packageAt: newName) ifNotNil: [self error: 'Already exists a package called: ', newName].
-	<smalltalk.packages[newName] = smalltalk.packages[packageName]>.
-	pkg name: newName.
-	self deletePackage: packageName.
+printString
+	<return self.toString()>
 ! !
 
-!Smalltalk methodsFor: 'private'!
-
-createPackage: packageName
-	"Create and bind a new package with given name and return it."
+Object subclass: #Date
+	instanceVariableNames: ''
+	package: 'Kernel-Objects'!
+!Date commentStamp!
+The Date class is used to work with dates and times. Therefore `Date today` and `Date now` are both valid in
+Amber and answer the same date object.
 
-      <return smalltalk.addPackage(packageName, nil)>
-!
+Date wraps the `Date()` JavaScript constructor, and Smalltalk date objects are JavaScript date objects.!
 
-deletePackage: packageName
-	"Deletes a package by deleting its binding, but does not check if it contains classes etc.
-	To remove a package, use #removePackage instead."
+!Date methodsFor: 'accessing'!
 
-       <delete smalltalk.packages[packageName]>
+day
+	^self dayOfWeek
 !
 
-createPackage: packageName properties: aDict
-	"Create and bind a new package with given name and return it."
-
-	| object |
-	<object = {};>.
-	aDict keysAndValuesDo: [:key :value |
-		<object[key] = value>.
-	].
-       <return smalltalk.addPackage(packageName, object)>
-! !
-
-Smalltalk class instanceVariableNames: 'current'!
-
-!Smalltalk class methodsFor: 'accessing'!
-
-current
-	<return smalltalk>
-! !
-
-Object subclass: #Package
-	instanceVariableNames: 'commitPathJs commitPathSt'
-	category: 'Kernel-Objects'!
-!Package commentStamp!
-A Package is similar to a "class category" typically found in other Smalltalks like Pharo or Squeak. Amber does not have class categories anymore, it had in the beginning but now each class in the system knows which package it belongs to.
+day: aNumber
+	self day: aNumber
+!
 
-A Package has a name, an Array of "requires", a comment and a Dictionary with other optional key value attributes. A Package can also be queried for its classes, but it will then resort to a reverse scan of all classes to find them.
-Packages are manipulated through "Smalltalk current", like for example finding one based on a name:
+dayOfMonth
+	<return self.getDate()>
+!
 
-	Smalltalk current packageAt: 'Kernel'
+dayOfMonth: aNumber
+	<self.setDate(aNumber)>
+!
 
-...but you can also use:
+dayOfWeek
+	<return self.getDay() + 1>
+!
 
-	Package named: 'Kernel'
+dayOfWeek: aNumber
+	<return self.setDay(aNumber - 1)>
+!
 
-A Package differs slightly from a Monticello package which can span multiple class categories using a naming convention based on hyphenation. But just as in Monticello a Package supports "class extensions" so a Package
-can define behaviors in foreign classes using a naming convention for method categories where the category starts with an asterisk and then the name of the owning package follows. This can easily be seen in for example class
-String where the method category "*IDE" defines #inspectOn: which thus is a method belonging to the IDE package.
+hours
+	<return self.getHours()>
+!
 
-You can fetch a package from the server:
+hours: aNumber
+	<self.setHours(aNumber)>
+!
 
-	Package fetch: 'Additional-Examples'!
+milliseconds
+	<return self.getMilliseconds()>
+!
 
-!Package methodsFor: 'accessing'!
+milliseconds: aNumber
+	<self.setMilliseconds(aNumber)>
+!
 
-name
-	<return self.pkgName>
+minutes
+	<return self.getMinutes()>
 !
 
-name: aString
-	<self.pkgName = aString>
+minutes: aNumber
+	<self.setMinutes(aNumber)>
 !
 
-dependencies
-	^self propertyAt: 'dependencies' ifAbsent: [#()]
+month
+	<return self.getMonth() + 1>
 !
 
-dependencies: anArray
-	^self propertyAt: 'dependencies' put: anArray
+month: aNumber
+	<self.setMonth(aNumber - 1)>
 !
 
-properties
-	^Smalltalk current readJSObject: (self basicAt: 'properties')
+seconds
+	<return self.getSeconds()>
 !
 
-properties: aDict
-	"We store it as a javascript object."
-	
-	| object |
-	<object = {};>.
-	aDict keysAndValuesDo: [:key :value |
-		<object[key] = value>.
-	].
-	<return self.properties = object>
+seconds: aNumber
+	<self.setSeconds(aNumber)>
 !
 
-commitPathJs
-	^ commitPathJs ifNil: [self class defaultCommitPathJs]
+time
+	<return self.getTime()>
 !
 
-commitPathJs: aString
-	commitPathJs := aString
+time: aNumber
+	<self.setTime(aNumber)>
 !
 
-commitPathSt
-	^ commitPathSt ifNil: [self class defaultCommitPathSt]
+year
+	<return self.getFullYear()>
 !
 
-commitPathSt: aString
-	commitPathSt := aString
+year: aNumber
+	<self.setFullYear(aNumber)>
 ! !
 
-!Package methodsFor: 'classes'!
+!Date methodsFor: 'arithmetic'!
 
-classes
-	"We need to do a reverse scan."
-	^Smalltalk current classes select: [:c | c package == self]
++ aDate
+	<return self + aDate>
 !
 
-sortedClasses
-	"Answer all classes in the receiver, sorted by superclass/subclasses"
-	
-	^self classes inject: #() into: [:acc :each | 
-		acc isEmpty 
-			ifTrue: [acc add: each; yourself]
-			ifFalse: [(acc includes: each superclass)
-				ifTrue: [acc add: each; yourself]
-				ifFalse: [{each}, acc]]]
+- aDate
+	<return self - aDate>
 ! !
 
-!Package methodsFor: 'printing'!
-
-printString
-	^self name
-! !
+!Date methodsFor: 'comparing'!
 
-!Package methodsFor: 'private'!
+< aDate
+	<return self < aDate>
+!
 
-propertiesAsJSON
-	<return JSON.stringify(self.properties)>
+<= aDate
+	<return self <= aDate>
 !
 
-jsProperties
-	<return self.properties>
+> aDate
+	<return self >> aDate>
 !
 
-jsProperties: aJSObject
-	<return self.properties = aJSObject>
+>= aDate
+	<return self >>= aDate>
 ! !
 
-!Package methodsFor: 'properties'!
+!Date methodsFor: 'converting'!
 
-propertyAt: key
+asDateString
+	<return self.toDateString()>
+!
 
-	<return self.properties[key]>
+asLocaleString
+	<return self.toLocaleString()>
 !
 
-propertyAt: key put: value
-
-	<return self.properties[key] = value>
+asMilliseconds
+	^self time
 !
 
-propertyAt: key ifAbsent: block
-
-	^(self propertyAt: key) ifNil: [block value]
-! !
-
-Package class instanceVariableNames: 'defaultCommitPathJs defaultCommitPathSt'!
-
-!Package class methodsFor: 'commit paths'!
-
-defaultCommitPathJs
-	^ defaultCommitPathJs ifNil: [ defaultCommitPathJs := 'js']
+asNumber
+	^self asMilliseconds
 !
 
-defaultCommitPathJs: aString
-	defaultCommitPathJs := aString
+asString
+	<return self.toString()>
 !
 
-defaultCommitPathSt
-	^ defaultCommitPathSt ifNil: [ defaultCommitPathSt := 'st']
-!
+asTimeString
+	<return self.toTimeString()>
+! !
 
-defaultCommitPathSt: aString
-	defaultCommitPathSt := aString
-!
+!Date methodsFor: 'printing'!
 
-resetCommitPaths
-        defaultCommitPathJs := nil.
-        defaultCommitPathSt := nil.
+printString
+	^self asString
 ! !
 
-!Package class methodsFor: 'loading-storing'!
+!Date class methodsFor: 'instance creation'!
 
-fetch: aPackageName prefix: aPrefix
-	jQuery getScript: (aPrefix , aPackageName , '.js') onSuccess: [ Package init: aPackageName ]
+fromMilliseconds: aNumber
+	^self new: aNumber
 !
 
-fetch: aPackageName
-	self fetch: aPackageName prefix: self defaultCommitPathJs, '/'
+fromSeconds: aNumber
+	^self fromMilliseconds: aNumber * 1000
 !
 
-commitToLocalStorage: aPackageName
-	| key sourceCode |
-	key := 'smalltalk.packages.' , aPackageName.
-	sourceCode := Exporter new exportPackage: aPackageName.
-	<localStorage[key] = escape(sourceCode)>
+fromString: aString
+	"Example: Date fromString('2011/04/15 00:00:00')"
+	^self new: aString
 !
 
-init: aPackageName
-	(smalltalk classes select: [ :each | <each.pkg.pkgName == aPackageName> ])
-		do: [ :each | <smalltalk.init(each)> ];
-		do: [ :each | each initialize ]
-! !
-
-!Package class methodsFor: 'not yet classified'!
-
-named: aPackageName
+millisecondsToRun: aBlock
+	| t |
+	t := Date now.
+	aBlock value.
+	^Date now - t
+!
 
-	^Smalltalk current packageAt: aPackageName
+new: anObject
+	<return new Date(anObject)>
 !
 
-named: aPackageName ifAbsent: aBlock
+now
+	^self today
+!
 
-	^Smalltalk current packageAt: aPackageName ifAbsent: aBlock
+today
+	^self new
 ! !
 
-Object subclass: #Number
+Object subclass: #Date
 	instanceVariableNames: ''
-	category: 'Kernel-Objects'!
-!Number commentStamp!
-Number holds the most general methods for dealing with numbers.  
-Number is directly mapped to JavaScript Number.
+	package: 'Kernel-Objects'!
+!Date commentStamp!
+The Date class is used to work with dates and times. Therefore `Date today` and `Date now` are both valid in
+Amber and answer the same date object.
 
-Most arithmetic methods like `#+` `#/` `#-` `#max:` are directly inlined into javascript. 
+Date wraps the `Date()` JavaScript constructor, and Smalltalk date objects are JavaScript date objects.!
 
-##Enumerating
-A Number can be used to evaluate a Block a fixed number of times:
+!Date methodsFor: 'accessing'!
 
-	5 timesRepeat: [Transcript show: 'This will be printed 5 times'; cr].
-	
-	1 to: 5 do: [:aNumber| Transcript show: aNumber asString; cr].
-	
-	1 to: 10 by: 2 do: [:aNumber| Transcript show: aNumber asString; cr].!
+day
+	^self dayOfWeek
+!
 
-!Number methodsFor: 'accessing'!
+day: aNumber
+	self day: aNumber
+!
 
-identityHash
-	^self asString, 'n'
-! !
+dayOfMonth
+	<return self.getDate()>
+!
 
-!Number methodsFor: 'arithmetic'!
+dayOfMonth: aNumber
+	<self.setDate(aNumber)>
+!
 
-+ aNumber
-	"Inlined in the Compiler"
-	<return self + aNumber>
+dayOfWeek
+	<return self.getDay() + 1>
 !
 
-- aNumber
-	"Inlined in the Compiler"
-	<return self - aNumber>
+dayOfWeek: aNumber
+	<return self.setDay(aNumber - 1)>
 !
 
-* aNumber
-	"Inlined in the Compiler"
-	<return self * aNumber>
+hours
+	<return self.getHours()>
 !
 
-/ aNumber
-	"Inlined in the Compiler"
-	<return self / aNumber>
+hours: aNumber
+	<self.setHours(aNumber)>
 !
 
-max: aNumber
-	<return Math.max(self, aNumber);>
+milliseconds
+	<return self.getMilliseconds()>
 !
 
-min: aNumber
-	<return Math.min(self, aNumber);>
+milliseconds: aNumber
+	<self.setMilliseconds(aNumber)>
 !
 
-negated
-	^0 - self
+minutes
+	<return self.getMinutes()>
 !
 
-\\ aNumber
-	<return self % aNumber>
+minutes: aNumber
+	<self.setMinutes(aNumber)>
 !
 
-sqrt
-	<return Math.sqrt(self)>
+month
+	<return self.getMonth() + 1>
 !
 
-squared
-	^self * self
-! !
+month: aNumber
+	<self.setMonth(aNumber - 1)>
+!
 
-!Number methodsFor: 'comparing'!
+seconds
+	<return self.getSeconds()>
+!
 
-= aNumber
-	aNumber isNumber ifFalse: [^false]. 
-	<return Number(self) == aNumber>
+seconds: aNumber
+	<self.setSeconds(aNumber)>
 !
 
-> aNumber
-	"Inlined in the Compiler"
-	<return self >> aNumber>
+time
+	<return self.getTime()>
 !
 
-< aNumber
-	"Inlined in the Compiler"
-	<return self < aNumber>
+time: aNumber
+	<self.setTime(aNumber)>
 !
 
->= aNumber
-	"Inlined in the Compiler"
-	<return self >>= aNumber>
+year
+	<return self.getFullYear()>
 !
 
-<= aNumber
-	"Inlined in the Compiler"
-	<return self <= aNumber>
+year: aNumber
+	<self.setFullYear(aNumber)>
 ! !
 
-!Number methodsFor: 'converting'!
+!Date methodsFor: 'arithmetic'!
 
-rounded
-	<return Math.round(self);>
++ aDate
+	<return self + aDate>
 !
 
-truncated
-|result|
+- aDate
+	<return self - aDate>
+! !
 
-    self >= 0 
-        ifTrue: [<result = Math.floor(self);>]
-        ifFalse: [<result = (Math.floor(self * (-1)) * (-1));>].
+!Date methodsFor: 'comparing'!
 
-    ^ result
+< aDate
+	<return self < aDate>
 !
 
-to: aNumber
-	| array first last count |
-	first := self truncated.
-	last := aNumber truncated + 1.
-	count := 1.
-	array := Array new.
-	(last - first) timesRepeat: [
-	    array at: count put: first.
-	    count := count + 1.
-	    first := first + 1].
-	^array
+<= aDate
+	<return self <= aDate>
 !
 
-asString
-	^self printString
+> aDate
+	<return self >> aDate>
 !
 
-asJavascript
-	^'(', self printString, ')'
+>= aDate
+	<return self >>= aDate>
+! !
+
+!Date methodsFor: 'converting'!
+
+asDateString
+	<return self.toDateString()>
 !
 
-atRandom
-    ^(Random new next * self) truncated + 1
+asLocaleString
+	<return self.toLocaleString()>
 !
 
-@ aNumber
-	^Point x: self y: aNumber
+asMilliseconds
+	^self time
 !
 
-asPoint
-	^Point x: self y: self
+asNumber
+	^self asMilliseconds
 !
 
-to: stop by: step
-	| array value pos |
-	value := self.
-	array := Array new.
-	pos := 1.
-	step = 0 ifTrue: [self error: 'step must be non-zero'].
-	step < 0
-		ifTrue: [[ value >= stop ] whileTrue: [
-	    			array at: pos put: value.
-	    			pos := pos + 1.
-	    			value := value + step]]
-		ifFalse: [[ value <= stop ] whileTrue: [
-	    			array at: pos put: value.
-	  			pos := pos + 1.
-	    			value := value + step]].
-	^array
-!
-
-asJSON
-	^self
-! !
-
-!Number methodsFor: 'copying'!
-
-deepCopy
-	^self copy
-!
-
-copy
-	^self
-! !
-
-!Number methodsFor: 'enumerating'!
-
-timesRepeat: aBlock
-	| integer count |
-	integer := self truncated.
-	count := 1.
-	[count > self] whileFalse: [
-	    aBlock value.
-	    count := count + 1]
-!
-
-to: stop do: aBlock
-	"Evaluate aBlock for each number from self to aNumber."
-	| nextValue |
-	nextValue := self.
-	[nextValue <= stop]
-		whileTrue: 
-			[aBlock value: nextValue.
-			nextValue := nextValue + 1]
+asString
+	<return self.toString()>
 !
 
-to: stop by: step do: aBlock
-	| value |
-	value := self.
-	step = 0 ifTrue: [self error: 'step must be non-zero'].
-	step < 0
-		ifTrue: [[ value >= stop ] whileTrue: [
-	    			aBlock value: value.
-	    			value := value + step]]
-		ifFalse: [[ value <= stop ] whileTrue: [
-	    			aBlock value: value.
-	    			value := value + step]]
+asTimeString
+	<return self.toTimeString()>
 ! !
 
-!Number methodsFor: 'printing'!
+!Date methodsFor: 'printing'!
 
 printString
-	<return String(self)>
-!
-
-printShowingDecimalPlaces: placesDesired
-	<return self.toFixed(placesDesired)>
+	^self asString
 ! !
 
-!Number methodsFor: 'testing'!
+!Date class methodsFor: 'instance creation'!
 
-isNumber
-	^true
+fromMilliseconds: aNumber
+	^self new: aNumber
 !
 
-even
-	^ 0 = (self \\ 2)
+fromSeconds: aNumber
+	^self fromMilliseconds: aNumber * 1000
 !
 
-odd
-	^ self even not
+fromString: aString
+	"Example: Date fromString('2011/04/15 00:00:00')"
+	^self new: aString
 !
 
-negative
-	"Answer whether the receiver is mathematically negative."
-
-	^ self < 0
+millisecondsToRun: aBlock
+	| t |
+	t := Date now.
+	aBlock value.
+	^Date now - t
 !
 
-positive
-	"Answer whether the receiver is positive or equal to 0. (ST-80 protocol)."
-
-	^ self >= 0
+new: anObject
+	<return new Date(anObject)>
 !
 
-isZero
-	^self = 0
-! !
-
-!Number methodsFor: 'timeouts/intervals'!
-
-clearInterval
-	<clearInterval(Number(self))>
+now
+	^self today
 !
 
-clearTimeout
-	<clearTimeout(Number(self))>
-! !
-
-!Number class methodsFor: 'instance creation'!
-
-pi
-	<return Math.PI>
+today
+	^self new
 ! !
 
-Object subclass: #Boolean
-	instanceVariableNames: ''
-	category: 'Kernel-Objects'!
-!Boolean commentStamp!
-Boolean wraps the JavaScript `Boolean()` constructor. The `true` and `false` objects are the JavaScript boolean objects.
-
-Boolean defines the protocol for logic testing operations and conditional control structures for the logical values.
-Boolean instances are weither `true` or `false`.!
+Object subclass: #JSObjectProxy
+	instanceVariableNames: 'jsObject'
+	package: 'Kernel-Objects'!
+!JSObjectProxy commentStamp!
+JSObjectProxy handles sending messages to JavaScript object, therefore accessing JavaScript objects from Amber is transparent.
+JSOjbectProxy makes intensive use of `#doesNotUnderstand:`.
 
-!Boolean methodsFor: 'comparing'!
+## Examples
 
-= aBoolean
-	aBoolean class = self class ifFalse: [^false].
-	<return Boolean(self == true) == aBoolean>
-! !
+JSObjectProxy objects are instanciated by Amber when a Smalltalk message is sent to a JavaScript object.
 
-!Boolean methodsFor: 'controlling'!
+    window alert: 'hello world'.
+    window inspect.
+    (window jQuery: 'body') append: 'hello world'
 
-ifTrue: aBlock
-	"inlined in the Compiler"
-	^self ifTrue: aBlock ifFalse: []
-!
+Smalltalk messages sends are converted to JavaScript function calls or object property access _(in this order)_. If n one of them match, a `MessageNotUnderstood` error will be thrown. 
 
-ifFalse: aBlock
-	"inlined in the Compiler"
-	^self ifTrue: [] ifFalse: aBlock
-!
+## Message conversion rules
 
-ifFalse: aBlock ifTrue: anotherBlock
-	"inlined in the Compiler"
-	^self ifTrue: anotherBlock ifFalse: aBlock
-!
+- `someUser name` becomes  `someUser.name`
+- `someUser name: 'John'` becomes `someUser name = "John"`
+- `console log: 'hello world'` becomes `console.log('hello world')`
+- `(window jQuery: 'foo') css: 'background' color: 'red'` becomes `window.jQuery('foo').css('background', 'red')`
 
-ifTrue: aBlock ifFalse: anotherBlock
-	"inlined in the Compiler"
-	<
-	    if(self == true) {
-		return aBlock();
-	    } else {
-		return anotherBlock();
-	    }
-	>
-!
+__Note:__ For keyword-based messages, only the first keyword is kept: `window foo: 1 bar: 2` is equivalent to `window foo: 1 baz: 2`.!
 
-and: aBlock
-	^self = true
-	    ifTrue: aBlock
-	    ifFalse: [false]
-!
+!JSObjectProxy methodsFor: 'accessing'!
 
-or: aBlock
-	^self = true
-	    ifTrue: [true]
-	    ifFalse: aBlock
+at: aSymbol
+	| attr |
+	attr := aSymbol asString.
+	<return self['@jsObject'][attr]>
 !
 
-not
-	^self = false
+at: aSymbol put: anObject
+	| attr |
+	attr := aSymbol asString.
+	<self['@jsObject'][attr] = anObject>
 !
 
-& aBoolean
-	<
-	    if(self == true) {
-		return aBoolean;
-	    } else {
-		return false;
-	    }
-	>
+jsObject
+	^jsObject
 !
 
-| aBoolean
-	<
-	    if(self == true) {
-		return true;
-	    } else {
-		return aBoolean;
-	    }
-	>
+jsObject: aJSObject
+	jsObject := aJSObject
 ! !
 
-!Boolean methodsFor: 'converting'!
-
-asJSON
-	^self
-! !
+!JSObjectProxy methodsFor: 'proxy'!
 
-!Boolean methodsFor: 'copying'!
+doesNotUnderstand: aMessage
+	| obj selector jsSelector arguments |
+	obj := self jsObject.
+	selector := aMessage selector.
+	jsSelector := selector asJavaScriptSelector.
+	arguments := aMessage arguments.
+	<if(obj[jsSelector] !!= undefined) {return smalltalk.send(obj, jsSelector, arguments)}>.
+	super doesNotUnderstand: aMessage
+!
 
-shallowCopy
-	^self
+inspectOn: anInspector
+	| variables |
+	variables := Dictionary new.
+	variables at: '#self' put: self jsObject.
+	anInspector setLabel: self printString.
+	<for(var i in self['@jsObject']) {
+		variables._at_put_(i, self['@jsObject'][i]);
+	}>.
+	anInspector setVariables: variables
 !
 
-deepCopy
-	^self
+printString
+	^self jsObject toString
 ! !
 
-!Boolean methodsFor: 'printing'!
+!JSObjectProxy class methodsFor: 'instance creation'!
 
-printString
-	<return self.toString()>
+on: aJSObject
+	^self new
+		jsObject: aJSObject;
+		yourself
 ! !
 
-Object subclass: #Date
+Object subclass: #Number
 	instanceVariableNames: ''
-	category: 'Kernel-Objects'!
-!Date commentStamp!
-The Date class is used to work with dates and times. Therefore `Date today` and `Date now` are both valid in
-Amber and answer the same date object.
-
-Date wraps the `Date()` JavaScript constructor, and Smalltalk date objects are JavaScript date objects.!
-
-!Date methodsFor: 'accessing'!
-
-year
-	<return self.getFullYear()>
-!
-
-month
-	<return self.getMonth() + 1>
-!
-
-month: aNumber
-	<self.setMonth(aNumber - 1)>
-!
-
-day
-	^self dayOfWeek
-!
-
-dayOfWeek
-	<return self.getDay() + 1>
-!
-
-dayOfWeek: aNumber
-	<return self.setDay(aNumber - 1)>
-!
-
-day: aNumber
-	self day: aNumber
-!
-
-year: aNumber
-	<self.setFullYear(aNumber)>
-!
+	package: 'Kernel-Objects'!
+!Number commentStamp!
+Number holds the most general methods for dealing with numbers.  
+Number is directly mapped to JavaScript Number.
 
-dayOfMonth
-	<return self.getDate()>
-!
+Most arithmetic methods like `#+` `#/` `#-` `#max:` are directly inlined into javascript. 
 
-dayOfMonth: aNumber
-	<self.setDate(aNumber)>
-!
+##Enumerating
+A Number can be used to evaluate a Block a fixed number of times:
 
-time
-	<return self.getTime()>
-!
+	5 timesRepeat: [Transcript show: 'This will be printed 5 times'; cr].
+	
+	1 to: 5 do: [:aNumber| Transcript show: aNumber asString; cr].
+	
+	1 to: 10 by: 2 do: [:aNumber| Transcript show: aNumber asString; cr].!
 
-time: aNumber
-	<self.setTime(aNumber)>
-!
+!Number methodsFor: 'accessing'!
 
-hours: aNumber
-	<self.setHours(aNumber)>
-!
+identityHash
+	^self asString, 'n'
+! !
 
-minutes: aNumber
-	<self.setMinutes(aNumber)>
-!
+!Number methodsFor: 'arithmetic'!
 
-seconds: aNumber
-	<self.setSeconds(aNumber)>
+* aNumber
+	"Inlined in the Compiler"
+	<return self * aNumber>
 !
 
-milliseconds: aNumber
-	<self.setMilliseconds(aNumber)>
++ aNumber
+	"Inlined in the Compiler"
+	<return self + aNumber>
 !
 
-hours
-	<return self.getHours()>
+- aNumber
+	"Inlined in the Compiler"
+	<return self - aNumber>
 !
 
-minutes
-	<return self.getMinutes()>
+/ aNumber
+	"Inlined in the Compiler"
+	<return self / aNumber>
 !
 
-seconds
-	<return self.getSeconds()>
+\\ aNumber
+	<return self % aNumber>
 !
 
-milliseconds
-	<return self.getMilliseconds()>
-! !
-
-!Date methodsFor: 'arithmetic'!
-
-- aDate
-	<return self - aDate>
+max: aNumber
+	<return Math.max(self, aNumber);>
 !
 
-+ aDate
-	<return self + aDate>
-! !
-
-!Date methodsFor: 'comparing'!
-
-< aDate
-	<return self < aDate>
+min: aNumber
+	<return Math.min(self, aNumber);>
 !
 
-> aDate
-	<return self >> aDate>
+negated
+	^0 - self
 !
 
-<= aDate
-	<return self <= aDate>
+sqrt
+	<return Math.sqrt(self)>
 !
 
->= aDate
-	<return self >>= aDate>
+squared
+	^self * self
 ! !
 
-!Date methodsFor: 'converting'!
-
-asString
-	<return self.toString()>
-!
+!Number methodsFor: 'comparing'!
 
-asMilliseconds
-	^self time
+< aNumber
+	"Inlined in the Compiler"
+	<return self < aNumber>
 !
 
-asDateString
-	<return self.toDateString()>
+<= aNumber
+	"Inlined in the Compiler"
+	<return self <= aNumber>
 !
 
-asTimeString
-	<return self.toTimeString()>
+= aNumber
+	aNumber isNumber ifFalse: [^false]. 
+	<return Number(self) == aNumber>
 !
 
-asLocaleString
-	<return self.toLocaleString()>
+> aNumber
+	"Inlined in the Compiler"
+	<return self >> aNumber>
 !
 
-asNumber
-	^self asMilliseconds
+>= aNumber
+	"Inlined in the Compiler"
+	<return self >>= aNumber>
 ! !
 
-!Date methodsFor: 'printing'!
+!Number methodsFor: 'converting'!
 
-printString
-	^self asString
-! !
+@ aNumber
+	^Point x: self y: aNumber
+!
 
-!Date class methodsFor: 'instance creation'!
+asJSON
+	^self
+!
 
-new: anObject
-	<return new Date(anObject)>
+asJavascript
+	^'(', self printString, ')'
 !
 
-fromString: aString
-	"Example: Date fromString('2011/04/15 00:00:00')"
-	^self new: aString
+asPoint
+	^Point x: self y: self
 !
 
-fromSeconds: aNumber
-	^self fromMilliseconds: aNumber * 1000
+asString
+	^self printString
 !
 
-fromMilliseconds: aNumber
-	^self new: aNumber
+atRandom
+    ^(Random new next * self) truncated + 1
 !
 
-today
-	^self new
+rounded
+	<return Math.round(self);>
 !
 
-now
-	^self today
+to: aNumber
+	| array first last count |
+	first := self truncated.
+	last := aNumber truncated + 1.
+	count := 1.
+	array := Array new.
+	(last - first) timesRepeat: [
+	    array at: count put: first.
+	    count := count + 1.
+	    first := first + 1].
+	^array
 !
 
-millisecondsToRun: aBlock
-	| t |
-	t := Date now.
-	aBlock value.
-	^Date now - t
-! !
+to: stop by: step
+	| array value pos |
+	value := self.
+	array := Array new.
+	pos := 1.
+	step = 0 ifTrue: [self error: 'step must be non-zero'].
+	step < 0
+		ifTrue: [[ value >= stop ] whileTrue: [
+	    			array at: pos put: value.
+	    			pos := pos + 1.
+	    			value := value + step]]
+		ifFalse: [[ value <= stop ] whileTrue: [
+	    			array at: pos put: value.
+	  			pos := pos + 1.
+	    			value := value + step]].
+	^array
+!
 
-Object subclass: #UndefinedObject
-	instanceVariableNames: ''
-	category: 'Kernel-Objects'!
-!UndefinedObject commentStamp!
-UndefinedObject describes the behavior of its sole instance, `nil`. `nil` represents a prior value for variables that have not been initialized, or for results which are meaningless.
+truncated
+|result|
 
-`nil` is the Smalltalk representation of the `undefined` JavaScript object.!
+    self >= 0 
+        ifTrue: [<result = Math.floor(self);>]
+        ifFalse: [<result = (Math.floor(self * (-1)) * (-1));>].
 
-!UndefinedObject methodsFor: 'class creation'!
+    ^ result
+! !
 
-subclass: aString instanceVariableNames: anotherString
-	^self subclass: aString instanceVariableNames: anotherString package: nil
-!
+!Number methodsFor: 'copying'!
 
-subclass: aString instanceVariableNames: aString2 category: aString3
-	"Kept for compatibility."
-	self deprecatedAPI.
-	^self subclass: aString instanceVariableNames: aString2 package: aString3
+copy
+	^self
 !
 
-subclass: aString instanceVariableNames: aString2 package: aString3
-	^ClassBuilder new
-	    superclass: self subclass: aString instanceVariableNames: aString2 package: aString3
+deepCopy
+	^self copy
 ! !
 
-!UndefinedObject methodsFor: 'converting'!
-
-asJSON
-	^null
-! !
+!Number methodsFor: 'enumerating'!
 
-!UndefinedObject methodsFor: 'copying'!
+timesRepeat: aBlock
+	| integer count |
+	integer := self truncated.
+	count := 1.
+	[count > self] whileFalse: [
+	    aBlock value.
+	    count := count + 1]
+!
 
-shallowCopy
-	^self
+to: stop by: step do: aBlock
+	| value |
+	value := self.
+	step = 0 ifTrue: [self error: 'step must be non-zero'].
+	step < 0
+		ifTrue: [[ value >= stop ] whileTrue: [
+	    			aBlock value: value.
+	    			value := value + step]]
+		ifFalse: [[ value <= stop ] whileTrue: [
+	    			aBlock value: value.
+	    			value := value + step]]
 !
 
-deepCopy
-	^self
+to: stop do: aBlock
+	"Evaluate aBlock for each number from self to aNumber."
+	| nextValue |
+	nextValue := self.
+	[nextValue <= stop]
+		whileTrue: 
+			[aBlock value: nextValue.
+			nextValue := nextValue + 1]
 ! !
 
-!UndefinedObject methodsFor: 'printing'!
+!Number methodsFor: 'printing'!
+
+printShowingDecimalPlaces: placesDesired
+	<return self.toFixed(placesDesired)>
+!
 
 printString
-    ^'nil'
+	<return String(self)>
 ! !
 
-!UndefinedObject methodsFor: 'testing'!
+!Number methodsFor: 'testing'!
 
-ifNil: aBlock
-	"inlined in the Compiler"
-	^self ifNil: aBlock ifNotNil: []
+even
+	^ 0 = (self \\ 2)
 !
 
-ifNotNil: aBlock
-	"inlined in the Compiler"
-	^self
+isNumber
+	^true
 !
 
-ifNil: aBlock ifNotNil: anotherBlock
-	"inlined in the Compiler"
-	^aBlock value
+isZero
+	^self = 0
 !
 
-ifNotNil: aBlock ifNil: anotherBlock
-	"inlined in the Compiler"
-	^anotherBlock value
-!
+negative
+	"Answer whether the receiver is mathematically negative."
 
-isNil
-	^true
+	^ self < 0
 !
 
-notNil
-	^false
-! !
+odd
+	^ self even not
+!
 
-!UndefinedObject class methodsFor: 'instance creation'!
+positive
+	"Answer whether the receiver is positive or equal to 0. (ST-80 protocol)."
 
-new
-	    self error: 'You cannot create new instances of UndefinedObject. Use nil'
+	^ self >= 0
 ! !
 
-Object subclass: #Date
-	instanceVariableNames: ''
-	category: 'Kernel-Objects'!
-!Date commentStamp!
-The Date class is used to work with dates and times. Therefore `Date today` and `Date now` are both valid in
-Amber and answer the same date object.
+!Number methodsFor: 'timeouts/intervals'!
 
-Date wraps the `Date()` JavaScript constructor, and Smalltalk date objects are JavaScript date objects.!
+clearInterval
+	<clearInterval(Number(self))>
+!
 
-!Date methodsFor: 'accessing'!
+clearTimeout
+	<clearTimeout(Number(self))>
+! !
 
-year
-	<return self.getFullYear()>
-!
+!Number class methodsFor: 'instance creation'!
 
-month
-	<return self.getMonth() + 1>
-!
+pi
+	<return Math.PI>
+! !
 
-month: aNumber
-	<self.setMonth(aNumber - 1)>
-!
+Object subclass: #Package
+	instanceVariableNames: 'commitPathJs commitPathSt'
+	package: 'Kernel-Objects'!
+!Package commentStamp!
+A Package is similar to a "class category" typically found in other Smalltalks like Pharo or Squeak. Amber does not have class categories anymore, it had in the beginning but now each class in the system knows which package it belongs to.
+
+A Package has a name, an Array of "requires", a comment and a Dictionary with other optional key value attributes. A Package can also be queried for its classes, but it will then resort to a reverse scan of all classes to find them.
+Packages are manipulated through "Smalltalk current", like for example finding one based on a name:
 
-day
-	^self dayOfWeek
-!
+	Smalltalk current packageAt: 'Kernel'
 
-dayOfWeek
-	<return self.getDay() + 1>
-!
+...but you can also use:
 
-dayOfWeek: aNumber
-	<return self.setDay(aNumber - 1)>
-!
+	Package named: 'Kernel'
 
-day: aNumber
-	self day: aNumber
-!
+A Package differs slightly from a Monticello package which can span multiple class categories using a naming convention based on hyphenation. But just as in Monticello a Package supports "class extensions" so a Package
+can define behaviors in foreign classes using a naming convention for method categories where the category starts with an asterisk and then the name of the owning package follows. This can easily be seen in for example class
+String where the method category "*IDE" defines #inspectOn: which thus is a method belonging to the IDE package.
 
-year: aNumber
-	<self.setFullYear(aNumber)>
-!
+You can fetch a package from the server:
 
-dayOfMonth
-	<return self.getDate()>
-!
+	Package fetch: 'Additional-Examples'!
 
-dayOfMonth: aNumber
-	<self.setDate(aNumber)>
-!
+!Package methodsFor: 'accessing'!
 
-time
-	<return self.getTime()>
+commitPathJs
+	^ commitPathJs ifNil: [self class defaultCommitPathJs]
 !
 
-time: aNumber
-	<self.setTime(aNumber)>
+commitPathJs: aString
+	commitPathJs := aString
 !
 
-hours: aNumber
-	<self.setHours(aNumber)>
+commitPathSt
+	^ commitPathSt ifNil: [self class defaultCommitPathSt]
 !
 
-minutes: aNumber
-	<self.setMinutes(aNumber)>
+commitPathSt: aString
+	commitPathSt := aString
 !
 
-seconds: aNumber
-	<self.setSeconds(aNumber)>
+dependencies
+	^self propertyAt: 'dependencies' ifAbsent: [#()]
 !
 
-milliseconds: aNumber
-	<self.setMilliseconds(aNumber)>
+dependencies: anArray
+	^self propertyAt: 'dependencies' put: anArray
 !
 
-hours
-	<return self.getHours()>
+name
+	<return self.pkgName>
 !
 
-minutes
-	<return self.getMinutes()>
+name: aString
+	<self.pkgName = aString>
 !
 
-seconds
-	<return self.getSeconds()>
+properties
+	^Smalltalk current readJSObject: (self basicAt: 'properties')
 !
 
-milliseconds
-	<return self.getMilliseconds()>
+properties: aDict
+	"We store it as a javascript object."
+	
+	| object |
+	<object = {};>.
+	aDict keysAndValuesDo: [:key :value |
+		<object[key] = value>.
+	].
+	<return self.properties = object>
 ! !
 
-!Date methodsFor: 'arithmetic'!
+!Package methodsFor: 'classes'!
 
-- aDate
-	<return self - aDate>
+classes
+	"We need to do a reverse scan."
+	^Smalltalk current classes select: [:c | c package == self]
 !
 
-+ aDate
-	<return self + aDate>
+sortedClasses
+	"Answer all classes in the receiver, sorted by superclass/subclasses and by class name for common subclasses (Issue #143)"
+
+	^self class sortedClasses: self classes
 ! !
 
-!Date methodsFor: 'comparing'!
+!Package methodsFor: 'printing'!
 
-< aDate
-	<return self < aDate>
-!
+printString
+	^self name
+! !
 
-> aDate
-	<return self >> aDate>
+!Package methodsFor: 'private'!
+
+jsProperties
+	<return self.properties>
 !
 
-<= aDate
-	<return self <= aDate>
+jsProperties: aJSObject
+	<return self.properties = aJSObject>
 !
 
->= aDate
-	<return self >>= aDate>
+propertiesAsJSON
+	<return JSON.stringify(self.properties)>
 ! !
 
-!Date methodsFor: 'converting'!
-
-asString
-	<return self.toString()>
-!
+!Package methodsFor: 'properties'!
 
-asMilliseconds
-	^self time
-!
+propertyAt: key
 
-asDateString
-	<return self.toDateString()>
+	<return self.properties[key]>
 !
 
-asTimeString
-	<return self.toTimeString()>
-!
+propertyAt: key ifAbsent: block
 
-asLocaleString
-	<return self.toLocaleString()>
+	^(self propertyAt: key) ifNil: [block value]
 !
 
-asNumber
-	^self asMilliseconds
-! !
-
-!Date methodsFor: 'printing'!
+propertyAt: key put: value
 
-printString
-	^self asString
+	<return self.properties[key] = value>
 ! !
 
-!Date class methodsFor: 'instance creation'!
-
-new: anObject
-	<return new Date(anObject)>
-!
+Package class instanceVariableNames: 'defaultCommitPathJs defaultCommitPathSt'!
 
-fromString: aString
-	"Example: Date fromString('2011/04/15 00:00:00')"
-	^self new: aString
-!
+!Package class methodsFor: 'commit paths'!
 
-fromSeconds: aNumber
-	^self fromMilliseconds: aNumber * 1000
+defaultCommitPathJs
+	^ defaultCommitPathJs ifNil: [ defaultCommitPathJs := 'js']
 !
 
-fromMilliseconds: aNumber
-	^self new: aNumber
+defaultCommitPathJs: aString
+	defaultCommitPathJs := aString
 !
 
-today
-	^self new
+defaultCommitPathSt
+	^ defaultCommitPathSt ifNil: [ defaultCommitPathSt := 'st']
 !
 
-now
-	^self today
+defaultCommitPathSt: aString
+	defaultCommitPathSt := aString
 !
 
-millisecondsToRun: aBlock
-	| t |
-	t := Date now.
-	aBlock value.
-	^Date now - t
+resetCommitPaths
+        defaultCommitPathJs := nil.
+        defaultCommitPathSt := nil.
 ! !
 
-Object subclass: #JSObjectProxy
-	instanceVariableNames: 'jsObject'
-	category: 'Kernel-Objects'!
-!JSObjectProxy commentStamp!
-JSObjectProxy handles sending messages to JavaScript object, therefore accessing JavaScript objects from Amber is transparent.
-JSOjbectProxy makes intensive use of `#doesNotUnderstand:`.
-
-## Examples
-
-JSObjectProxy objects are instanciated by Amber when a Smalltalk message is sent to a JavaScript object.
-
-    window alert: 'hello world'.
-    window inspect.
-    (window jQuery: 'body') append: 'hello world'
-
-Smalltalk messages sends are converted to JavaScript function calls or object property access _(in this order)_. If n one of them match, a `MessageNotUnderstood` error will be thrown. 
-
-## Message conversion rules
-
-- `someUser name` becomes  `someUser.name`
-- `someUser name: 'John'` becomes `someUser name = "John"`
-- `console log: 'hello world'` becomes `console.log('hello world')`
-- `(window jQuery: 'foo') css: 'background' color: 'red'` becomes `window.jQuery('foo').css('background', 'red')`
-
-__Note:__ For keyword-based messages, only the first keyword is kept: `window foo: 1 bar: 2` is equivalent to `window foo: 1 baz: 2`.!
-
-!JSObjectProxy methodsFor: 'accessing'!
+!Package class methodsFor: 'loading-storing'!
 
-jsObject: aJSObject
-	jsObject := aJSObject
+commitToLocalStorage: aPackageName
+	| key sourceCode |
+	key := 'smalltalk.packages.' , aPackageName.
+	sourceCode := Exporter new exportPackage: aPackageName.
+	<localStorage[key] = escape(sourceCode)>
 !
 
-jsObject
-	^jsObject
+fetch: aPackageName
+	self fetch: aPackageName prefix: self defaultCommitPathJs, '/'
 !
 
-at: aSymbol
-	| attr |
-	attr := aSymbol asString.
-	<return self['@jsObject'][attr]>
+fetch: aPackageName prefix: aPrefix
+	jQuery getScript: (aPrefix , aPackageName , '.js') onSuccess: [ Package init: aPackageName ]
 !
 
-at: aSymbol put: anObject
-	| attr |
-	attr := aSymbol asString.
-	<self['@jsObject'][attr] = anObject>
+init: aPackageName
+	(smalltalk classes select: [ :each | <each.pkg.pkgName == aPackageName> ])
+		do: [ :each | <smalltalk.init(each)> ];
+		do: [ :each | each initialize ]
 ! !
 
-!JSObjectProxy methodsFor: 'proxy'!
+!Package class methodsFor: 'not yet classified'!
 
-printString
-	^self jsObject toString
-!
+named: aPackageName
 
-inspectOn: anInspector
-	| variables |
-	variables := Dictionary new.
-	variables at: '#self' put: self jsObject.
-	anInspector setLabel: self printString.
-	<for(var i in self['@jsObject']) {
-		variables._at_put_(i, self['@jsObject'][i]);
-	}>.
-	anInspector setVariables: variables
+	^Smalltalk current packageAt: aPackageName
 !
 
-doesNotUnderstand: aMessage
-	| obj selector jsSelector arguments |
-	obj := self jsObject.
-	selector := aMessage selector.
-	jsSelector := selector asJavaScriptSelector.
-	arguments := aMessage arguments.
-	<if(obj[jsSelector] !!= undefined) {return smalltalk.send(obj, jsSelector, arguments)}>.
-	super doesNotUnderstand: aMessage
+named: aPackageName ifAbsent: aBlock
+
+	^Smalltalk current packageAt: aPackageName ifAbsent: aBlock
 ! !
 
-!JSObjectProxy class methodsFor: 'instance creation'!
+!Package class methodsFor: 'sorting'!
+
+sortedClasses: classes
+	"Answer classes, sorted by superclass/subclasses and by class name for common subclasses (Issue #143)"
 
-on: aJSObject
-	^self new
-		jsObject: aJSObject;
-		yourself
+	| children others nodes expandedClasses |
+	children := #().
+	others := #().
+	classes do: [:each |
+		(classes includes: each superclass)
+			ifFalse: [children add: each]
+			ifTrue: [others add: each]].
+	nodes := children collect: [:each |
+		ClassSorterNode on: each classes: others level: 0].
+	nodes := nodes sorted: [:a :b | a theClass name <= b theClass name ].
+	expandedClasses := Array new.
+	nodes do: [:aNode |
+		aNode traverseClassesWith: expandedClasses].
+	^expandedClasses
 ! !
 
 Object subclass: #Point
 	instanceVariableNames: 'x y'
-	category: 'Kernel-Objects'!
+	package: 'Kernel-Objects'!
 !Point commentStamp!
 A `Point` represents an x-y pair of numbers usually designating a geometric coordinate.
 Points are traditionally created using the binary `#@` message to a number:
@@ -1600,16 +1371,16 @@ x
 	^x
 !
 
+x: aNumber
+	x := aNumber
+!
+
 y
 	^y
 !
 
 y: aNumber
 	y := aNumber
-!
-
-x: aNumber
-	x := aNumber
 ! !
 
 !Point methodsFor: 'arithmetic'!
@@ -1673,7 +1444,7 @@ x: aNumber y: anotherNumber
 
 Object subclass: #Random
 	instanceVariableNames: ''
-	category: 'Kernel-Objects'!
+	package: 'Kernel-Objects'!
 !Random commentStamp!
 `Random` is a random number generator and is implemented as a trivial wrapper around javascript `Math.random()` and is used like this:
 
@@ -1711,3 +1482,248 @@ next: anInteger
     ^(1 to: anInteger) collect: [:each | self next]
 ! !
 
+Object subclass: #Smalltalk
+	instanceVariableNames: ''
+	package: 'Kernel-Objects'!
+!Smalltalk commentStamp!
+Smalltalk has only one instance, accessed with `Smalltalk current`. 
+It represents the global JavaScript variable `smalltalk` declared in `js/boot.js`.
+
+The `smalltalk` object holds all class and packages defined in the system.
+
+## Classes
+
+Classes can be accessed using the following methods:
+
+- `#classes` answers the full list of Smalltalk classes in the system
+- `#at:` answers a specific class of `nil`
+
+## Packages
+
+Packages can be accessed using the following methods:
+
+- `#packages` answers the full list of packages
+- `#packageAt:` answers a specific class of `nil`
+
+__note:__ classes and packages are accessed using strings, not symbols
+
+## Parsing
+
+The `#parse:` method is used to parse Smalltalk source code. 
+It requires the `Compiler` package and the `js/parser.js` parser file in order to work!
+
+!Smalltalk methodsFor: 'accessing'!
+
+at: aString
+	<return self[aString]>
+!
+
+basicParse: aString
+	<return smalltalk.parser.parse(aString)>
+!
+
+classes
+	<return self.classes()>
+!
+
+parse: aString
+	| result | 
+	self try: [result := self basicParse: aString] catch: [:ex | (self parseError: ex parsing: aString) signal].
+	^result
+!
+
+parseError: anException parsing: aString
+	| row col message lines badLine code |
+	<row = anException.line;
+	col = anException.column;
+	message = anException.message;>.
+	lines := aString lines.
+	badLine := lines at: row.
+	badLine := (badLine copyFrom: 1 to: col - 1), ' ===>', (badLine copyFrom:  col to: badLine size).
+	lines at: row put: badLine.
+	code := String streamContents: [:s |
+                  lines withIndexDo: [:l :i |
+                     s nextPutAll: i asString, ': ', l, String lf]].
+	^ Error new messageText: ('Parse error on line ' , row , ' column ' , col , ' : ' , message , ' Below is code with line numbers and ===> marker inserted:' , String lf, code)
+!
+
+readJSObject: anObject
+	<return self.readJSObject(anObject)>
+!
+
+reservedWords
+	"JavaScript reserved words"
+	<return self.reservedWords>
+!
+
+send: aSelector to: anObject arguments: aCollection
+	| selector |
+	selector := aSelector asString asSelector.
+	<self.send(anObject, selector, aCollection)>
+! !
+
+!Smalltalk methodsFor: 'classes'!
+
+removeClass: aClass
+	aClass isMetaclass ifTrue: [self error: aClass asString, ' is a Metaclass and cannot be removed!!'].
+	aClass methodDictionary values do: [:each |
+		aClass removeCompiledMethod: each].
+	aClass class methodDictionary values do: [:each |
+		aClass class removeCompiledMethod: each].
+	self basicDelete: aClass name
+! !
+
+!Smalltalk methodsFor: 'packages'!
+
+packageAt: packageName
+       <return self.packages[packageName]>
+!
+
+packageAt: packageName ifAbsent: aBlock
+       ^(self packageAt: packageName) ifNil: aBlock
+!
+
+packages
+	"Return all Package instances in the system."
+
+	<return self.packages.all()>
+!
+
+removePackage: packageName
+	"Removes a package and all its classes."
+
+	| pkg |
+	pkg := self packageAt: packageName ifAbsent: [self error: 'Missing package: ', packageName].
+	pkg classes do: [:each |
+        	self removeClass: each].
+	self deletePackage: packageName
+!
+
+renamePackage: packageName to: newName
+	"Rename a package."
+
+	| pkg |
+	pkg := self packageAt: packageName ifAbsent: [self error: 'Missing package: ', packageName].
+	(self packageAt: newName) ifNotNil: [self error: 'Already exists a package called: ', newName].
+	<smalltalk.packages[newName] = smalltalk.packages[packageName]>.
+	pkg name: newName.
+	self deletePackage: packageName.
+! !
+
+!Smalltalk methodsFor: 'private'!
+
+createPackage: packageName
+	"Create and bind a new package with given name and return it."
+
+      <return smalltalk.addPackage(packageName, nil)>
+!
+
+createPackage: packageName properties: aDict
+	"Create and bind a new package with given name and return it."
+
+	| object |
+	<object = {};>.
+	aDict keysAndValuesDo: [:key :value |
+		<object[key] = value>.
+	].
+       <return smalltalk.addPackage(packageName, object)>
+!
+
+deletePackage: packageName
+	"Deletes a package by deleting its binding, but does not check if it contains classes etc.
+	To remove a package, use #removePackage instead."
+
+       <delete smalltalk.packages[packageName]>
+! !
+
+Smalltalk class instanceVariableNames: 'current'!
+
+!Smalltalk class methodsFor: 'accessing'!
+
+current
+	<return smalltalk>
+! !
+
+Object subclass: #UndefinedObject
+	instanceVariableNames: ''
+	package: 'Kernel-Objects'!
+!UndefinedObject commentStamp!
+UndefinedObject describes the behavior of its sole instance, `nil`. `nil` represents a prior value for variables that have not been initialized, or for results which are meaningless.
+
+`nil` is the Smalltalk representation of the `undefined` JavaScript object.!
+
+!UndefinedObject methodsFor: 'class creation'!
+
+subclass: aString instanceVariableNames: anotherString
+	^self subclass: aString instanceVariableNames: anotherString package: nil
+!
+
+subclass: aString instanceVariableNames: aString2 category: aString3
+	"Kept for compatibility."
+	self deprecatedAPI.
+	^self subclass: aString instanceVariableNames: aString2 package: aString3
+!
+
+subclass: aString instanceVariableNames: aString2 package: aString3
+	^ClassBuilder new
+	    superclass: self subclass: aString instanceVariableNames: aString2 package: aString3
+! !
+
+!UndefinedObject methodsFor: 'converting'!
+
+asJSON
+	^null
+! !
+
+!UndefinedObject methodsFor: 'copying'!
+
+deepCopy
+	^self
+!
+
+shallowCopy
+	^self
+! !
+
+!UndefinedObject methodsFor: 'printing'!
+
+printString
+    ^'nil'
+! !
+
+!UndefinedObject methodsFor: 'testing'!
+
+ifNil: aBlock
+	"inlined in the Compiler"
+	^self ifNil: aBlock ifNotNil: []
+!
+
+ifNil: aBlock ifNotNil: anotherBlock
+	"inlined in the Compiler"
+	^aBlock value
+!
+
+ifNotNil: aBlock
+	"inlined in the Compiler"
+	^self
+!
+
+ifNotNil: aBlock ifNil: anotherBlock
+	"inlined in the Compiler"
+	^anotherBlock value
+!
+
+isNil
+	^true
+!
+
+notNil
+	^false
+! !
+
+!UndefinedObject class methodsFor: 'instance creation'!
+
+new
+	    self error: 'You cannot create new instances of UndefinedObject. Use nil'
+! !
+
diff --git a/amber/src/st/Kernel-Tests.st b/amber/src/st/Kernel-Tests.st
index 79513cd141e..0e49e6978bc 100644
--- a/amber/src/st/Kernel-Tests.st
+++ b/amber/src/st/Kernel-Tests.st
@@ -1,7 +1,7 @@
 Smalltalk current createPackage: 'Kernel-Tests' properties: #{}!
 TestCase subclass: #ArrayTest
 	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
+	package: 'Kernel-Tests'!
 
 !ArrayTest methodsFor: 'testing'!
 
@@ -13,84 +13,193 @@ testIfEmpty
 	self assert: 'zork' equals: ( '' ifEmpty: ['zork'] )
 ! !
 
-TestCase subclass: #StringTest
+TestCase subclass: #BlockClosureTest
 	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
+	package: 'Kernel-Tests'!
 
-!StringTest methodsFor: 'tests'!
+!BlockClosureTest methodsFor: 'tests'!
 
-testJoin
-	self assert: 'hello,world' equals: (',' join: #('hello' 'world'))
+testCompiledSource
+	self assert: ([1+1] compiledSource includesSubString: 'function')
 !
 
-testStreamContents
-	self 
-		assert: 'hello world' 
-		equals: (String streamContents: [:aStream| aStream 
-                                                 					nextPutAll: 'hello'; space; 
-                                                 					nextPutAll: 'world'])
+testEnsure
+	self assert: ([Error new] ensure: [true])
 !
 
-testIncludesSubString
-	self assert: ('amber' includesSubString: 'ber').
-	self deny: ('amber' includesSubString: 'zork').
+testNumArgs
+	self assert: [] numArgs equals: 0.
+	self assert: [:a :b | ] numArgs equals: 2
+!
+
+testOnDo
+	self assert: ([Error new signal] on: Error do: [:ex | true])
+!
+
+testValue
+	self assert: ([1+1] value) equals: 2.
+	self assert: ([:x | x +1] value: 2) equals: 3.
+	self assert: ([:x :y | x*y] value: 2 value: 4) equals: 8. 
+
+	"Arguments are optional in Amber. This isn't ANSI compliant."
+
+	self assert: ([:a :b :c | 1] value) equals: 1
+!
+
+testValueWithPossibleArguments
+	self assert: ([1] valueWithPossibleArguments: #(3 4)) equals: 1.
+	self assert: ([:a | a + 4] valueWithPossibleArguments: #(3 4)) equals: 7.
+	self assert: ([:a :b | a + b] valueWithPossibleArguments: #(3 4 5)) equals: 7.
+!
+
+testWhileFalse
+	| i |
+	i := 0.
+	[i > 5] whileFalse: [i := i + 1].
+	self assert: i equals: 6.
+
+	i := 0.
+	[i := i + 1. i > 5] whileFalse.
+	self assert: i equals: 6
 !
 
+testWhileTrue
+	| i |
+	i := 0.
+	[i < 5] whileTrue: [i := i + 1].
+	self assert: i equals: 5.
+
+	i := 0.
+	[i := i + 1. i < 5] whileTrue.
+	self assert: i equals: 5
+! !
+
+TestCase subclass: #BooleanTest
+	instanceVariableNames: ''
+	package: 'Kernel-Tests'!
+
+!BooleanTest methodsFor: 'tests'!
+
 testEquality
-	self assert: 'hello' = 'hello'.
-	self deny: 'hello' = 'world'.
+	"We're on top of JS...just be sure to check the basics!!"
 
-	self assert: 'hello'  = 'hello' yourself.
-	self assert: 'hello' yourself = 'hello'.
+	self deny: 0 = false. 
+	self deny: false = 0.
+	self deny: '' = false.
+	self deny: false = ''.
 
-	"test JS falsy value"
-	self deny: '' = 0
+	self assert: true = true.
+	self deny: false = true.
+	self deny: true = false.
+	self assert: false = false.
+
+	"JS may do some type coercing after sending a message"
+	self assert: true yourself = true.
+	self assert: true yourself = true yourself
 !
 
-testCopyWithoutAll
-	self 
-		assert: 'hello world' 
-		equals: ('*hello* *world*' copyWithoutAll: '*')
+testIfTrueIfFalse
+ 
+	self assert: (true ifTrue: ['alternative block']) = 'alternative block'.
+	self assert: (true ifFalse: ['alternative block']) = nil.
+
+	self assert: (false ifTrue: ['alternative block']) = nil.
+	self assert: (false ifFalse: ['alternative block']) = 'alternative block'.
+
+	self assert: (false ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block2'.
+	self assert: (false ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block'.
+
+	self assert: (true ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block'.
+	self assert: (true ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block2'.
 !
 
-testAt
-	self assert: ('hello' at: 1) = 'h'.
-	self assert: ('hello' at: 5) = 'o'.
-	self assert: ('hello' at: 6 ifAbsent: [nil]) = nil
+testLogic
+ 
+	"Trivial logic table"
+	self assert: (true & true); deny: (true & false); deny: (false & true); deny: (false & false).
+	self assert: (true | true); assert: (true | false); assert: (false | true); deny: (false | false).
+        "Checking that expressions work fine too"
+	self assert: (true & (1 > 0)); deny: ((1 > 0) & false); deny: ((1 > 0) & (1 > 2)).
+        self assert: (false | (1 > 0)); assert: ((1 > 0) | false); assert: ((1 > 0) | (1 > 2))
 !
 
-testAtPut
-	"String instances are read-only"
-	self should: ['hello' at: 1 put: 'a'] raise: Error
+testLogicKeywords
+ 
+	"Trivial logic table"
+	self 
+		assert: (true and: [ true]); 
+		deny: (true and: [ false ]); 
+		deny: (false and: [ true ]); 
+		deny: (false and: [ false ]).
+	self 
+		assert: (true or: [ true ]); 
+		assert: (true or: [ false ]); 
+		assert: (false or: [ true ]); 
+		deny: (false or: [ false ]).
+        
+	"Checking that expressions work fine too"
+	self 
+		assert: (true and: [ 1 > 0 ]); 
+		deny: ((1 > 0) and: [ false ]); 
+		deny: ((1 > 0) and: [ 1 > 2 ]).
+        self 
+		assert: (false or: [ 1 > 0 ]); 
+		assert: ((1 > 0) or: [ false ]); 
+		assert: ((1 > 0) or: [ 1 > 2 ])
+! !
+
+TestCase subclass: #ClassBuilderTest
+	instanceVariableNames: 'builder theClass'
+	package: 'Kernel-Tests'!
+
+!ClassBuilderTest methodsFor: 'running'!
+
+setUp
+	builder := ClassBuilder new
 !
 
-testSize
-	self assert: 'smalltalk' size equals: 9.
-	self assert: '' size equals: 0
+tearDown
+	theClass ifNotNil: [Smalltalk current removeClass: theClass. theClass := nil]
 !
 
-testAddRemove
-	self should: ['hello' add: 'a'] raise: Error.
-	self should: ['hello' remove: 'h'] raise: Error
+testClassCopy
+	theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.
+	self assert: theClass superclass == ObjectMock superclass.
+	self assert: theClass instanceVariableNames == ObjectMock instanceVariableNames.
+	self assert: theClass name equals: 'ObjectMock2'.
+	self assert: theClass package == ObjectMock package.
+	self assert: theClass methodDictionary keys equals: ObjectMock methodDictionary keys
 !
 
-testAsArray
-	self assert: 'hello' asArray = #('h' 'e' 'l' 'l' 'o').
+testInstanceVariableNames
+	self assert: (builder instanceVariableNamesFor: '  hello   world   ') equals: #('hello' 'world')
 ! !
 
 TestCase subclass: #DictionaryTest
 	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
+	package: 'Kernel-Tests'!
 
 !DictionaryTest methodsFor: 'tests'!
 
-testPrintString
-	self
-		assert: 'a Dictionary(''firstname'' -> ''James'' , ''lastname'' -> ''Bond'')' 
-		equals: (Dictionary new 
-                         	at:'firstname' put: 'James';
-                        	at:'lastname' put: 'Bond';
-                        	printString)
+testAccessing
+	| d |
+
+	d := Dictionary new.
+
+	d at: 'hello' put: 'world'.
+	self assert: (d at: 'hello') = 'world'.
+	self assert: (d at: 'hello' ifAbsent: [nil]) = 'world'.
+	self deny: (d at: 'foo' ifAbsent: [nil]) = 'world'.
+
+	d at: 1 put: 2.
+	self assert: (d at: 1) = 2.
+
+	d at: 1@3 put: 3.
+	self assert: (d at: 1@3) = 3
+!
+
+testDynamicDictionaries
+	self assert: #{'hello' -> 1} asDictionary = (Dictionary with: 'hello' -> 1)
 !
 
 testEquality
@@ -112,25 +221,60 @@ testEquality
 	self deny: d1 = d2.
 !
 
-testDynamicDictionaries
-	self assert: #{'hello' -> 1} asDictionary = (Dictionary with: 'hello' -> 1)
-!
-
-testAccessing
+testKeys
 	| d |
 
 	d := Dictionary new.
+	d at: 1 put: 2.
+	d at: 2 put: 3.
+	d at: 3 put: 4.
 
-	d at: 'hello' put: 'world'.
-	self assert: (d at: 'hello') = 'world'.
-	self assert: (d at: 'hello' ifAbsent: [nil]) = 'world'.
-	self deny: (d at: 'foo' ifAbsent: [nil]) = 'world'.
+	self assert: d keys = #(1 2 3)
+!
 
-	d at: 1 put: 2.
-	self assert: (d at: 1) = 2.
+testPrintString
+	self
+		assert: 'a Dictionary(''firstname'' -> ''James'' , ''lastname'' -> ''Bond'')' 
+		equals: (Dictionary new 
+                         	at:'firstname' put: 'James';
+                        	at:'lastname' put: 'Bond';
+                        	printString)
+!
 
-	d at: 1@3 put: 3.
-	self assert: (d at: 1@3) = 3
+testRemoveKey
+    | d key |
+
+    d := Dictionary new.
+    d at: 1 put: 2.
+    d at: 2 put: 3.
+    d at: 3 put: 4.
+
+    key := 2.
+
+    self assert: d keys = #(1 2 3).
+
+    d removeKey: key.
+    self assert: d keys = #(1 3).
+    self assert: d values = #(2 4).
+    self deny: (d includesKey: 2)
+!
+
+testRemoveKeyIfAbsent
+    | d key |
+
+    d := Dictionary new.
+    d at: 1 put: 2.
+    d at: 2 put: 3.
+    d at: 3 put: 4.
+
+    key := 2.
+    self assert: (d removeKey: key) = 3.
+
+    key := 3.
+    self assert: (d removeKey: key ifAbsent: [42]) = 4.
+
+    key := 'why'.
+    self assert: (d removeKey: key ifAbsent: [42] ) = 42.
 !
 
 testSize
@@ -155,130 +299,71 @@ testValues
 	d at: 3 put: 4.
 
 	self assert: d values = #(2 3 4)
-!
+! !
 
-testKeys
-	| d |
+TestCase subclass: #JSObjectProxyTest
+	instanceVariableNames: ''
+	package: 'Kernel-Tests'!
 
-	d := Dictionary new.
-	d at: 1 put: 2.
-	d at: 2 put: 3.
-	d at: 3 put: 4.
+!JSObjectProxyTest methodsFor: 'accessing'!
 
-	self assert: d keys = #(1 2 3)
+jsObject
+	<return jsObject = {a: 1, b: function() {return 2;}, c: function(object) {return object;}}>
 ! !
 
-TestCase subclass: #BooleanTest
-	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
+!JSObjectProxyTest methodsFor: 'tests'!
 
-!BooleanTest methodsFor: 'tests'!
+testDNU
+	self should: [self jsObject foo] raise: MessageNotUnderstood
+!
 
-testLogic
- 
-	"Trivial logic table"
-	self assert: (true & true); deny: (true & false); deny: (false & true); deny: (false & false).
-	self assert: (true | true); assert: (true | false); assert: (false | true); deny: (false | false).
-        "Checking that expressions work fine too"
-	self assert: (true & (1 > 0)); deny: ((1 > 0) & false); deny: ((1 > 0) & (1 > 2)).
-        self assert: (false | (1 > 0)); assert: ((1 > 0) | false); assert: ((1 > 0) | (1 > 2))
-!
+testMessageSend
 
-testEquality
-	"We're on top of JS...just be sure to check the basics!!"
+	self assert: self jsObject a equals: 1.
+	self assert: self jsObject b equals: 2.
+	self assert: (self jsObject c: 3) equals: 3
+!
 
-	self deny: 0 = false. 
-	self deny: false = 0.
-	self deny: '' = false.
-	self deny: false = ''.
+testMethodWithArguments
+	self deny: ('body' asJQuery hasClass: 'amber').
 
-	self assert: true = true.
-	self deny: false = true.
-	self deny: true = false.
-	self assert: false = false.
+	'body' asJQuery addClass: 'amber'.
+	self assert: ('body' asJQuery hasClass: 'amber').
 
-	"JS may do some type coercing after sending a message"
-	self assert: true yourself = true.
-	self assert: true yourself = true yourself
+	'body' asJQuery removeClass: 'amber'.
+	self deny: ('body' asJQuery hasClass: 'amber').
 !
 
-testLogicKeywords
- 
-	"Trivial logic table"
-	self 
-		assert: (true and: [ true]); 
-		deny: (true and: [ false ]); 
-		deny: (false and: [ true ]); 
-		deny: (false and: [ false ]).
-	self 
-		assert: (true or: [ true ]); 
-		assert: (true or: [ false ]); 
-		assert: (false or: [ true ]); 
-		deny: (false or: [ false ]).
-        
-	"Checking that expressions work fine too"
-	self 
-		assert: (true and: [ 1 > 0 ]); 
-		deny: ((1 > 0) and: [ false ]); 
-		deny: ((1 > 0) and: [ 1 > 2 ]).
-        self 
-		assert: (false or: [ 1 > 0 ]); 
-		assert: ((1 > 0) or: [ false ]); 
-		assert: ((1 > 0) or: [ 1 > 2 ])
+testPrinting
+	self assert: self jsObject printString = '[object Object]'
 !
 
-testIfTrueIfFalse
- 
-	self assert: (true ifTrue: ['alternative block']) = 'alternative block'.
-	self assert: (true ifFalse: ['alternative block']) = nil.
+testPropertyThatReturnsEmptyString
+	<document.location.hash = ''>.
+	self assert: '' equals: document location hash.
 
-	self assert: (false ifTrue: ['alternative block']) = nil.
-	self assert: (false ifFalse: ['alternative block']) = 'alternative block'.
+	document location hash: 'test'.
+	self assert: '#test' equals: document location hash.
+!
 
-	self assert: (false ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block2'.
-	self assert: (false ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block'.
+testYourself
+	|body|
+	body := 'body' asJQuery
+				addClass: 'amber';
+				yourself.
 
-	self assert: (true ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block'.
-	self assert: (true ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block2'.
+	self assert: (body hasClass: 'amber').
+
+	body removeClass: 'amber'.
+	self deny: (body hasClass: 'amber').
 ! !
 
 TestCase subclass: #NumberTest
 	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
+	package: 'Kernel-Tests'!
 
 !NumberTest methodsFor: 'tests'!
 
-testPrintShowingDecimalPlaces
-	self assert: '23.00' equals: (23 printShowingDecimalPlaces: 2).
-	self assert: '23.57' equals: (23.5698 printShowingDecimalPlaces: 2).
-	self assert: '-234.56700' equals:( 234.567 negated printShowingDecimalPlaces: 5).
-	self assert: '23' equals: (23.4567 printShowingDecimalPlaces: 0).
-	self assert: '24' equals: (23.5567 printShowingDecimalPlaces: 0).
-	self assert: '-23' equals: (23.4567 negated printShowingDecimalPlaces: 0).
-	self assert: '-24' equals: (23.5567 negated printShowingDecimalPlaces: 0).
-	self assert: '100000000.0' equals: (100000000 printShowingDecimalPlaces: 1).
-	self assert: '0.98000' equals: (0.98 printShowingDecimalPlaces: 5).
-	self assert: '-0.98' equals: (0.98 negated printShowingDecimalPlaces: 2).
-	self assert: '2.57' equals: (2.567 printShowingDecimalPlaces: 2).
-	self assert: '-2.57' equals: (-2.567 printShowingDecimalPlaces: 2).
-	self assert: '0.00' equals: (0 printShowingDecimalPlaces: 2).
-!
-
-testEquality
-	self assert: 1 = 1.
-	self assert: 0 = 0.
-	self deny: 1 = 0.
-
-	self assert: 1 yourself = 1.
-	self assert: 1 = 1 yourself.
-	self assert: 1 yourself = 1 yourself.
-	
-	self deny: 0 = false.
-	self deny: false = 0.
-	self deny: '' = 0.
-	self deny: 0 = ''
-!
-
 testArithmetic
 	
 	"We rely on JS here, so we won't test complex behavior, just check if 
@@ -296,18 +381,6 @@ testArithmetic
 	self assert: 1 + (2 * 3) = 7
 !
 
-testRounded
-	
-	self assert: 3 rounded = 3.
-	self assert: 3.212 rounded = 3.
-	self assert: 3.51 rounded = 4
-!
-
-testNegated
-	self assert: 3 negated = -3.
-	self assert: -3 negated = 3
-!
-
 testComparison
 
 	self assert: 3 > 2.
@@ -322,22 +395,24 @@ testComparison
 	self assert: 3 <= 3.1
 !
 
-testTruncated
-	
-	self assert: 3 truncated = 3.
-	self assert: 3.212 truncated = 3.
-	self assert: 3.51 truncated = 3
-!
-
 testCopying
 	self assert: 1 copy == 1.
 	self assert: 1 deepCopy == 1
 !
 
-testMinMax
+testEquality
+	self assert: 1 = 1.
+	self assert: 0 = 0.
+	self deny: 1 = 0.
+
+	self assert: 1 yourself = 1.
+	self assert: 1 = 1 yourself.
+	self assert: 1 yourself = 1 yourself.
 	
-	self assert: (2 max: 5) equals: 5.
-	self assert: (2 min: 5) equals: 2
+	self deny: 0 = false.
+	self deny: false = 0.
+	self deny: '' = 0.
+	self deny: 0 = ''
 !
 
 testIdentity
@@ -352,258 +427,139 @@ testIdentity
 	self deny: 1 == 2
 !
 
-testSqrt
-	
-	self assert: 4 sqrt = 2.
-	self assert: 16 sqrt = 4
-!
-
-testSquared
+testMinMax
 	
-	self assert: 4 squared = 16
-!
-
-testTimesRepeat
-	| i |
-
-	i := 0.
-	0 timesRepeat: [i := i + 1].
-	self assert: i equals: 0.
-
-	5 timesRepeat: [i := i + 1].
-	self assert: i equals: 5
-!
-
-testTo
-	self assert: (1 to: 5) equals: #(1 2 3 4 5)
-!
-
-testToBy
-	self assert: (0 to: 6 by: 2) equals: #(0 2 4 6).
-
-	self should: [1 to: 4 by: 0] raise: Error
-! !
-
-TestCase subclass: #JSObjectProxyTest
-	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
-
-!JSObjectProxyTest methodsFor: 'accessing'!
-
-jsObject
-	<return jsObject = {a: 1, b: function() {return 2;}, c: function(object) {return object;}}>
-! !
-
-!JSObjectProxyTest methodsFor: 'tests'!
-
-testMethodWithArguments
-	self deny: ('body' asJQuery hasClass: 'amber').
-
-	'body' asJQuery addClass: 'amber'.
-	self assert: ('body' asJQuery hasClass: 'amber').
-
-	'body' asJQuery removeClass: 'amber'.
-	self deny: ('body' asJQuery hasClass: 'amber').
-!
-
-testYourself
-	|body|
-	body := 'body' asJQuery
-				addClass: 'amber';
-				yourself.
-
-	self assert: (body hasClass: 'amber').
-
-	body removeClass: 'amber'.
-	self deny: (body hasClass: 'amber').
-!
-
-testPropertyThatReturnsEmptyString
-	<document.location.hash = ''>.
-	self assert: '' equals: document location hash.
-
-	document location hash: 'test'.
-	self assert: '#test' equals: document location hash.
-!
-
-testDNU
-	self should: [self jsObject foo] raise: MessageNotUnderstood
+	self assert: (2 max: 5) equals: 5.
+	self assert: (2 min: 5) equals: 2
 !
 
-testMessageSend
-
-	self assert: self jsObject a equals: 1.
-	self assert: self jsObject b equals: 2.
-	self assert: (self jsObject c: 3) equals: 3
+testNegated
+	self assert: 3 negated = -3.
+	self assert: -3 negated = 3
 !
 
-testPrinting
-	self assert: self jsObject printString = '[object Object]'
-! !
-
-TestCase subclass: #PackageTest
-	instanceVariableNames: 'zorkPackage grulPackage backUpCommitPathJs backUpCommitPathSt'
-	category: 'Kernel-Tests'!
-
-!PackageTest methodsFor: 'running'!
-
-setUp
-	backUpCommitPathJs := Package defaultCommitPathJs.
-	backUpCommitPathSt := Package defaultCommitPathSt.
-
-	Package resetCommitPaths.
-
-	zorkPackage := Package new name: 'Zork'.
-	grulPackage := Package new 
-					name: 'Grul';
-					commitPathJs: 'server/grul/js';
-					commitPathSt: 'grul/st';
-					yourself
+testPrintShowingDecimalPlaces
+	self assert: '23.00' equals: (23 printShowingDecimalPlaces: 2).
+	self assert: '23.57' equals: (23.5698 printShowingDecimalPlaces: 2).
+	self assert: '-234.56700' equals:( 234.567 negated printShowingDecimalPlaces: 5).
+	self assert: '23' equals: (23.4567 printShowingDecimalPlaces: 0).
+	self assert: '24' equals: (23.5567 printShowingDecimalPlaces: 0).
+	self assert: '-23' equals: (23.4567 negated printShowingDecimalPlaces: 0).
+	self assert: '-24' equals: (23.5567 negated printShowingDecimalPlaces: 0).
+	self assert: '100000000.0' equals: (100000000 printShowingDecimalPlaces: 1).
+	self assert: '0.98000' equals: (0.98 printShowingDecimalPlaces: 5).
+	self assert: '-0.98' equals: (0.98 negated printShowingDecimalPlaces: 2).
+	self assert: '2.57' equals: (2.567 printShowingDecimalPlaces: 2).
+	self assert: '-2.57' equals: (-2.567 printShowingDecimalPlaces: 2).
+	self assert: '0.00' equals: (0 printShowingDecimalPlaces: 2).
 !
 
-tearDown
-	 Package 
-		defaultCommitPathJs: backUpCommitPathJs;
-		defaultCommitPathSt: backUpCommitPathSt
-! !
-
-!PackageTest methodsFor: 'tests'!
-
-testGrulCommitPathStShouldBeGrulSt
-	self assert: 'grul/st' equals: grulPackage commitPathSt
+testRounded
+	
+	self assert: 3 rounded = 3.
+	self assert: 3.212 rounded = 3.
+	self assert: 3.51 rounded = 4
 !
 
-testZorkCommitPathStShouldBeSt
-	self assert: 'st' equals: zorkPackage commitPathSt
+testSqrt
+	
+	self assert: 4 sqrt = 2.
+	self assert: 16 sqrt = 4
 !
 
-testZorkCommitPathJsShouldBeJs
-	self assert: 'js' equals: zorkPackage commitPathJs
+testSquared
+	
+	self assert: 4 squared = 16
 !
 
-testGrulCommitPathJsShouldBeServerGrulJs
-	self assert: 'server/grul/js' equals: grulPackage commitPathJs
-! !
-
-TestCase subclass: #BlockClosureTest
-	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
-
-!BlockClosureTest methodsFor: 'tests'!
-
-testValue
-	self assert: ([1+1] value) equals: 2.
-	self assert: ([:x | x +1] value: 2) equals: 3.
-	self assert: ([:x :y | x*y] value: 2 value: 4) equals: 8. 
-
-	"Arguments are optional in Amber. This isn't ANSI compliant."
+testTimesRepeat
+	| i |
 
-	self assert: ([:a :b :c | 1] value) equals: 1
-!
+	i := 0.
+	0 timesRepeat: [i := i + 1].
+	self assert: i equals: 0.
 
-testOnDo
-	self assert: ([Error new signal] on: Error do: [:ex | true])
+	5 timesRepeat: [i := i + 1].
+	self assert: i equals: 5
 !
 
-testEnsure
-	self assert: ([Error new] ensure: [true])
+testTo
+	self assert: (1 to: 5) equals: #(1 2 3 4 5)
 !
 
-testNumArgs
-	self assert: [] numArgs equals: 0.
-	self assert: [:a :b | ] numArgs equals: 2
-!
+testToBy
+	self assert: (0 to: 6 by: 2) equals: #(0 2 4 6).
 
-testValueWithPossibleArguments
-	self assert: ([1] valueWithPossibleArguments: #(3 4)) equals: 1.
-	self assert: ([:a | a + 4] valueWithPossibleArguments: #(3 4)) equals: 7.
-	self assert: ([:a :b | a + b] valueWithPossibleArguments: #(3 4 5)) equals: 7.
+	self should: [1 to: 4 by: 0] raise: Error
 !
 
-testWhileTrue
-	| i |
-	i := 0.
-	[i < 5] whileTrue: [i := i + 1].
-	self assert: i equals: 5.
+testTruncated
+	
+	self assert: 3 truncated = 3.
+	self assert: 3.212 truncated = 3.
+	self assert: 3.51 truncated = 3
+! !
 
-	i := 0.
-	[i := i + 1. i < 5] whileTrue.
-	self assert: i equals: 5
-!
+Object subclass: #ObjectMock
+	instanceVariableNames: 'foo bar'
+	package: 'Kernel-Tests'!
 
-testWhileFalse
-	| i |
-	i := 0.
-	[i > 5] whileFalse: [i := i + 1].
-	self assert: i equals: 6.
+!ObjectMock methodsFor: 'not yet classified'!
 
-	i := 0.
-	[i := i + 1. i > 5] whileFalse.
-	self assert: i equals: 6
+foo
+	^foo
 !
 
-testCompiledSource
-	self assert: ([1+1] compiledSource includesSubString: 'function')
+foo: anObject
+	foo := anObject
 ! !
 
 TestCase subclass: #ObjectTest
 	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
+	package: 'Kernel-Tests'!
 
 !ObjectTest methodsFor: 'tests'!
 
-testEquality
+testBasicAccess
 	| o |
 	o := Object new.
-	self deny: o = Object new.
-	self assert: o = o.
-	self assert: o yourself = o.
-	self assert: o = o yourself
+	o basicAt: 'a' put: 1.
+	self assert: (o basicAt: 'a') equals: 1.
+	self assert: (o basicAt: 'b') equals: nil
 !
 
-testIdentity
+testBasicPerform
 	| o |
 	o := Object new.
-	self deny: o == Object new.
-	self assert: o == o
+	o basicAt: 'func' put: ['hello'].	
+	o basicAt: 'func2' put: [:a | a + 1].
+
+	self assert: (o basicPerform: 'func')	 equals: 'hello'.
+	self assert: (o basicPerform: 'func2' withArguments: #(3)) equals: 4
 !
 
-testHalt
-	self should: [Object new halt] raise: Error
+testDNU
+	self should: [Object new foo] raise: MessageNotUnderstood
 !
 
-testBasicAccess
+testEquality
 	| o |
 	o := Object new.
-	o basicAt: 'a' put: 1.
-	self assert: (o basicAt: 'a') equals: 1.
-	self assert: (o basicAt: 'b') equals: nil
-!
-
-testNilUndefined
-	"nil in Smalltalk is the undefined object in JS"
-
-	self assert: nil = undefined
+	self deny: o = Object new.
+	self assert: o = o.
+	self assert: o yourself = o.
+	self assert: o = o yourself
 !
 
-testidentityHash
-	| o1 o2 |
-	
-	o1 := Object new.
-	o2 := Object new.
-
-	self assert: o1 identityHash == o1 identityHash.
-	self deny: o1 identityHash == o2 identityHash
+testHalt
+	self should: [Object new halt] raise: Error
 !
 
-testBasicPerform
+testIdentity
 	| o |
 	o := Object new.
-	o basicAt: 'func' put: ['hello'].	
-	o basicAt: 'func2' put: [:a | a + 1].
-
-	self assert: (o basicPerform: 'func')	 equals: 'hello'.
-	self assert: (o basicPerform: 'func2' withArguments: #(3)) equals: 4
+	self deny: o == Object new.
+	self assert: o == o
 !
 
 testIfNil
@@ -625,134 +581,113 @@ testInstVars
 	self assert: (o instVarAt: 'foo') equals: 1
 !
 
+testNilUndefined
+	"nil in Smalltalk is the undefined object in JS"
+
+	self assert: nil = undefined
+!
+
 testYourself
 	| o |
 	o := ObjectMock new.
 	self assert: o yourself == o
 !
 
-testDNU
-	self should: [Object new foo] raise: MessageNotUnderstood
-! !
-
-TestCase subclass: #SymbolTest
-	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
-
-!SymbolTest methodsFor: 'tests'!
-
-testEquality
-	self assert: #hello = #hello.
-	self deny: #hello = #world.
+testidentityHash
+	| o1 o2 |
+	
+	o1 := Object new.
+	o2 := Object new.
 
-	self assert: #hello  = #hello yourself.
-	self assert: #hello yourself = #hello.
+	self assert: o1 identityHash == o1 identityHash.
+	self deny: o1 identityHash == o2 identityHash
+! !
 
-	self deny: #hello  = 'hello'.
-	self deny: 'hello' = #hello.
-!
+TestCase subclass: #PackageTest
+	instanceVariableNames: 'zorkPackage grulPackage backUpCommitPathJs backUpCommitPathSt'
+	package: 'Kernel-Tests'!
 
-testAt
-	self assert: (#hello at: 1) = 'h'.
-	self assert: (#hello at: 5) = 'o'.
-	self assert: (#hello at: 6 ifAbsent: [nil]) = nil
-!
+!PackageTest methodsFor: 'running'!
 
-testAtPut
-	"Symbol instances are read-only"
-	self should: ['hello' at: 1 put: 'a'] raise: Error
-!
+setUp
+	backUpCommitPathJs := Package defaultCommitPathJs.
+	backUpCommitPathSt := Package defaultCommitPathSt.
 
-testIdentity
-	self assert: #hello == #hello.
-	self deny: #hello == #world.
+	Package resetCommitPaths.
 
-	self assert: #hello  = #hello yourself.
-	self assert: #hello yourself = #hello asString asSymbol
+	zorkPackage := Package new name: 'Zork'.
+	grulPackage := Package new 
+					name: 'Grul';
+					commitPathJs: 'server/grul/js';
+					commitPathSt: 'grul/st';
+					yourself
 !
 
-testComparing
-	self assert: #ab > #aa.
-	self deny: #ab > #ba.
-
-	self assert: #ab < #ba.
-	self deny: #bb < #ba.
-
-	self assert: #ab >= #aa.
-	self deny: #ab >= #ba.
-
-	self assert: #ab <= #ba.
-	self deny: #bb <= #ba
-!
+tearDown
+	 Package 
+		defaultCommitPathJs: backUpCommitPathJs;
+		defaultCommitPathSt: backUpCommitPathSt
+! !
 
-testSize
-	self assert: #a size equals: 1.
-	self assert: #aaaaa size equals: 5
-!
+!PackageTest methodsFor: 'tests'!
 
-testAsString
-	self assert: #hello asString equals: 'hello'
+testGrulCommitPathJsShouldBeServerGrulJs
+	self assert: 'server/grul/js' equals: grulPackage commitPathJs
 !
 
-testAsSymbol
-	self assert: #hello == #hello asSymbol
+testGrulCommitPathStShouldBeGrulSt
+	self assert: 'grul/st' equals: grulPackage commitPathSt
 !
 
-testCopying
-	self assert: #hello copy == #hello.
-	self assert: #hello deepCopy == #hello
+testZorkCommitPathJsShouldBeJs
+	self assert: 'js' equals: zorkPackage commitPathJs
 !
 
-testIsSymbolIsString
-	self assert: #hello isSymbol.
-	self deny: 'hello' isSymbol.
-	self deny: #hello isString.
-	self assert: 'hello' isString
+testZorkCommitPathStShouldBeSt
+	self assert: 'st' equals: zorkPackage commitPathSt
 ! !
 
-Object subclass: #ObjectMock
-	instanceVariableNames: 'foo bar'
-	category: 'Kernel-Tests'!
+PackageTest subclass: #PackageWithDefaultCommitPathChangedTest
+	instanceVariableNames: ''
+	package: 'Kernel-Tests'!
 
-!ObjectMock methodsFor: 'not yet classified'!
+!PackageWithDefaultCommitPathChangedTest methodsFor: 'running'!
 
-foo
-	^foo
-!
+setUp
+	super setUp.
 
-foo: anObject
-	foo := anObject
+	Package
+		defaultCommitPathJs: 'javascripts/';
+		defaultCommitPathSt: 'smalltalk/'.
 ! !
 
-TestCase subclass: #UndefinedTest
-	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
-
-!UndefinedTest methodsFor: 'tests'!
+!PackageWithDefaultCommitPathChangedTest methodsFor: 'tests'!
 
-testIsNil
-	self assert: nil isNil.
-	self deny: nil notNil.
+testGrulCommitPathJsShouldBeServerGrulJs
+	self assert: 'server/grul/js' equals: grulPackage commitPathJs
 !
 
-testIfNil
-	self assert: (nil ifNil: [true]) equals: true.
-	self deny: (nil ifNotNil: [true]) = true.
-	self assert: (nil ifNil: [true] ifNotNil: [false]) equals: true.
-	self deny: (nil ifNotNil: [true] ifNil: [false]) = true
+testGrulCommitPathStShouldBeGrulSt
+	self assert: 'grul/st' equals: grulPackage commitPathSt
 !
 
-testCopying
-	self assert: nil copy equals: nil
+testZorkCommitPathJsShouldBeJavascript
+	self assert: 'javascripts/' equals: zorkPackage commitPathJs
 !
 
-testDeepCopy
-	self assert: nil deepCopy = nil
+testZorkCommitPathStShouldBeSmalltalk
+	self assert: 'smalltalk/' equals: zorkPackage commitPathSt
+! !
+
+!PackageWithDefaultCommitPathChangedTest class methodsFor: 'accessing'!
+
+shouldInheritSelectors
+	^ false
 ! !
 
 TestCase subclass: #PointTest
 	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
+	package: 'Kernel-Tests'!
 
 !PointTest methodsFor: 'tests'!
 
@@ -763,6 +698,13 @@ testAccessing
 	self assert: (Point new y: 4) y equals: 4
 !
 
+testArithmetic
+	self assert: 3@4 * (3@4 ) equals: (Point x: 9 y: 16).
+	self assert: 3@4 + (3@4 ) equals: (Point x: 6 y: 8).
+	self assert: 3@4 - (3@4 ) equals: (Point x: 0 y: 0).
+	self assert: 6@8 / (3@4 ) equals: (Point x: 2 y: 2)
+!
+
 testAt
 	self assert: 3@4 equals: (Point x: 3 y: 4)
 !
@@ -772,13 +714,6 @@ testEgality
 	self deny: 3@5 = (3@6)
 !
 
-testArithmetic
-	self assert: 3@4 * (3@4 ) equals: (Point x: 9 y: 16).
-	self assert: 3@4 + (3@4 ) equals: (Point x: 6 y: 8).
-	self assert: 3@4 - (3@4 ) equals: (Point x: 0 y: 0).
-	self assert: 6@8 / (3@4 ) equals: (Point x: 2 y: 2)
-!
-
 testTranslateBy
 	self assert: 3@4 equals: (3@3 translateBy: 0@1).
 	self assert: 3@2 equals: (3@3 translateBy: 0@1 negated).
@@ -788,7 +723,7 @@ testTranslateBy
 
 TestCase subclass: #RandomTest
 	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
+	package: 'Kernel-Tests'!
 
 !RandomTest methodsFor: 'tests'!
 
@@ -803,38 +738,37 @@ textNext
 			next = current]
 ! !
 
-TestCase subclass: #ClassBuilderTest
-	instanceVariableNames: 'builder theClass'
-	category: 'Kernel-Tests'!
+TestCase subclass: #SetTest
+	instanceVariableNames: ''
+	package: 'Kernel-Tests'!
 
-!ClassBuilderTest methodsFor: 'running'!
+!SetTest methodsFor: 'tests'!
 
-setUp
-	builder := ClassBuilder new
-!
+testAddRemove
+	| set |
+	set := Set new.
+	
+	self assert: set isEmpty.
 
-tearDown
-	theClass ifNotNil: [Smalltalk current removeClass: theClass. theClass := nil]
-!
+	set add: 3.
+	self assert: (set includes: 3).
 
-testClassCopy
-	theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.
-	self assert: theClass superclass == ObjectMock superclass.
-	self assert: theClass instanceVariableNames == ObjectMock instanceVariableNames.
-	self assert: theClass name equals: 'ObjectMock2'.
-	self assert: theClass package == ObjectMock package.
-	self assert: theClass methodDictionary keys equals: ObjectMock methodDictionary keys
-!
+	set add: 5.
+	self assert: (set includes: 5).
 
-testInstanceVariableNames
-	self assert: (builder instanceVariableNamesFor: '  hello   world   ') equals: #('hello' 'world')
-! !
+	set remove: 3.
+	self deny: (set includes: 3)
+!
 
-TestCase subclass: #SetTest
-	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
+testAt
+	self should: [Set new at: 1 put: 2] raise: Error
+!
 
-!SetTest methodsFor: 'tests'!
+testSize
+	self assert: Set new size equals: 0.
+	self assert: (Set withAll: #(1 2 3 4)) size equals: 4.
+	self assert: (Set withAll: #(1 1 1 1)) size equals: 1
+!
 
 testUnicity
 	| set |
@@ -849,69 +783,171 @@ testUnicity
 	self assert: set size = 2.
 
 	self assert: set asArray equals: #(21 'hello')
+! !
+
+TestCase subclass: #StringTest
+	instanceVariableNames: ''
+	package: 'Kernel-Tests'!
+
+!StringTest methodsFor: 'tests'!
+
+testAddRemove
+	self should: ['hello' add: 'a'] raise: Error.
+	self should: ['hello' remove: 'h'] raise: Error
+!
+
+testAsArray
+	self assert: 'hello' asArray = #('h' 'e' 'l' 'l' 'o').
 !
 
 testAt
-	self should: [Set new at: 1 put: 2] raise: Error
+	self assert: ('hello' at: 1) = 'h'.
+	self assert: ('hello' at: 5) = 'o'.
+	self assert: ('hello' at: 6 ifAbsent: [nil]) = nil
 !
 
-testAddRemove
-	| set |
-	set := Set new.
-	
-	self assert: set isEmpty.
+testAtPut
+	"String instances are read-only"
+	self should: ['hello' at: 1 put: 'a'] raise: Error
+!
 
-	set add: 3.
-	self assert: (set includes: 3).
+testCopyWithoutAll
+	self 
+		assert: 'hello world' 
+		equals: ('*hello* *world*' copyWithoutAll: '*')
+!
 
-	set add: 5.
-	self assert: (set includes: 5).
+testEquality
+	self assert: 'hello' = 'hello'.
+	self deny: 'hello' = 'world'.
 
-	set remove: 3.
-	self deny: (set includes: 3)
+	self assert: 'hello'  = 'hello' yourself.
+	self assert: 'hello' yourself = 'hello'.
+
+	"test JS falsy value"
+	self deny: '' = 0
+!
+
+testIncludesSubString
+	self assert: ('amber' includesSubString: 'ber').
+	self deny: ('amber' includesSubString: 'zork').
+!
+
+testJoin
+	self assert: 'hello,world' equals: (',' join: #('hello' 'world'))
 !
 
 testSize
-	self assert: Set new size equals: 0.
-	self assert: (Set withAll: #(1 2 3 4)) size equals: 4.
-	self assert: (Set withAll: #(1 1 1 1)) size equals: 1
+	self assert: 'smalltalk' size equals: 9.
+	self assert: '' size equals: 0
+!
+
+testStreamContents
+	self 
+		assert: 'hello world' 
+		equals: (String streamContents: [:aStream| aStream 
+                                                 					nextPutAll: 'hello'; space; 
+                                                 					nextPutAll: 'world'])
 ! !
 
-PackageTest subclass: #PackageWithDefaultCommitPathChangedTest
+TestCase subclass: #SymbolTest
 	instanceVariableNames: ''
-	category: 'Kernel-Tests'!
+	package: 'Kernel-Tests'!
 
-!PackageWithDefaultCommitPathChangedTest methodsFor: 'running'!
+!SymbolTest methodsFor: 'tests'!
 
-setUp
-	super setUp.
+testAsString
+	self assert: #hello asString equals: 'hello'
+!
 
-	Package
-		defaultCommitPathJs: 'javascripts/';
-		defaultCommitPathSt: 'smalltalk/'.
-! !
+testAsSymbol
+	self assert: #hello == #hello asSymbol
+!
 
-!PackageWithDefaultCommitPathChangedTest methodsFor: 'tests'!
+testAt
+	self assert: (#hello at: 1) = 'h'.
+	self assert: (#hello at: 5) = 'o'.
+	self assert: (#hello at: 6 ifAbsent: [nil]) = nil
+!
 
-testGrulCommitPathJsShouldBeServerGrulJs
-	self assert: 'server/grul/js' equals: grulPackage commitPathJs
+testAtPut
+	"Symbol instances are read-only"
+	self should: ['hello' at: 1 put: 'a'] raise: Error
 !
 
-testGrulCommitPathStShouldBeGrulSt
-	self assert: 'grul/st' equals: grulPackage commitPathSt
+testComparing
+	self assert: #ab > #aa.
+	self deny: #ab > #ba.
+
+	self assert: #ab < #ba.
+	self deny: #bb < #ba.
+
+	self assert: #ab >= #aa.
+	self deny: #ab >= #ba.
+
+	self assert: #ab <= #ba.
+	self deny: #bb <= #ba
 !
 
-testZorkCommitPathJsShouldBeJavascript
-	self assert: 'javascripts/' equals: zorkPackage commitPathJs
+testCopying
+	self assert: #hello copy == #hello.
+	self assert: #hello deepCopy == #hello
 !
 
-testZorkCommitPathStShouldBeSmalltalk
-	self assert: 'smalltalk/' equals: zorkPackage commitPathSt
+testEquality
+	self assert: #hello = #hello.
+	self deny: #hello = #world.
+
+	self assert: #hello  = #hello yourself.
+	self assert: #hello yourself = #hello.
+
+	self deny: #hello  = 'hello'.
+	self deny: 'hello' = #hello.
+!
+
+testIdentity
+	self assert: #hello == #hello.
+	self deny: #hello == #world.
+
+	self assert: #hello  = #hello yourself.
+	self assert: #hello yourself = #hello asString asSymbol
+!
+
+testIsSymbolIsString
+	self assert: #hello isSymbol.
+	self deny: 'hello' isSymbol.
+	self deny: #hello isString.
+	self assert: 'hello' isString
+!
+
+testSize
+	self assert: #a size equals: 1.
+	self assert: #aaaaa size equals: 5
 ! !
 
-!PackageWithDefaultCommitPathChangedTest class methodsFor: 'accessing'!
+TestCase subclass: #UndefinedTest
+	instanceVariableNames: ''
+	package: 'Kernel-Tests'!
 
-shouldInheritSelectors
-	^ false
+!UndefinedTest methodsFor: 'tests'!
+
+testCopying
+	self assert: nil copy equals: nil
+!
+
+testDeepCopy
+	self assert: nil deepCopy = nil
+!
+
+testIfNil
+	self assert: (nil ifNil: [true]) equals: true.
+	self deny: (nil ifNotNil: [true]) = true.
+	self assert: (nil ifNil: [true] ifNotNil: [false]) equals: true.
+	self deny: (nil ifNotNil: [true] ifNil: [false]) = true
+!
+
+testIsNil
+	self assert: nil isNil.
+	self deny: nil notNil.
 ! !
 
diff --git a/amber/src/st/Kernel-Transcript.st b/amber/src/st/Kernel-Transcript.st
index 94835f5b0b8..54f7d8aa314 100644
--- a/amber/src/st/Kernel-Transcript.st
+++ b/amber/src/st/Kernel-Transcript.st
@@ -1,22 +1,53 @@
 Smalltalk current createPackage: 'Kernel-Transcript' properties: #{}!
+Object subclass: #ConsoleTranscript
+	instanceVariableNames: 'textarea'
+	package: 'Kernel-Transcript'!
+
+!ConsoleTranscript methodsFor: 'actions'!
+
+open
+! !
+
+!ConsoleTranscript methodsFor: 'printing'!
+
+clear
+	"no op"
+!
+
+cr
+	"no op"
+!
+
+show: anObject
+	| string |
+	string := anObject asString.
+	<console.log(String(string))>
+! !
+
+!ConsoleTranscript class methodsFor: 'initialization'!
+
+initialize
+	Transcript register: self new
+! !
+
 Object subclass: #Transcript
 	instanceVariableNames: 'textarea'
-	category: 'Kernel-Transcript'!
+	package: 'Kernel-Transcript'!
 
 Transcript class instanceVariableNames: 'current'!
 
 !Transcript class methodsFor: 'instance creation'!
 
-open
-    self current open
+current
+    ^current
 !
 
 new
     self shouldNotImplement
 !
 
-current
-    ^current
+open
+    self current open
 !
 
 register: aTranscript
@@ -25,46 +56,15 @@ register: aTranscript
 
 !Transcript class methodsFor: 'printing'!
 
-show: anObject
-    self current show: anObject
-!
-
-cr
-    self current show: String cr
-!
-
 clear
     self current clear
-! !
-
-Object subclass: #ConsoleTranscript
-	instanceVariableNames: 'textarea'
-	category: 'Kernel-Transcript'!
-
-!ConsoleTranscript methodsFor: 'actions'!
-
-open
-! !
-
-!ConsoleTranscript methodsFor: 'printing'!
-
-clear
-	"no op"
 !
 
 cr
-	"no op"
+    self current show: String cr
 !
 
 show: anObject
-	| string |
-	string := anObject asString.
-	<console.log(String(string))>
-! !
-
-!ConsoleTranscript class methodsFor: 'initialization'!
-
-initialize
-	Transcript register: self new
+    self current show: anObject
 ! !
 
diff --git a/amber/src/st/SUnit.st b/amber/src/st/SUnit.st
index 37f80eaf27a..fabb724b7b9 100755
--- a/amber/src/st/SUnit.st
+++ b/amber/src/st/SUnit.st
@@ -1,16 +1,16 @@
 Smalltalk current createPackage: 'SUnit' properties: #{}!
 Object subclass: #TestCase
 	instanceVariableNames: 'testSelector'
-	category: 'SUnit'!
+	package: 'SUnit'!
 
 !TestCase methodsFor: 'accessing'!
 
-setTestSelector: aSelector
-	testSelector := aSelector
-!
-
 selector
 	^testSelector
+!
+
+setTestSelector: aSelector
+	testSelector := aSelector
 ! !
 
 !TestCase methodsFor: 'private'!
@@ -23,10 +23,10 @@ signalFailure: aString
 
 !TestCase methodsFor: 'running'!
 
-setUp
-!
-
-tearDown
+performTestFor: aResult
+	[[self perform: self selector]
+		on: TestFailure do: [:ex | aResult addFailure: self]]
+		on: Error do: [:ex | aResult addError: self]
 !
 
 runCaseFor: aTestResult
@@ -36,10 +36,10 @@ runCaseFor: aTestResult
 	self tearDown
 !
 
-performTestFor: aResult
-	[[self perform: self selector]
-		on: TestFailure do: [:ex | aResult addFailure: self]]
-		on: Error do: [:ex | aResult addError: self]
+setUp
+!
+
+tearDown
 ! !
 
 !TestCase methodsFor: 'testing'!
@@ -48,16 +48,16 @@ assert: aBoolean
 	self assert: aBoolean description: 'Assertion failed'
 !
 
-deny: aBoolean
-	self assert: aBoolean not
+assert: aBoolean description: aString
+	aBoolean ifFalse: [self signalFailure: aString]
 !
 
 assert: expected equals: actual
 	^ self assert: (expected = actual) description: 'Expected: ', expected asString, ' but was: ', actual asString
 !
 
-assert: aBoolean description: aString
-	aBoolean ifFalse: [self signalFailure: aString]
+deny: aBoolean
+	self assert: aBoolean not
 !
 
 should: aBlock
@@ -72,20 +72,6 @@ should: aBlock raise: anExceptionClass
 
 !TestCase class methodsFor: 'accessing'!
 
-testSelectors
-	^self methodDictionary keys select: [:each | each match: '^test']
-!
-
-selector: aSelector
-	^self new
-		setTestSelector: aSelector;
-		yourself
-!
-
-lookupHierarchyRoot
-	^TestCase
-!
-
 allTestSelectors
 	| selectors |
 	selectors := self testSelectors.
@@ -96,6 +82,20 @@ allTestSelectors
 
 buildSuite
 	^self allTestSelectors collect: [:each | self selector: each]
+!
+
+lookupHierarchyRoot
+	^TestCase
+!
+
+selector: aSelector
+	^self new
+		setTestSelector: aSelector;
+		yourself
+!
+
+testSelectors
+	^self methodDictionary keys select: [:each | each match: '^test']
 ! !
 
 !TestCase class methodsFor: 'testing'!
@@ -106,16 +106,20 @@ shouldInheritSelectors
 
 Error subclass: #TestFailure
 	instanceVariableNames: ''
-	category: 'SUnit'!
+	package: 'SUnit'!
 
 Object subclass: #TestResult
 	instanceVariableNames: 'timestamp runs errors failures total'
-	category: 'SUnit'!
+	package: 'SUnit'!
 
 !TestResult methodsFor: 'accessing'!
 
-timestamp
-	^timestamp
+addError: anError
+	self errors add: anError
+!
+
+addFailure: aFailure
+	self failures add: aFailure
 !
 
 errors
@@ -126,30 +130,14 @@ failures
 	^failures
 !
 
-total
-	^total
-!
-
-total: aNumber
-	total := aNumber
-!
-
-addError: anError
-	self errors add: anError
-!
-
-addFailure: aFailure
-	self failures add: aFailure
+increaseRuns
+	runs := runs + 1
 !
 
 runs
 	^runs
 !
 
-increaseRuns
-	runs := runs + 1
-!
-
 status
 	^self errors isEmpty 
 		ifTrue: [
@@ -157,6 +145,18 @@ status
 				ifTrue: ['success']
 				ifFalse: ['failure']]
 		ifFalse: ['error']
+!
+
+timestamp
+	^timestamp
+!
+
+total
+	^total
+!
+
+total: aNumber
+	total := aNumber
 ! !
 
 !TestResult methodsFor: 'initialization'!
-- 
GitLab