diff --git a/lib/haxe/src/org/apache/thrift/AbstractMethodError.hx b/lib/haxe/src/org/apache/thrift/AbstractMethodError.hx
index 9fb9bbb..54b8153 100644
--- a/lib/haxe/src/org/apache/thrift/AbstractMethodError.hx
+++ b/lib/haxe/src/org/apache/thrift/AbstractMethodError.hx
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift;
 
 #if flash
@@ -25,16 +25,16 @@
 import org.apache.thrift.TException;
 #end
 
-class AbstractMethodError 
+class AbstractMethodError
 #if flash
-extends IllegalOperationError 
+extends IllegalOperationError
 #else
 extends TException
 #end
 {
 
-	public function new(message : String="") {
-  		super("Attempt to call an abstract method");
-	}
+    public function new(message : String="") {
+          super("Attempt to call an abstract method");
+    }
 
 }
diff --git a/lib/haxe/src/org/apache/thrift/ArgumentError.hx b/lib/haxe/src/org/apache/thrift/ArgumentError.hx
index 8a5df6f..3ca04fd 100644
--- a/lib/haxe/src/org/apache/thrift/ArgumentError.hx
+++ b/lib/haxe/src/org/apache/thrift/ArgumentError.hx
@@ -16,14 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift;
 
 #if ! flash
 // predefined for flash only
 class ArgumentError extends TException {
-	public function new(msg : String = "") {
-		super(msg);
-	}
+    public function new(msg : String = "") {
+        super(msg);
+    }
 }
 #end
diff --git a/lib/haxe/src/org/apache/thrift/Limits.hx b/lib/haxe/src/org/apache/thrift/Limits.hx
index 7d2aa5d..44eec3a 100644
--- a/lib/haxe/src/org/apache/thrift/Limits.hx
+++ b/lib/haxe/src/org/apache/thrift/Limits.hx
@@ -16,29 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift;
 
 class Limits {
-    
-	// Haxe limits are not fixed values, they depend on the target platform
-	// For example, neko limits an int to 31 bits instead of 32. So we detect 
-	// the values once during intialisation in order to
-	// (a) get the right values for the current  platform, and 
-	// (b) prevent us from dependecies to a bunch of defines
-	
-	public static var I32_MAX = {
-		var last : Int = 0;
-		var next : Int = 0;
-		for(bit in 0 ... 32) {
-			last = next;
-			next = last | (1 << bit);
-			if(next < 0) {
-				break;
-			}
-		}
-		last; // final value
-	}
 
-	// add whatever you need 
+    // Haxe limits are not fixed values, they depend on the target platform
+    // For example, neko limits an int to 31 bits instead of 32. So we detect
+    // the values once during intialisation in order to
+    // (a) get the right values for the current  platform, and
+    // (b) prevent us from dependecies to a bunch of defines
+
+    public static var I32_MAX = {
+        var last : Int = 0;
+        var next : Int = 0;
+        for(bit in 0 ... 32) {
+            last = next;
+            next = last | (1 << bit);
+            if(next < 0) {
+                break;
+            }
+        }
+        last; // final value
+    }
+
+    // add whatever you need
 }
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/TApplicationException.hx b/lib/haxe/src/org/apache/thrift/TApplicationException.hx
index 012a802..4287a85 100644
--- a/lib/haxe/src/org/apache/thrift/TApplicationException.hx
+++ b/lib/haxe/src/org/apache/thrift/TApplicationException.hx
@@ -30,9 +30,9 @@
    */
 class TApplicationException extends TException {
 
-	private static var TAPPLICATION_EXCEPTION_STRUCT = { new TStruct("TApplicationException"); };
-	private static var MESSAGE_FIELD = { new TField("message", TType.STRING, 1); };
-	private static var TYPE_FIELD = { new TField("type", TType.I32, 2); };
+    private static var TAPPLICATION_EXCEPTION_STRUCT = { new TStruct("TApplicationException"); };
+    private static var MESSAGE_FIELD = { new TField("message", TType.STRING, 1); };
+    private static var TYPE_FIELD = { new TField("type", TType.I32, 2); };
 
     public static inline var UNKNOWN : Int = 0;
     public static inline var UNKNOWN_METHOD : Int = 1;
diff --git a/lib/haxe/src/org/apache/thrift/TBase.hx b/lib/haxe/src/org/apache/thrift/TBase.hx
index 5d8bfc1..a35c752 100644
--- a/lib/haxe/src/org/apache/thrift/TBase.hx
+++ b/lib/haxe/src/org/apache/thrift/TBase.hx
@@ -26,38 +26,38 @@
    *
    */
 interface TBase {
-  
+
     /**
      * Reads the TObject from the given input protocol.
      *
      * @param iprot Input protocol
      */
     function read(iprot:TProtocol) : Void;
-  
+
     /**
      * Writes the objects out to the protocol
      *
      * @param oprot Output protocol
      */
     function write(oprot:TProtocol) : Void;
-  
+
     /**
      * Check if a field is currently set or unset.
      *
      * @param fieldId The field's id tag as found in the IDL.
      */
     function isSet(fieldId : Int) : Bool;
-  
+
     /**
-     * Get a field's value by id. Primitive types will be wrapped in the 
+     * Get a field's value by id. Primitive types will be wrapped in the
      * appropriate "boxed" types.
      *
      * @param fieldId The field's id tag as found in the IDL.
      */
     function getFieldValue(fieldId : Int) : Dynamic;
-  
+
     /**
-     * Set a field's value by id. Primitive types must be "boxed" in the 
+     * Set a field's value by id. Primitive types must be "boxed" in the
      * appropriate object wrapper type.
      *
      * @param fieldId The field's id tag as found in the IDL.
diff --git a/lib/haxe/src/org/apache/thrift/TException.hx b/lib/haxe/src/org/apache/thrift/TException.hx
index ed630ba..54fa1ff 100644
--- a/lib/haxe/src/org/apache/thrift/TException.hx
+++ b/lib/haxe/src/org/apache/thrift/TException.hx
@@ -16,20 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift;
 
 class TException {
-    
-	@:isVar 
-	public var errorID(default,null) : Int;
-	@:isVar 
-	public var errorMsg(default,null) : String;
 
-	
-	public function new(msg : String = "", id : Int = 0) {
-		errorID = id;
-		errorMsg = msg;
-	}
-    
+    @:isVar
+    public var errorID(default,null) : Int;
+    @:isVar
+    public var errorMsg(default,null) : String;
+
+
+    public function new(msg : String = "", id : Int = 0) {
+        errorID = id;
+        errorMsg = msg;
+    }
+
 }
+ 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/TFieldRequirementType.hx b/lib/haxe/src/org/apache/thrift/TFieldRequirementType.hx
index 70f698f..7c22030 100644
--- a/lib/haxe/src/org/apache/thrift/TFieldRequirementType.hx
+++ b/lib/haxe/src/org/apache/thrift/TFieldRequirementType.hx
@@ -27,5 +27,5 @@
     public static inline var REQUIRED : Int  = 1;
     public static inline var OPTIONAL : Int = 2;
     public static inline var DEFAULT : Int = 3;
-  
+
 }
diff --git a/lib/haxe/src/org/apache/thrift/TProcessor.hx b/lib/haxe/src/org/apache/thrift/TProcessor.hx
index 78ce5a7..0cb6f7d 100644
--- a/lib/haxe/src/org/apache/thrift/TProcessor.hx
+++ b/lib/haxe/src/org/apache/thrift/TProcessor.hx
@@ -26,5 +26,5 @@
  * writes to some output stream.
  */
 interface TProcessor {
-	function process(input:TProtocol, output:TProtocol) : Bool;
+    function process(input:TProtocol, output:TProtocol) : Bool;
 }
diff --git a/lib/haxe/src/org/apache/thrift/helper/Int64Map.hx b/lib/haxe/src/org/apache/thrift/helper/Int64Map.hx
index 8d9e4e1..6d6a6a1 100644
--- a/lib/haxe/src/org/apache/thrift/helper/Int64Map.hx
+++ b/lib/haxe/src/org/apache/thrift/helper/Int64Map.hx
@@ -29,187 +29,187 @@
 
 class Int64Map<T> implements IMap< Int64, T> {
 
-	private var SubMaps : IntMap< IntMap< T>>;  // Hi -> Lo -> Value
-	
-	public function new() : Void {
-		SubMaps = new IntMap< IntMap< T>>();
-	};
+    private var SubMaps : IntMap< IntMap< T>>;  // Hi -> Lo -> Value
 
-	private function GetSubMap( hi : haxe.Int32, canCreate : Bool) : IntMap< T> {
-		if( SubMaps.exists(hi)) {
-			return SubMaps.get(hi);
-		} 
-		
-		if( ! canCreate) {
-			return null;
-		} 
-		
-		var lomap = new IntMap< T>();
-		SubMaps.set( hi, lomap);
-		return lomap;
-	}
-	
-	/**
-		Maps `key` to `value`.
-		If `key` already has a mapping, the previous value disappears.
-		If `key` is null, the result is unspecified.
-	**/
-	public function set( key : Int64, value : T ) : Void {
-		if( key ==  null) {
-			return;
-		}
+    public function new() : Void {
+        SubMaps = new IntMap< IntMap< T>>();
+    };
 
-		var lomap = GetSubMap( Int64.getHigh(key), true);
-		lomap.set( Int64.getLow(key), value);
-	}
-	
+    private function GetSubMap( hi : haxe.Int32, canCreate : Bool) : IntMap< T> {
+        if( SubMaps.exists(hi)) {
+            return SubMaps.get(hi);
+        }
 
-	/**
-		Returns the current mapping of `key`.
-		If no such mapping exists, null is returned.
-		If `key` is null, the result is unspecified.
+        if( ! canCreate) {
+            return null;
+        }
 
-		Note that a check like `map.get(key) == null` can hold for two reasons:
+        var lomap = new IntMap< T>();
+        SubMaps.set( hi, lomap);
+        return lomap;
+    }
 
-			1. the map has no mapping for `key`
-			2. the map has a mapping with a value of `null`
+    /**
+        Maps `key` to `value`.
+        If `key` already has a mapping, the previous value disappears.
+        If `key` is null, the result is unspecified.
+    **/
+    public function set( key : Int64, value : T ) : Void {
+        if( key ==  null) {
+            return;
+        }
 
-		If it is important to distinguish these cases, `exists()` should be
-		used.
-
-	**/
-	public function get( key : Int64) : Null<T> {
-		if( key ==  null) {
-			return null;
-		}
-		
-		var lomap = GetSubMap( Int64.getHigh(key), false);
-		if( lomap == null) {
-			return null;
-		}
-
-		return lomap.get( Int64.getLow(key));
-	}
-
-	/**
-		Returns true if `key` has a mapping, false otherwise.
-		If `key` is null, the result is unspecified.
-	**/
-	public function exists( key : Int64) : Bool {
-		if( key ==  null) {
-			return false;
-		}
-		
-		var lomap = GetSubMap( Int64.getHigh(key), false);
-		if( lomap == null) {
-			return false;
-		}
-
-		return lomap.exists( Int64.getLow(key));
-	}
-
-	/**
-		Removes the mapping of `key` and returns true if such a mapping existed,
-		false otherwise. If `key` is null, the result is unspecified.
-	**/
-	public function remove( key : Int64) : Bool {
-		if( key ==  null) {
-			return false;
-		}
-		
-		var lomap = GetSubMap( Int64.getHigh(key), false);
-		if( lomap == null) {
-			return false;
-		}
-
-		return lomap.remove( Int64.getLow(key));
-	}
+        var lomap = GetSubMap( Int64.getHigh(key), true);
+        lomap.set( Int64.getLow(key), value);
+    }
 
 
-	/**
-		Returns an Iterator over the keys of `this` Map.
-		The order of keys is undefined.
-	**/
-	public function keys() : Iterator<Int64> {
-		return new Int64KeyIterator<T>(SubMaps);
-	}
+    /**
+        Returns the current mapping of `key`.
+        If no such mapping exists, null is returned.
+        If `key` is null, the result is unspecified.
 
-	/**
-		Returns an Iterator over the values of `this` Map.
-		The order of values is undefined.
-	**/
-	public function iterator() : Iterator<T> {
-		return new Int64ValueIterator<T>(SubMaps);
-	}
+        Note that a check like `map.get(key) == null` can hold for two reasons:
 
-	/**
-		Returns a String representation of `this` Map.
-		The exact representation depends on the platform and key-type.
-	**/
-	public function toString() : String {
-		var result : String = "{"; 
+            1. the map has no mapping for `key`
+            2. the map has a mapping with a value of `null`
 
-		var first = true;
-		for( key in this.keys()) {
-			if( first) {
-				first = false;
-			} else {
-				result += ", ";
-			}
-			
-			var value = this.get(key);
-			result += Int64.toStr(key) + ' => $value';
-		}
+        If it is important to distinguish these cases, `exists()` should be
+        used.
 
-		return result + "}";
-	}
+    **/
+    public function get( key : Int64) : Null<T> {
+        if( key ==  null) {
+            return null;
+        }
+
+        var lomap = GetSubMap( Int64.getHigh(key), false);
+        if( lomap == null) {
+            return null;
+        }
+
+        return lomap.get( Int64.getLow(key));
+    }
+
+    /**
+        Returns true if `key` has a mapping, false otherwise.
+        If `key` is null, the result is unspecified.
+    **/
+    public function exists( key : Int64) : Bool {
+        if( key ==  null) {
+            return false;
+        }
+
+        var lomap = GetSubMap( Int64.getHigh(key), false);
+        if( lomap == null) {
+            return false;
+        }
+
+        return lomap.exists( Int64.getLow(key));
+    }
+
+    /**
+        Removes the mapping of `key` and returns true if such a mapping existed,
+        false otherwise. If `key` is null, the result is unspecified.
+    **/
+    public function remove( key : Int64) : Bool {
+        if( key ==  null) {
+            return false;
+        }
+
+        var lomap = GetSubMap( Int64.getHigh(key), false);
+        if( lomap == null) {
+            return false;
+        }
+
+        return lomap.remove( Int64.getLow(key));
+    }
+
+
+    /**
+        Returns an Iterator over the keys of `this` Map.
+        The order of keys is undefined.
+    **/
+    public function keys() : Iterator<Int64> {
+        return new Int64KeyIterator<T>(SubMaps);
+    }
+
+    /**
+        Returns an Iterator over the values of `this` Map.
+        The order of values is undefined.
+    **/
+    public function iterator() : Iterator<T> {
+        return new Int64ValueIterator<T>(SubMaps);
+    }
+
+    /**
+        Returns a String representation of `this` Map.
+        The exact representation depends on the platform and key-type.
+    **/
+    public function toString() : String {
+        var result : String = "{";
+
+        var first = true;
+        for( key in this.keys()) {
+            if( first) {
+                first = false;
+            } else {
+                result += ", ";
+            }
+
+            var value = this.get(key);
+            result += Int64.toStr(key) + ' => $value';
+        }
+
+        return result + "}";
+    }
 
 }
 
-	
+
 // internal helper class for Int64Map<T>
 // all class with matching methods can be used as iterator (duck typing)
 private class Int64MapIteratorBase<T> {
 
-	private var SubMaps : IntMap< IntMap< T>>;  // Hi -> Lo -> Value
-	
-	private var HiIterator : Iterator< Int> = null;
-	private var LoIterator : Iterator< Int> = null;
-	private var CurrentHi : Int = 0;
-	
-	public function new( data : IntMap< IntMap< T>>) : Void {
-		SubMaps = data;
-		HiIterator = SubMaps.keys();
-		LoIterator = null;
-		CurrentHi = 0;
-	};
+    private var SubMaps : IntMap< IntMap< T>>;  // Hi -> Lo -> Value
 
-	/**
-		Returns false if the iteration is complete, true otherwise.
+    private var HiIterator : Iterator< Int> = null;
+    private var LoIterator : Iterator< Int> = null;
+    private var CurrentHi : Int = 0;
 
-		Usually iteration is considered to be complete if all elements of the
-		underlying data structure were handled through calls to next(). However,
-		in custom iterators any logic may be used to determine the completion
-		state.
-	**/
-	public function hasNext() : Bool {
-		
-		if( (LoIterator != null) && LoIterator.hasNext()) {
-			return true;
-		}
-		
-		while( (HiIterator != null) && HiIterator.hasNext()) {
-			CurrentHi = HiIterator.next();
-			LoIterator = SubMaps.get(CurrentHi).keys();
-			if( (LoIterator != null) && LoIterator.hasNext()) {
-				return true;
-			}
-		}
-		
-		HiIterator = null;
-		LoIterator = null;
-		return false;
-	}
+    public function new( data : IntMap< IntMap< T>>) : Void {
+        SubMaps = data;
+        HiIterator = SubMaps.keys();
+        LoIterator = null;
+        CurrentHi = 0;
+    };
+
+    /**
+        Returns false if the iteration is complete, true otherwise.
+
+        Usually iteration is considered to be complete if all elements of the
+        underlying data structure were handled through calls to next(). However,
+        in custom iterators any logic may be used to determine the completion
+        state.
+    **/
+    public function hasNext() : Bool {
+
+        if( (LoIterator != null) && LoIterator.hasNext()) {
+            return true;
+        }
+
+        while( (HiIterator != null) && HiIterator.hasNext()) {
+            CurrentHi = HiIterator.next();
+            LoIterator = SubMaps.get(CurrentHi).keys();
+            if( (LoIterator != null) && LoIterator.hasNext()) {
+                return true;
+            }
+        }
+
+        HiIterator = null;
+        LoIterator = null;
+        return false;
+    }
 
 }
 
@@ -218,23 +218,23 @@
 // all class with matching methods can be used as iterator (duck typing)
 private class Int64KeyIterator<T>extends Int64MapIteratorBase<T> {
 
-	public function new( data : IntMap< IntMap< T>>) : Void {
-		super(data);
-	};
+    public function new( data : IntMap< IntMap< T>>) : Void {
+        super(data);
+    };
 
-	/**
-		Returns the current item of the Iterator and advances to the next one.
+    /**
+        Returns the current item of the Iterator and advances to the next one.
 
-		This method is not required to check hasNext() first. A call to this
-		method while hasNext() is false yields unspecified behavior.
-	**/
-	public function next() : Int64 {
-		if( hasNext()) {
-			return Int64.make( CurrentHi, LoIterator.next());
-		} else {
-			throw "no more elements";
-		}
-	}
+        This method is not required to check hasNext() first. A call to this
+        method while hasNext() is false yields unspecified behavior.
+    **/
+    public function next() : Int64 {
+        if( hasNext()) {
+            return Int64.make( CurrentHi, LoIterator.next());
+        } else {
+            throw "no more elements";
+        }
+    }
 }
 
 
@@ -242,23 +242,23 @@
 // all class with matching methods can be used as iterator (duck typing)
 private class Int64ValueIterator<T> extends Int64MapIteratorBase<T> {
 
-	public function new( data : IntMap< IntMap< T>>) : Void {
-		super(data);
-	};
+    public function new( data : IntMap< IntMap< T>>) : Void {
+        super(data);
+    };
 
-	/**
-		Returns the current item of the Iterator and advances to the next one.
+    /**
+        Returns the current item of the Iterator and advances to the next one.
 
-		This method is not required to check hasNext() first. A call to this
-		method while hasNext() is false yields unspecified behavior.
-	**/
-	public function next() : T {
-		if( hasNext()) {
-			return SubMaps.get(CurrentHi).get(LoIterator.next());
-		} else {
-			throw "no more elements";
-		}
-	}
+        This method is not required to check hasNext() first. A call to this
+        method while hasNext() is false yields unspecified behavior.
+    **/
+    public function next() : T {
+        if( hasNext()) {
+            return SubMaps.get(CurrentHi).get(LoIterator.next());
+        } else {
+            throw "no more elements";
+        }
+    }
 }
 
 
diff --git a/lib/haxe/src/org/apache/thrift/helper/IntSet.hx b/lib/haxe/src/org/apache/thrift/helper/IntSet.hx
index 214f3bd..91e5d8e 100644
--- a/lib/haxe/src/org/apache/thrift/helper/IntSet.hx
+++ b/lib/haxe/src/org/apache/thrift/helper/IntSet.hx
@@ -18,79 +18,79 @@
  */
 
 package org.apache.thrift.helper;
-  
+
 import Map;
 
 
 class IntSet {
-    
+
     private var _elements = new haxe.ds.IntMap<Int>();
     private var _size : Int = 0;
     public var size(get,never) : Int;
-    
+
     public function new( values : Array<Int> = null) {
-		if ( values != null) {
-			for ( value in values) {
-				 add(value);
-			}
-		}
+        if ( values != null) {
+            for ( value in values) {
+                 add(value);
+            }
+        }
     }
 
-	public function iterator():Iterator<Int> {
-		return _elements.keys();
-	}
+    public function iterator():Iterator<Int> {
+        return _elements.keys();
+    }
 
-	public function traceAll() : Void {
-		trace('$_size entries');
-		for(entry in this) {
-			var yes = contains(entry);
-			trace('- $entry, contains() = $yes');
-		}
-	}
+    public function traceAll() : Void {
+        trace('$_size entries');
+        for(entry in this) {
+            var yes = contains(entry);
+            trace('- $entry, contains() = $yes');
+        }
+    }
 
     public function add(o : Int) : Bool {
-		if( _elements.exists(o)) {
-			return false;
-		}
+        if( _elements.exists(o)) {
+            return false;
+        }
         _size++;
         _elements.set(o,_size);
-		return true;
+        return true;
     }
 
     public function clear() : Void {
-		while( _size > 0) {
-			remove( _elements.keys().next());			
-		}
+        while( _size > 0) {
+            remove( _elements.keys().next());
+        }
     }
-    
+
     public function contains(o : Int) : Bool {
-		return _elements.exists(o);
+        return _elements.exists(o);
     }
-    
+
     public function isEmpty() : Bool {
-		return _size == 0;
+        return _size == 0;
     }
-    
+
     public function remove(o : Int) : Bool {
-		if (contains(o)) {
-			_elements.remove(o);
-			_size--;
-			return true;
-		} else {
-			return false;
-		}
+        if (contains(o)) {
+            _elements.remove(o);
+            _size--;
+            return true;
+        } else {
+            return false;
+        }
     }
-    
+
     public function toArray() : Array<Int> {
-		var ret : Array<Int> = new Array<Int>();
-		for (key in _elements.keys()) {
-			ret.push(key);
-		}
-		return ret;
+        var ret : Array<Int> = new Array<Int>();
+        for (key in _elements.keys()) {
+            ret.push(key);
+        }
+        return ret;
     }
-    
-    public function get_size() : Int {		
-		return _size;
+
+    public function get_size() : Int {
+        return _size;
     }
 }
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/helper/ObjectSet.hx b/lib/haxe/src/org/apache/thrift/helper/ObjectSet.hx
index c590c75..bcf72fb 100644
--- a/lib/haxe/src/org/apache/thrift/helper/ObjectSet.hx
+++ b/lib/haxe/src/org/apache/thrift/helper/ObjectSet.hx
@@ -18,79 +18,79 @@
  */
 
 package org.apache.thrift.helper;
-  
+
 import Map;
 
 
 class ObjectSet<K> {
-    
+
     private var _elements = new haxe.ds.ObjectMap<K,Int>();
     private var _size : Int = 0;
     public var size(get,never) : Int;
-    
+
     public function new( values : Array<K> = null) {
-		if ( values != null) {
-			for ( value in values) {
-				 add(value);
-			}
-		}
+        if ( values != null) {
+            for ( value in values) {
+                 add(value);
+            }
+        }
     }
 
-	public function iterator():Iterator<K> {
-		return _elements.keys();
-	}
+    public function iterator():Iterator<K> {
+        return _elements.keys();
+    }
 
-	public function traceAll() : Void {
-		trace('$_size entries');
-		for(entry in this) {
-			var yes = contains(entry);
-			trace('- $entry, contains() = $yes');
-		}
-	}
+    public function traceAll() : Void {
+        trace('$_size entries');
+        for(entry in this) {
+            var yes = contains(entry);
+            trace('- $entry, contains() = $yes');
+        }
+    }
 
     public function add(o : K) : Bool {
-		if( _elements.exists(o)) {
-			return false;
-		}
+        if( _elements.exists(o)) {
+            return false;
+        }
         _size++;
         _elements.set(o,_size);
-		return true;
+        return true;
     }
 
     public function clear() : Void {
-		while( _size > 0) {
-			remove( _elements.keys().next());			
-		}
+        while( _size > 0) {
+            remove( _elements.keys().next());
+        }
     }
-    
+
     public function contains(o : K) : Bool {
-		return _elements.exists(o);
+        return _elements.exists(o);
     }
-    
+
     public function isEmpty() : Bool {
-		return _size == 0;
+        return _size == 0;
     }
-    
+
     public function remove(o : K) : Bool {
-		if (contains(o)) {
-			_elements.remove(o);
-			_size--;
-			return true;
-		} else {
-			return false;
-		}
+        if (contains(o)) {
+            _elements.remove(o);
+            _size--;
+            return true;
+        } else {
+            return false;
+        }
     }
-    
+
     public function toArray() : Array<K> {
-		var ret : Array<K> = new Array<K>();
-		for (key in _elements.keys()) {
-			ret.push(key);
-		}
-		return ret;
+        var ret : Array<K> = new Array<K>();
+        for (key in _elements.keys()) {
+            ret.push(key);
+        }
+        return ret;
     }
-    
-    public function get_size() : Int {		
-		return _size;
+
+    public function get_size() : Int {
+        return _size;
     }
 }
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/helper/StringSet.hx b/lib/haxe/src/org/apache/thrift/helper/StringSet.hx
index ee772c7..d8c0d90 100644
--- a/lib/haxe/src/org/apache/thrift/helper/StringSet.hx
+++ b/lib/haxe/src/org/apache/thrift/helper/StringSet.hx
@@ -18,79 +18,79 @@
  */
 
 package org.apache.thrift.helper;
-  
+
 import Map;
 
 
 class StringSet {
-    
+
     private var _elements = new haxe.ds.StringMap<Int>();
     private var _size : Int = 0;
     public var size(get,never) : Int;
-    
+
     public function new( values : Array<String> = null) {
-		if ( values != null) {
-			for ( value in values) {
-				 add(value);
-			}
-		}
+        if ( values != null) {
+            for ( value in values) {
+                 add(value);
+            }
+        }
     }
 
-	public function iterator():Iterator<String> {
-		return _elements.keys();
-	}
+    public function iterator():Iterator<String> {
+        return _elements.keys();
+    }
 
-	public function traceAll() : Void {
-		trace('$_size entries');
-		for(entry in this) {
-			var yes = contains(entry);
-			trace('- $entry, contains() = $yes');
-		}
-	}
+    public function traceAll() : Void {
+        trace('$_size entries');
+        for(entry in this) {
+            var yes = contains(entry);
+            trace('- $entry, contains() = $yes');
+        }
+    }
 
     public function add(o : String) : Bool {
-		if( _elements.exists(o)) {
-			return false;
-		}
+        if( _elements.exists(o)) {
+            return false;
+        }
         _size++;
         _elements.set(o,_size);
-		return true;
+        return true;
     }
 
     public function clear() : Void {
-		while( _size > 0) {
-			remove( _elements.keys().next());			
-		}
+        while( _size > 0) {
+            remove( _elements.keys().next());
+        }
     }
-    
+
     public function contains(o : String) : Bool {
-		return _elements.exists(o);
+        return _elements.exists(o);
     }
-    
+
     public function isEmpty() : Bool {
-		return _size == 0;
+        return _size == 0;
     }
-    
+
     public function remove(o : String) : Bool {
-		if (contains(o)) {
-			_elements.remove(o);
-			_size--;
-			return true;
-		} else {
-			return false;
-		}
+        if (contains(o)) {
+            _elements.remove(o);
+            _size--;
+            return true;
+        } else {
+            return false;
+        }
     }
-    
+
     public function toArray() : Array<String> {
-		var ret : Array<String> = new Array<String>();
-		for (key in _elements.keys()) {
-			ret.push(key);
-		}
-		return ret;
+        var ret : Array<String> = new Array<String>();
+        for (key in _elements.keys()) {
+            ret.push(key);
+        }
+        return ret;
     }
-    
-    public function get_size() : String {		
-		return _size;
+
+    public function get_size() : String {
+        return _size;
     }
 }
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/FieldMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/FieldMetaData.hx
index 147eed9..26db113 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/FieldMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/FieldMetaData.hx
@@ -27,19 +27,19 @@
 *
 */
 class FieldMetaData {
-  
+
   public var fieldName : String;
   public var requirementType : Int;
   public var valueMetaData:FieldValueMetaData;
-  
+
   private static var structMap:Dictionary = new Dictionary();
-  
+
   public function FieldMetaData(name : String, req : Int, vMetaData:FieldValueMetaData) {
     this.fieldName = name;
     this.requirementType = req;
     this.valueMetaData = vMetaData;
   }
-  
+
   public static function addStructMetaDataMap(sClass:Class, map:Dictionary) : Void{
     structMap[sClass] = map;
   }
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/FieldValueMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/FieldValueMetaData.hx
index 06c7f48..8879d91 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/FieldValueMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/FieldValueMetaData.hx
@@ -26,17 +26,17 @@
  * the value(s) of a field
  */
 class FieldValueMetaData {
-  
-  public var type : Int;  
- 
+
+  public var type : Int;
+
   public function FieldValueMetaData(type : Int) {
     this.type = type;
   }
-  
+
   public function isStruct() : Bool {
-    return type == TType.STRUCT; 
+    return type == TType.STRUCT;
   }
-  
+
   public function isContainer() : Bool {
     return type == TType.LIST || type == TType.MAP || type == TType.SET;
   }
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/ListMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/ListMetaData.hx
index 36bb2d1..40ca31b 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/ListMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/ListMetaData.hx
@@ -18,13 +18,14 @@
  */
 
 package org.apache.thrift.meta_data;
-  
+
 class ListMetaData extends FieldValueMetaData {
-    
+
     public var elemMetaData:FieldValueMetaData;
-  
+
     public function ListMetaData(type : Int, eMetaData:FieldValueMetaData) {
       super(type);
       this.elemMetaData = eMetaData;
-    }    
+    }
 }
+ 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/MapMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/MapMetaData.hx
index bf0502a..5463e62 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/MapMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/MapMetaData.hx
@@ -20,13 +20,14 @@
 package org.apache.thrift.meta_data;
 
 class MapMetaData extends FieldValueMetaData {
-  
+
     public var keyMetaData:FieldValueMetaData;
     public var valueMetaData:FieldValueMetaData;
-  
+
     public function MapMetaData(type : Int, kMetaData:FieldValueMetaData, vMetaData:FieldValueMetaData) {
       super(type);
       this.keyMetaData = kMetaData;
       this.valueMetaData = vMetaData;
     }
-}    
+}
+   
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/SetMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/SetMetaData.hx
index 0ee6c93..a3367f4 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/SetMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/SetMetaData.hx
@@ -20,11 +20,11 @@
 package org.apache.thrift.meta_data;
 
 class SetMetaData extends FieldValueMetaData {
-  
+
     public var elemMetaData:FieldValueMetaData;
-  
+
     public function SetMetaData(type : Int, eMetaData:FieldValueMetaData) {
       super(type);
-      this.elemMetaData = eMetaData; 
+      this.elemMetaData = eMetaData;
     }
 }
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/StructMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/StructMetaData.hx
index bbf11e7..1822dd3 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/StructMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/StructMetaData.hx
@@ -20,9 +20,9 @@
 package org.apache.thrift.meta_data;
 
 class StructMetaData extends FieldValueMetaData {
-    
+
     public var structClass:Class;
-  
+
     public function StructMetaData(type : Int, sClass:Class) {
       super(type);
       this.structClass = sClass;
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx b/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx
index 9693b35..c37b74e 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx
@@ -33,264 +33,264 @@
 */
 class TBinaryProtocol implements TProtocol {
 
-	private static var ANONYMOUS_STRUCT:TStruct = new TStruct();
+    private static var ANONYMOUS_STRUCT:TStruct = new TStruct();
 
-	private static inline var VERSION_MASK : haxe.Int32 = 0xffff0000;
-	private static inline var VERSION_1 : haxe.Int32 = 0x80010000;
+    private static inline var VERSION_MASK : haxe.Int32 = 0xffff0000;
+    private static inline var VERSION_1 : haxe.Int32 = 0x80010000;
 
-	private var strictRead_ : Bool = false;
-	private var strictWrite_ : Bool = true;
-	private var trans_ : TTransport;
+    private var strictRead_ : Bool = false;
+    private var strictWrite_ : Bool = true;
+    private var trans_ : TTransport;
 
-	/**
-	 * Constructor
-	 */
-	public function new(trans:TTransport, strictRead : Bool=false, strictWrite : Bool=true) {
-	  trans_ = trans;
-	  strictRead_ = strictRead;
-	  strictWrite_ = strictWrite;
-	}
+    /**
+     * Constructor
+     */
+    public function new(trans:TTransport, strictRead : Bool=false, strictWrite : Bool=true) {
+      trans_ = trans;
+      strictRead_ = strictRead;
+      strictWrite_ = strictWrite;
+    }
 
-	public function getTransport():TTransport {
-	  return trans_;
-	}
+    public function getTransport():TTransport {
+      return trans_;
+    }
 
-	public function writeMessageBegin(message:TMessage) : Void {
-		if (strictWrite_) {
-		  var version : Int = VERSION_1 | message.type;
-		  writeI32(version);
-		  writeString(message.name);
-		  writeI32(message.seqid);
-		} else {
-		  writeString(message.name);
-		  writeByte(message.type);
-		  writeI32(message.seqid);
-		}
-	}
+    public function writeMessageBegin(message:TMessage) : Void {
+        if (strictWrite_) {
+          var version : Int = VERSION_1 | message.type;
+          writeI32(version);
+          writeString(message.name);
+          writeI32(message.seqid);
+        } else {
+          writeString(message.name);
+          writeByte(message.type);
+          writeI32(message.seqid);
+        }
+    }
 
     public function writeMessageEnd() : Void {}
 
-	public function writeStructBegin(struct:TStruct) : Void {}
+    public function writeStructBegin(struct:TStruct) : Void {}
 
-	public function writeStructEnd() : Void {}
+    public function writeStructEnd() : Void {}
 
-	public function writeFieldBegin(field:TField) : Void {
-	  writeByte(field.type);
-	  writeI16(field.id);
-	}
+    public function writeFieldBegin(field:TField) : Void {
+      writeByte(field.type);
+      writeI16(field.id);
+    }
 
-	public function writeFieldEnd() : Void {}
+    public function writeFieldEnd() : Void {}
 
-	public function writeFieldStop() : Void {
-	  writeByte(TType.STOP);
-	}
+    public function writeFieldStop() : Void {
+      writeByte(TType.STOP);
+    }
 
-	public function writeMapBegin(map:TMap) : Void {
-	  writeByte(map.keyType);
-	  writeByte(map.valueType);
-	  writeI32(map.size);
-	}
+    public function writeMapBegin(map:TMap) : Void {
+      writeByte(map.keyType);
+      writeByte(map.valueType);
+      writeI32(map.size);
+    }
 
-	public function writeMapEnd() : Void {}
+    public function writeMapEnd() : Void {}
 
-	public function writeListBegin(list:TList) : Void {
-		writeByte(list.elemType);
-		writeI32(list.size);
-	}
+    public function writeListBegin(list:TList) : Void {
+        writeByte(list.elemType);
+        writeI32(list.size);
+    }
 
-	public function writeListEnd() : Void {}
+    public function writeListEnd() : Void {}
 
-	public function writeSetBegin(set:TSet) : Void {
-		writeByte(set.elemType);
-		writeI32(set.size);
-	}
+    public function writeSetBegin(set:TSet) : Void {
+        writeByte(set.elemType);
+        writeI32(set.size);
+    }
 
-	public function writeSetEnd() : Void {}
+    public function writeSetEnd() : Void {}
 
-	public function writeBool(b : Bool) : Void {
-		writeByte(b ? 1 : 0);
-	}
+    public function writeBool(b : Bool) : Void {
+        writeByte(b ? 1 : 0);
+    }
 
 
-	public function writeByte(b : Int) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeByte(b);
-		trans_.write(out.getBytes(), 0, 1);
-	}
+    public function writeByte(b : Int) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeByte(b);
+        trans_.write(out.getBytes(), 0, 1);
+    }
 
-	public function writeI16(i16 : Int) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeInt16(i16);
-		trans_.write(out.getBytes(), 0, 2);
-	}
+    public function writeI16(i16 : Int) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeInt16(i16);
+        trans_.write(out.getBytes(), 0, 2);
+    }
 
-	public function writeI32(i32 : Int) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeInt32(i32);
-		trans_.write(out.getBytes(), 0, 4);
-	}
+    public function writeI32(i32 : Int) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeInt32(i32);
+        trans_.write(out.getBytes(), 0, 4);
+    }
 
-	public function writeI64(i64 : haxe.Int64) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		var hi = Int64.getHigh(i64);
-		var lo = Int64.getLow(i64);
-		out.writeInt32(hi);
-		out.writeInt32(lo);
-		trans_.write(out.getBytes(), 0, 8);
-	}
+    public function writeI64(i64 : haxe.Int64) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        var hi = Int64.getHigh(i64);
+        var lo = Int64.getLow(i64);
+        out.writeInt32(hi);
+        out.writeInt32(lo);
+        trans_.write(out.getBytes(), 0, 8);
+    }
 
-	public function writeDouble(dub:Float) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeDouble(dub);
-		trans_.write(out.getBytes(), 0, 8);
-	}
+    public function writeDouble(dub:Float) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeDouble(dub);
+        trans_.write(out.getBytes(), 0, 8);
+    }
 
-	public function writeString(str : String) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeString(str);
-		var bytes = out.getBytes();
-		writeI32( bytes.length);
-		trans_.write( bytes, 0, bytes.length);
-	}
+    public function writeString(str : String) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeString(str);
+        var bytes = out.getBytes();
+        writeI32( bytes.length);
+        trans_.write( bytes, 0, bytes.length);
+    }
 
-	public function writeBinary(bin:Bytes) : Void {
-		writeI32(bin.length);
-		trans_.write(bin, 0, bin.length);
-	}
+    public function writeBinary(bin:Bytes) : Void {
+        writeI32(bin.length);
+        trans_.write(bin, 0, bin.length);
+    }
 
-	/**
-	 * Reading methods.
-	 */
+    /**
+     * Reading methods.
+     */
 
-	public function readMessageBegin():TMessage {
-		var size : Int = readI32();
-		if (size < 0) {
-			var version : Int = size & VERSION_MASK;
-			if (version != VERSION_1) {
-				throw new TProtocolException(TProtocolException.BAD_VERSION, "Bad version in readMessageBegin");
-			}
-			return new TMessage(readString(), size & 0x000000ff, readI32());
-		} else {
-			if (strictRead_) {
-				throw new TProtocolException(TProtocolException.BAD_VERSION, "Missing version in readMessageBegin, old client?");
-			}
-			return new TMessage(readStringBody(size), readByte(), readI32());
-		}
-	}
+    public function readMessageBegin():TMessage {
+        var size : Int = readI32();
+        if (size < 0) {
+            var version : Int = size & VERSION_MASK;
+            if (version != VERSION_1) {
+                throw new TProtocolException(TProtocolException.BAD_VERSION, "Bad version in readMessageBegin");
+            }
+            return new TMessage(readString(), size & 0x000000ff, readI32());
+        } else {
+            if (strictRead_) {
+                throw new TProtocolException(TProtocolException.BAD_VERSION, "Missing version in readMessageBegin, old client?");
+            }
+            return new TMessage(readStringBody(size), readByte(), readI32());
+        }
+    }
 
-	public function readMessageEnd() : Void {}
+    public function readMessageEnd() : Void {}
 
-	public function readStructBegin():TStruct {
-		return ANONYMOUS_STRUCT;
-	}
+    public function readStructBegin():TStruct {
+        return ANONYMOUS_STRUCT;
+    }
 
-	public function readStructEnd() : Void {}
+    public function readStructEnd() : Void {}
 
-	public function readFieldBegin() : TField {
-		var type : Int = readByte();
-		var id : Int = 0;
-		if (type != TType.STOP)
-		{
-			id = readI16();
-		}
-		return new TField("", type, id);
-	}
+    public function readFieldBegin() : TField {
+        var type : Int = readByte();
+        var id : Int = 0;
+        if (type != TType.STOP)
+        {
+            id = readI16();
+        }
+        return new TField("", type, id);
+    }
 
-	public function readFieldEnd() : Void {}
+    public function readFieldEnd() : Void {}
 
-	public function readMapBegin() : TMap {
-		return new TMap(readByte(), readByte(), readI32());
-	}
+    public function readMapBegin() : TMap {
+        return new TMap(readByte(), readByte(), readI32());
+    }
 
-	public function readMapEnd() : Void {}
+    public function readMapEnd() : Void {}
 
-	public function readListBegin():TList {
-		return new TList(readByte(), readI32());
-	}
+    public function readListBegin():TList {
+        return new TList(readByte(), readI32());
+    }
 
-	public function readListEnd() : Void {}
+    public function readListEnd() : Void {}
 
-	public function readSetBegin() : TSet {
-	  return new TSet(readByte(), readI32());
-	}
+    public function readSetBegin() : TSet {
+      return new TSet(readByte(), readI32());
+    }
 
-	public function readSetEnd() : Void {}
+    public function readSetEnd() : Void {}
 
-	public function readBool() : Bool {
-		return (readByte() == 1);
-	}
+    public function readBool() : Bool {
+        return (readByte() == 1);
+    }
 
 
-	public function readByte() : Int {
-		var buffer = new BytesBuffer();
-		var len = trans_.readAll( buffer, 0, 1);        
-		var inp = new BytesInput( buffer.getBytes(), 0, 1);
-		inp.bigEndian = true;
-		return inp.readByte();
-	}
+    public function readByte() : Int {
+        var buffer = new BytesBuffer();
+        var len = trans_.readAll( buffer, 0, 1);
+        var inp = new BytesInput( buffer.getBytes(), 0, 1);
+        inp.bigEndian = true;
+        return inp.readByte();
+    }
 
-	public function readI16() : Int {
-		var buffer = new BytesBuffer();
-		var len = trans_.readAll( buffer, 0, 2);        
-		var inp = new BytesInput( buffer.getBytes(), 0, 2);
-		inp.bigEndian = true;
-		return inp.readInt16();
-	}
+    public function readI16() : Int {
+        var buffer = new BytesBuffer();
+        var len = trans_.readAll( buffer, 0, 2);
+        var inp = new BytesInput( buffer.getBytes(), 0, 2);
+        inp.bigEndian = true;
+        return inp.readInt16();
+    }
 
-	public function readI32() : Int {
-		var buffer = new BytesBuffer();
-		var len = trans_.readAll( buffer, 0, 4);        
-		var inp = new BytesInput( buffer.getBytes(), 0, 4);
-		inp.bigEndian = true;
-		return inp.readInt32();
-	}
+    public function readI32() : Int {
+        var buffer = new BytesBuffer();
+        var len = trans_.readAll( buffer, 0, 4);
+        var inp = new BytesInput( buffer.getBytes(), 0, 4);
+        inp.bigEndian = true;
+        return inp.readInt32();
+    }
 
-	public function readI64() : haxe.Int64 {
-		var buffer = new BytesBuffer();
-		var len = trans_.readAll( buffer, 0, 8);        
-		var inp = new BytesInput( buffer.getBytes(), 0, 8);
-		inp.bigEndian = true;
-		var hi = inp.readInt32();
-		var lo = inp.readInt32();
-		return Int64.make(hi,lo);
-	}
+    public function readI64() : haxe.Int64 {
+        var buffer = new BytesBuffer();
+        var len = trans_.readAll( buffer, 0, 8);
+        var inp = new BytesInput( buffer.getBytes(), 0, 8);
+        inp.bigEndian = true;
+        var hi = inp.readInt32();
+        var lo = inp.readInt32();
+        return Int64.make(hi,lo);
+    }
 
-	public function readDouble():Float {
-		var buffer = new BytesBuffer();
-		var len = trans_.readAll( buffer, 0, 8);        
-		var inp = new BytesInput( buffer.getBytes(), 0, 8);
-		inp.bigEndian = true;
-		return inp.readDouble();
-	}
+    public function readDouble():Float {
+        var buffer = new BytesBuffer();
+        var len = trans_.readAll( buffer, 0, 8);
+        var inp = new BytesInput( buffer.getBytes(), 0, 8);
+        inp.bigEndian = true;
+        return inp.readDouble();
+    }
 
-	public function readString() : String {
-		return readStringBody( readI32());
-	}
+    public function readString() : String {
+        return readStringBody( readI32());
+    }
 
-	public function readStringBody(len : Int) : String {
-		if( len > 0) {
-			var buffer = new BytesBuffer();
-			trans_.readAll( buffer, 0, len);
-			var inp = new BytesInput( buffer.getBytes(), 0, len);
-			inp.bigEndian = true;
-			return inp.readString(len);
-		} else {
-			return "";
-		}
-	}
+    public function readStringBody(len : Int) : String {
+        if( len > 0) {
+            var buffer = new BytesBuffer();
+            trans_.readAll( buffer, 0, len);
+            var inp = new BytesInput( buffer.getBytes(), 0, len);
+            inp.bigEndian = true;
+            return inp.readString(len);
+        } else {
+            return "";
+        }
+    }
 
-	public function readBinary() : Bytes {
-		var len : Int = readI32();
-		var buffer = new BytesBuffer();
-		trans_.readAll( buffer, 0, len);
-		return buffer.getBytes();
-	}
+    public function readBinary() : Bytes {
+        var len : Int = readI32();
+        var buffer = new BytesBuffer();
+        trans_.readAll( buffer, 0, len);
+        return buffer.getBytes();
+    }
 
 }
 
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocolFactory.hx b/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocolFactory.hx
index 0d7c7c5..f4a9bec 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocolFactory.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocolFactory.hx
@@ -26,20 +26,20 @@
 * Binary Protocol Factory
 */
 class TBinaryProtocolFactory implements TProtocolFactory {
-	
-	private var strictRead_ : Bool = false;
-	private var strictWrite_ : Bool = true;
 
-	public function new( strictRead : Bool = false, strictWrite : Bool = true) {
-		strictRead_  = strictRead;
-		strictWrite_ = strictWrite;
-	}
+    private var strictRead_ : Bool = false;
+    private var strictWrite_ : Bool = true;
 
-	public function getProtocol( trans : TTransport) : TProtocol  {
-		return new TBinaryProtocol( trans, strictRead_, strictWrite_);
-	}
+    public function new( strictRead : Bool = false, strictWrite : Bool = true) {
+        strictRead_  = strictRead;
+        strictWrite_ = strictWrite;
+    }
+
+    public function getProtocol( trans : TTransport) : TProtocol  {
+        return new TBinaryProtocol( trans, strictRead_, strictWrite_);
+    }
 }
 
 
 
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TField.hx b/lib/haxe/src/org/apache/thrift/protocol/TField.hx
index 20f3fb9..3f5498d 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TField.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TField.hx
@@ -16,28 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.protocol;
-    
+
 class TField {
-    
+
     public var name : String;
     public var type : Int;
     public var id : Int;
-      
+
     public function new(n : String = "", t : Int = 0, i : Int = 0) {
       name = n;
       type = t;
       id = i;
     }
-    
+
     public function toString() : String {
       return '<TField name:"$name" type:"$type" field-id:"$id">';
     }
-    
+
     public function equals( otherField : TField) : Bool {
-      return (type == otherField.type) 
+      return (type == otherField.type)
           && (id == otherField.id);
     }
-  
+
 }
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx b/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx
index 1a93332..aeed8f4 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx
@@ -47,747 +47,747 @@
 */
 class TJSONProtocol implements TProtocol {
 
-	public var trans(default,null) : TTransport;
+    public var trans(default,null) : TTransport;
 
-	// Stack of nested contexts that we may be in
-	private var contextStack : GenericStack<JSONBaseContext> = new GenericStack<JSONBaseContext>();
+    // Stack of nested contexts that we may be in
+    private var contextStack : GenericStack<JSONBaseContext> = new GenericStack<JSONBaseContext>();
 
-	// Current context that we are in
-	private var context : JSONBaseContext;
+    // Current context that we are in
+    private var context : JSONBaseContext;
 
-	// Reader that manages a 1-byte buffer
-	private var reader : LookaheadReader;
+    // Reader that manages a 1-byte buffer
+    private var reader : LookaheadReader;
 
-	// whether the underlying system holds Strings as UTF-8
-	// http://old.haxe.org/manual/encoding
-	private static var utf8Strings = haxe.Utf8.validate("Ç-ß-Æ-Ю-Ш");
+    // whether the underlying system holds Strings as UTF-8
+    // http://old.haxe.org/manual/encoding
+    private static var utf8Strings = haxe.Utf8.validate("Ç-ß-Æ-Ю-Ш");
 
-	// TJSONProtocol Constructor
-	public function new( trans : TTransport)
-	{
-		this.trans = trans;
-		this.context = new JSONBaseContext(this);
-		this.reader = new LookaheadReader(this);
-	}
+    // TJSONProtocol Constructor
+    public function new( trans : TTransport)
+    {
+        this.trans = trans;
+        this.context = new JSONBaseContext(this);
+        this.reader = new LookaheadReader(this);
+    }
 
-	public function getTransport() : TTransport {
-	  return trans;
-	}
+    public function getTransport() : TTransport {
+      return trans;
+    }
 
-	public function writeMessageBegin(message:TMessage) : Void {
-		WriteJSONArrayStart();
-		WriteJSONInteger( JSONConstants.VERSION);
-		WriteJSONString( BytesFromString(message.name));
-		WriteJSONInteger( message.type);
-		WriteJSONInteger( message.seqid);
-	}
+    public function writeMessageBegin(message:TMessage) : Void {
+        WriteJSONArrayStart();
+        WriteJSONInteger( JSONConstants.VERSION);
+        WriteJSONString( BytesFromString(message.name));
+        WriteJSONInteger( message.type);
+        WriteJSONInteger( message.seqid);
+    }
 
-	public function writeMessageEnd() : Void {
-		WriteJSONArrayEnd();
-	}
+    public function writeMessageEnd() : Void {
+        WriteJSONArrayEnd();
+    }
 
-	public function writeStructBegin(struct:TStruct) : Void {
-		WriteJSONObjectStart();
-	}
+    public function writeStructBegin(struct:TStruct) : Void {
+        WriteJSONObjectStart();
+    }
 
-	public function writeStructEnd() : Void {
-		WriteJSONObjectEnd();
-	}
+    public function writeStructEnd() : Void {
+        WriteJSONObjectEnd();
+    }
 
-	public function writeFieldBegin(field:TField) : Void {
-		WriteJSONInteger( field.id );
-		WriteJSONObjectStart();
-		WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( field.type)));
-	}
+    public function writeFieldBegin(field:TField) : Void {
+        WriteJSONInteger( field.id );
+        WriteJSONObjectStart();
+        WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( field.type)));
+    }
 
-	public function writeFieldEnd() : Void {
-		WriteJSONObjectEnd();
-	}
+    public function writeFieldEnd() : Void {
+        WriteJSONObjectEnd();
+    }
 
-	public function writeFieldStop() : Void { }
+    public function writeFieldStop() : Void { }
 
-	public function writeMapBegin(map:TMap) : Void {
-		WriteJSONArrayStart();
-		WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( map.keyType)));
-		WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( map.valueType)));
-		WriteJSONInteger( map.size);
-		WriteJSONObjectStart();
-	}
+    public function writeMapBegin(map:TMap) : Void {
+        WriteJSONArrayStart();
+        WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( map.keyType)));
+        WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( map.valueType)));
+        WriteJSONInteger( map.size);
+        WriteJSONObjectStart();
+    }
 
-	public function writeMapEnd() : Void {
-		WriteJSONObjectEnd();
-		WriteJSONArrayEnd();
-	}
+    public function writeMapEnd() : Void {
+        WriteJSONObjectEnd();
+        WriteJSONArrayEnd();
+    }
 
-	public function writeListBegin(list:TList) : Void {
-		WriteJSONArrayStart();
-		WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( list.elemType )));
-		WriteJSONInteger( list.size);
-	}
+    public function writeListBegin(list:TList) : Void {
+        WriteJSONArrayStart();
+        WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( list.elemType )));
+        WriteJSONInteger( list.size);
+    }
 
-	public function writeListEnd() : Void {
-		WriteJSONArrayEnd();
-	}
+    public function writeListEnd() : Void {
+        WriteJSONArrayEnd();
+    }
 
-	public function writeSetBegin(set:TSet) : Void {
-		WriteJSONArrayStart();
-		WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( set.elemType)));
-		WriteJSONInteger( set.size);
-	}
+    public function writeSetBegin(set:TSet) : Void {
+        WriteJSONArrayStart();
+        WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( set.elemType)));
+        WriteJSONInteger( set.size);
+    }
 
-	public function writeSetEnd() : Void {
-		WriteJSONArrayEnd();
-	}
+    public function writeSetEnd() : Void {
+        WriteJSONArrayEnd();
+    }
 
-	public function writeBool(b : Bool) : Void {
-		if( b)
-			WriteJSONInteger( 1);
-		else
-			WriteJSONInteger( 0);
-	}
+    public function writeBool(b : Bool) : Void {
+        if( b)
+            WriteJSONInteger( 1);
+        else
+            WriteJSONInteger( 0);
+    }
 
-	public function writeByte(b : Int) : Void {
-		WriteJSONInteger( b);
-	}
+    public function writeByte(b : Int) : Void {
+        WriteJSONInteger( b);
+    }
 
-	public function writeI16(i16 : Int) : Void {
-		WriteJSONInteger( i16);
-	}
+    public function writeI16(i16 : Int) : Void {
+        WriteJSONInteger( i16);
+    }
 
-	public function writeI32(i32 : Int) : Void {
-		WriteJSONInteger( i32);
-	}
+    public function writeI32(i32 : Int) : Void {
+        WriteJSONInteger( i32);
+    }
 
-	public function writeI64(i64 : haxe.Int64) : Void {
-		WriteJSONInt64( i64);
-	}
+    public function writeI64(i64 : haxe.Int64) : Void {
+        WriteJSONInt64( i64);
+    }
 
-	public function writeDouble(dub:Float) : Void {
-		WriteJSONDouble(dub);
-	}
+    public function writeDouble(dub:Float) : Void {
+        WriteJSONDouble(dub);
+    }
 
-	public function writeString(str : String) : Void {
-		WriteJSONString( BytesFromString(str));
-	}
+    public function writeString(str : String) : Void {
+        WriteJSONString( BytesFromString(str));
+    }
 
-	public function writeBinary(bin:Bytes) : Void {
-		WriteJSONBase64(bin);
-	}
+    public function writeBinary(bin:Bytes) : Void {
+        WriteJSONBase64(bin);
+    }
 
-	public function readMessageBegin():TMessage {
-		var message : TMessage = new TMessage();
-		ReadJSONArrayStart();
-		if (ReadJSONInteger() != JSONConstants.VERSION)
-		{
-			throw new TProtocolException(TProtocolException.BAD_VERSION,
-										 "Message contained bad version.");
-		}
+    public function readMessageBegin():TMessage {
+        var message : TMessage = new TMessage();
+        ReadJSONArrayStart();
+        if (ReadJSONInteger() != JSONConstants.VERSION)
+        {
+            throw new TProtocolException(TProtocolException.BAD_VERSION,
+                                         "Message contained bad version.");
+        }
 
-		message.name = ReadJSONString(false);
-		message.type = ReadJSONInteger();
-		message.seqid = ReadJSONInteger();
-		return message;
-	}
+        message.name = ReadJSONString(false);
+        message.type = ReadJSONInteger();
+        message.seqid = ReadJSONInteger();
+        return message;
+    }
 
-	public function readMessageEnd() : Void {
-		ReadJSONArrayEnd();
-	}
+    public function readMessageEnd() : Void {
+        ReadJSONArrayEnd();
+    }
 
-	public function readStructBegin():TStruct {
-		ReadJSONObjectStart();
-		return new TStruct();
-	}
+    public function readStructBegin():TStruct {
+        ReadJSONObjectStart();
+        return new TStruct();
+    }
 
-	public function readStructEnd() : Void {
-		ReadJSONObjectEnd();
-	}
+    public function readStructEnd() : Void {
+        ReadJSONObjectEnd();
+    }
 
-	public function readFieldBegin() : TField {
-		var field : TField = new TField();
-		var ch = reader.Peek();
-		if (StringFromBytes(ch) == JSONConstants.RBRACE)
-		{
-			field.type = TType.STOP;
-		}
-		else
-		{
-			field.id = ReadJSONInteger();
-			ReadJSONObjectStart();
-			field.type = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
-		}
-		return field;
-	}
+    public function readFieldBegin() : TField {
+        var field : TField = new TField();
+        var ch = reader.Peek();
+        if (StringFromBytes(ch) == JSONConstants.RBRACE)
+        {
+            field.type = TType.STOP;
+        }
+        else
+        {
+            field.id = ReadJSONInteger();
+            ReadJSONObjectStart();
+            field.type = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
+        }
+        return field;
+    }
 
-	public function readFieldEnd() : Void {
-		ReadJSONObjectEnd();
-	}
+    public function readFieldEnd() : Void {
+        ReadJSONObjectEnd();
+    }
 
-	public function readMapBegin() : TMap {
-		ReadJSONArrayStart();
-		var KeyType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
-		var ValueType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
-		var Count : Int = ReadJSONInteger();
-		ReadJSONObjectStart();
+    public function readMapBegin() : TMap {
+        ReadJSONArrayStart();
+        var KeyType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
+        var ValueType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
+        var Count : Int = ReadJSONInteger();
+        ReadJSONObjectStart();
 
-		var map = new TMap( KeyType, ValueType, Count);
-		return map;
-	}
+        var map = new TMap( KeyType, ValueType, Count);
+        return map;
+    }
 
-	public function readMapEnd() : Void {
-		ReadJSONObjectEnd();
-		ReadJSONArrayEnd();
-	}
+    public function readMapEnd() : Void {
+        ReadJSONObjectEnd();
+        ReadJSONArrayEnd();
+    }
 
-	public function readListBegin():TList {
-		ReadJSONArrayStart();
-		var ElementType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
-		var Count : Int = ReadJSONInteger();
+    public function readListBegin():TList {
+        ReadJSONArrayStart();
+        var ElementType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
+        var Count : Int = ReadJSONInteger();
 
-		var list = new TList( ElementType, Count);
-		return list;
-	}
+        var list = new TList( ElementType, Count);
+        return list;
+    }
 
-	public function readListEnd() : Void {
-		ReadJSONArrayEnd();
-	}
+    public function readListEnd() : Void {
+        ReadJSONArrayEnd();
+    }
 
-	public function readSetBegin() : TSet {
-		ReadJSONArrayStart();
-		var ElementType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
-		var Count : Int = ReadJSONInteger();
+    public function readSetBegin() : TSet {
+        ReadJSONArrayStart();
+        var ElementType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
+        var Count : Int = ReadJSONInteger();
 
-		var set = new TSet( ElementType, Count);
-		return set;
-	}
+        var set = new TSet( ElementType, Count);
+        return set;
+    }
 
-	public function readSetEnd() : Void {
-		ReadJSONArrayEnd();
-	}
+    public function readSetEnd() : Void {
+        ReadJSONArrayEnd();
+    }
 
-	public function readBool() : Bool {
-		return (ReadJSONInteger() != 0);
-	}
+    public function readBool() : Bool {
+        return (ReadJSONInteger() != 0);
+    }
 
-	public function readByte() : Int {
-		return ReadJSONInteger();
-	}
+    public function readByte() : Int {
+        return ReadJSONInteger();
+    }
 
-	public function readI16() : Int {
-		return ReadJSONInteger();
-	}
+    public function readI16() : Int {
+        return ReadJSONInteger();
+    }
 
-	public function readI32() : Int {
-		return ReadJSONInteger();
-	}
+    public function readI32() : Int {
+        return ReadJSONInteger();
+    }
 
-	public function readI64() : haxe.Int64 {
-		return ReadJSONInt64();
-	}
+    public function readI64() : haxe.Int64 {
+        return ReadJSONInt64();
+    }
 
-	public function readDouble():Float {
-		return ReadJSONDouble();
-	}
+    public function readDouble():Float {
+        return ReadJSONDouble();
+    }
 
-	public function readString() : String {
+    public function readString() : String {
         return ReadJSONString(false);
-	}
+    }
 
-	public function readBinary() : Bytes {
-		return ReadJSONBase64();
-	}
+    public function readBinary() : Bytes {
+        return ReadJSONBase64();
+    }
 
-	// Push a new JSON context onto the stack.
-	private function  PushContext(c : JSONBaseContext) : Void {
-		contextStack.add(context);
-		context = c;
-	}
+    // Push a new JSON context onto the stack.
+    private function  PushContext(c : JSONBaseContext) : Void {
+        contextStack.add(context);
+        context = c;
+    }
 
-	// Pop the last JSON context off the stack
-	private function  PopContext() : Void {
-		context = contextStack.pop();
-	}
+    // Pop the last JSON context off the stack
+    private function  PopContext() : Void {
+        context = contextStack.pop();
+    }
 
 
-	// Write the bytes in array buf as a JSON characters, escaping as needed
-	private function WriteJSONString( b : Bytes) : Void {
-		context.Write();
+    // Write the bytes in array buf as a JSON characters, escaping as needed
+    private function WriteJSONString( b : Bytes) : Void {
+        context.Write();
 
-		var tmp = BytesFromString( JSONConstants.QUOTE);
-		trans.write( tmp, 0, tmp.length);
+        var tmp = BytesFromString( JSONConstants.QUOTE);
+        trans.write( tmp, 0, tmp.length);
 
-		for (i in 0 ... b.length) {
-			var value = b.get(i);
+        for (i in 0 ... b.length) {
+            var value = b.get(i);
 
-			if ((value & 0x00FF) >= 0x30)
-			{
-				if (String.fromCharCode(value) == JSONConstants.BACKSLASH.charAt(0))
-				{
-					tmp = BytesFromString( JSONConstants.BACKSLASH + JSONConstants.BACKSLASH);
-					trans.write( tmp, 0, tmp.length);
-				}
-				else
-				{
-					trans.write( b, i, 1);
-				}
-			}
-			else
-			{
-				var num = JSONConstants.JSON_CHAR_TABLE[value];
-				if (num == 1)
-				{
-					trans.write( b, i, 1);
-				}
-				else if (num > 1)
-				{
-					var buf = new BytesBuffer();
-					buf.addString( JSONConstants.BACKSLASH);
-					buf.addByte( num);
-					tmp = buf.getBytes();
-					trans.write( tmp, 0, tmp.length);
-				}
-				else
-				{
-					var buf = new BytesBuffer();
-					buf.addString( JSONConstants.ESCSEQ);
-					buf.addString( HexChar( (value & 0xFF000000) >> 12));
-					buf.addString( HexChar( (value & 0x00FF0000) >> 8));
-					buf.addString( HexChar( (value & 0x0000FF00) >> 4));
-					buf.addString( HexChar( value & 0x000000FF));
-					tmp = buf.getBytes();
-					trans.write( tmp, 0, tmp.length);
-				}
-			}
-		}
+            if ((value & 0x00FF) >= 0x30)
+            {
+                if (String.fromCharCode(value) == JSONConstants.BACKSLASH.charAt(0))
+                {
+                    tmp = BytesFromString( JSONConstants.BACKSLASH + JSONConstants.BACKSLASH);
+                    trans.write( tmp, 0, tmp.length);
+                }
+                else
+                {
+                    trans.write( b, i, 1);
+                }
+            }
+            else
+            {
+                var num = JSONConstants.JSON_CHAR_TABLE[value];
+                if (num == 1)
+                {
+                    trans.write( b, i, 1);
+                }
+                else if (num > 1)
+                {
+                    var buf = new BytesBuffer();
+                    buf.addString( JSONConstants.BACKSLASH);
+                    buf.addByte( num);
+                    tmp = buf.getBytes();
+                    trans.write( tmp, 0, tmp.length);
+                }
+                else
+                {
+                    var buf = new BytesBuffer();
+                    buf.addString( JSONConstants.ESCSEQ);
+                    buf.addString( HexChar( (value & 0xFF000000) >> 12));
+                    buf.addString( HexChar( (value & 0x00FF0000) >> 8));
+                    buf.addString( HexChar( (value & 0x0000FF00) >> 4));
+                    buf.addString( HexChar( value & 0x000000FF));
+                    tmp = buf.getBytes();
+                    trans.write( tmp, 0, tmp.length);
+                }
+            }
+        }
 
-		tmp = BytesFromString( JSONConstants.QUOTE);
-		trans.write( tmp, 0, tmp.length);
-	}
+        tmp = BytesFromString( JSONConstants.QUOTE);
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	// Write out number as a JSON value. If the context dictates so,
-	// it will be wrapped in quotes to output as a JSON string.
-	private function WriteJSONInteger( num : Int) : Void {
-		context.Write();
+    // Write out number as a JSON value. If the context dictates so,
+    // it will be wrapped in quotes to output as a JSON string.
+    private function WriteJSONInteger( num : Int) : Void {
+        context.Write();
 
-		var str : String = "";
-		var escapeNum : Bool = context.EscapeNumbers();
+        var str : String = "";
+        var escapeNum : Bool = context.EscapeNumbers();
 
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
 
-		str += Std.string(num);
+        str += Std.string(num);
 
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
 
-		var tmp = BytesFromString( str);
-		trans.write( tmp, 0, tmp.length);
-	}
+        var tmp = BytesFromString( str);
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	// Write out number as a JSON value. If the context dictates so,
-	// it will be wrapped in quotes to output as a JSON string.
-	private function WriteJSONInt64( num : Int64) : Void {
-		context.Write();
+    // Write out number as a JSON value. If the context dictates so,
+    // it will be wrapped in quotes to output as a JSON string.
+    private function WriteJSONInt64( num : Int64) : Void {
+        context.Write();
 
-		var str : String = "";
-		var escapeNum : Bool = context.EscapeNumbers();
+        var str : String = "";
+        var escapeNum : Bool = context.EscapeNumbers();
 
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
 
-		str += Std.string(num);
+        str += Std.string(num);
 
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
 
-		var tmp = BytesFromString( str);
-		trans.write( tmp, 0, tmp.length);
-	}
+        var tmp = BytesFromString( str);
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	// Write out a double as a JSON value. If it is NaN or infinity or if the
-	// context dictates escaping, Write out as JSON string.
-	private function WriteJSONDouble(num : Float) : Void {
-		context.Write();
+    // Write out a double as a JSON value. If it is NaN or infinity or if the
+    // context dictates escaping, Write out as JSON string.
+    private function WriteJSONDouble(num : Float) : Void {
+        context.Write();
 
 
-		var special : Bool = false;
-		var rendered : String = "";
-		if( Math.isNaN(num)) {
-			special = true;
-			rendered = JSONConstants.FLOAT_IS_NAN;
-		} else if (! Math.isFinite(num)) {
-			special = true;
-			if( num > 0) {
-				rendered = JSONConstants.FLOAT_IS_POS_INF;
-			} else {
-				rendered = JSONConstants.FLOAT_IS_NEG_INF;
-			}
-		} else {
-			rendered = Std.string(num);  // plain and simple float number
-		}
+        var special : Bool = false;
+        var rendered : String = "";
+        if( Math.isNaN(num)) {
+            special = true;
+            rendered = JSONConstants.FLOAT_IS_NAN;
+        } else if (! Math.isFinite(num)) {
+            special = true;
+            if( num > 0) {
+                rendered = JSONConstants.FLOAT_IS_POS_INF;
+            } else {
+                rendered = JSONConstants.FLOAT_IS_NEG_INF;
+            }
+        } else {
+            rendered = Std.string(num);  // plain and simple float number
+        }
 
-		// compose output
-		var escapeNum : Bool = special || context.EscapeNumbers();
-		var str : String = "";
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
-		str += rendered;
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
+        // compose output
+        var escapeNum : Bool = special || context.EscapeNumbers();
+        var str : String = "";
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
+        str += rendered;
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
 
-		var tmp = BytesFromString( str);
-		trans.write( tmp, 0, tmp.length);
-	}
+        var tmp = BytesFromString( str);
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	// Write out contents of byte array b as a JSON string with base-64 encoded data
-	private function WriteJSONBase64( b : Bytes) : Void {
-		context.Write();
+    // Write out contents of byte array b as a JSON string with base-64 encoded data
+    private function WriteJSONBase64( b : Bytes) : Void {
+        context.Write();
 
-		var buf = new BytesBuffer();
-		buf.addString( JSONConstants.QUOTE);
-		buf.addString( Base64.encode(b));
-		buf.addString( JSONConstants.QUOTE);
+        var buf = new BytesBuffer();
+        buf.addString( JSONConstants.QUOTE);
+        buf.addString( Base64.encode(b));
+        buf.addString( JSONConstants.QUOTE);
 
-		var tmp = buf.getBytes();
-		trans.write( tmp, 0, tmp.length);
-	}
+        var tmp = buf.getBytes();
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	private function WriteJSONObjectStart() : Void {
-		context.Write();
-		var tmp = BytesFromString( JSONConstants.LBRACE);
-		trans.write( tmp, 0, tmp.length);
-		PushContext( new JSONPairContext(this));
-	}
+    private function WriteJSONObjectStart() : Void {
+        context.Write();
+        var tmp = BytesFromString( JSONConstants.LBRACE);
+        trans.write( tmp, 0, tmp.length);
+        PushContext( new JSONPairContext(this));
+    }
 
-	private function WriteJSONObjectEnd() : Void {
-		PopContext();
-		var tmp = BytesFromString( JSONConstants.RBRACE);
-		trans.write( tmp, 0, tmp.length);
-	}
+    private function WriteJSONObjectEnd() : Void {
+        PopContext();
+        var tmp = BytesFromString( JSONConstants.RBRACE);
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	private function WriteJSONArrayStart() : Void {
-		context.Write();
-		var tmp = BytesFromString( JSONConstants.LBRACKET);
-		trans.write( tmp, 0, tmp.length);
-		PushContext( new JSONListContext(this));
-	}
+    private function WriteJSONArrayStart() : Void {
+        context.Write();
+        var tmp = BytesFromString( JSONConstants.LBRACKET);
+        trans.write( tmp, 0, tmp.length);
+        PushContext( new JSONListContext(this));
+    }
 
-	private function WriteJSONArrayEnd() : Void {
-		PopContext();
-		var tmp = BytesFromString( JSONConstants.RBRACKET);
-		trans.write( tmp, 0, tmp.length);
-	}
+    private function WriteJSONArrayEnd() : Void {
+        PopContext();
+        var tmp = BytesFromString( JSONConstants.RBRACKET);
+        trans.write( tmp, 0, tmp.length);
+    }
 
 
-	/**
-	 * Reading methods.
-	 */
+    /**
+     * Reading methods.
+     */
 
-	// Read a byte that must match char, otherwise an exception is thrown.
-	public function ReadJSONSyntaxChar( char : String) : Void {
-		var b = BytesFromString( char);
-		
-		var ch = reader.Read();
-		if (ch.get(0) != b.get(0))
-		{
-			throw new TProtocolException(TProtocolException.INVALID_DATA,
-										 'Unexpected character: $ch');
-		}
-	}
+    // Read a byte that must match char, otherwise an exception is thrown.
+    public function ReadJSONSyntaxChar( char : String) : Void {
+        var b = BytesFromString( char);
 
-	// Read in a JSON string, unescaping as appropriate.
+        var ch = reader.Read();
+        if (ch.get(0) != b.get(0))
+        {
+            throw new TProtocolException(TProtocolException.INVALID_DATA,
+                                         'Unexpected character: $ch');
+        }
+    }
+
+    // Read in a JSON string, unescaping as appropriate.
     // Skip Reading from the context if skipContext is true.
-	private function ReadJSONString(skipContext : Bool) : String
-	{
-		if (!skipContext)
-		{
-			context.Read();
-		}
+    private function ReadJSONString(skipContext : Bool) : String
+    {
+        if (!skipContext)
+        {
+            context.Read();
+        }
 
-		var buffer : BytesBuffer = new BytesBuffer();
+        var buffer : BytesBuffer = new BytesBuffer();
 
-		ReadJSONSyntaxChar( JSONConstants.QUOTE);
-		while (true)
-		{
-			var ch = reader.Read();
+        ReadJSONSyntaxChar( JSONConstants.QUOTE);
+        while (true)
+        {
+            var ch = reader.Read();
 
-			// end of string?
-			if (StringFromBytes(ch) == JSONConstants.QUOTE)
-			{
-				break;
-			}
+            // end of string?
+            if (StringFromBytes(ch) == JSONConstants.QUOTE)
+            {
+                break;
+            }
 
-			// escaped?
-			if (StringFromBytes(ch) != JSONConstants.ESCSEQ.charAt(0))
-			{
-				buffer.addByte( ch.get(0));
-				continue;
-			}
+            // escaped?
+            if (StringFromBytes(ch) != JSONConstants.ESCSEQ.charAt(0))
+            {
+                buffer.addByte( ch.get(0));
+                continue;
+            }
 
-			// distinguish between \uXXXX (hex unicode) and \X (control chars)
-			ch = reader.Read();
-			if (StringFromBytes(ch) != JSONConstants.ESCSEQ.charAt(1))
-			{
-				var value = JSONConstants.ESCAPE_CHARS_TO_VALUES[ch.get(0)];
-				if( value == null)
-				{
-					throw new TProtocolException( TProtocolException.INVALID_DATA, "Expected control char");
-				}
-				buffer.addByte( value);
-				continue;
-			}
+            // distinguish between \uXXXX (hex unicode) and \X (control chars)
+            ch = reader.Read();
+            if (StringFromBytes(ch) != JSONConstants.ESCSEQ.charAt(1))
+            {
+                var value = JSONConstants.ESCAPE_CHARS_TO_VALUES[ch.get(0)];
+                if( value == null)
+                {
+                    throw new TProtocolException( TProtocolException.INVALID_DATA, "Expected control char");
+                }
+                buffer.addByte( value);
+                continue;
+            }
 
 
-			// it's \uXXXX
-			var hexbuf = new BytesBuffer();
-			var hexlen = trans.readAll( hexbuf, 0, 4);
-			if( hexlen != 4)
-			{
-				throw new TProtocolException( TProtocolException.INVALID_DATA, "Not enough data for \\uNNNN sequence");
-			}
+            // it's \uXXXX
+            var hexbuf = new BytesBuffer();
+            var hexlen = trans.readAll( hexbuf, 0, 4);
+            if( hexlen != 4)
+            {
+                throw new TProtocolException( TProtocolException.INVALID_DATA, "Not enough data for \\uNNNN sequence");
+            }
 
-			var hexdigits = hexbuf.getBytes();
-			var charcode = 0;
-			charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(0)));
-			charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(1)));
-			charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(2)));
-			charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(3)));
-			buffer.addString( String.fromCharCode(charcode));
-		}
+            var hexdigits = hexbuf.getBytes();
+            var charcode = 0;
+            charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(0)));
+            charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(1)));
+            charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(2)));
+            charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(3)));
+            buffer.addString( String.fromCharCode(charcode));
+        }
 
-		return StringFromBytes( buffer.getBytes());
-	}
+        return StringFromBytes( buffer.getBytes());
+    }
 
-	// Return true if the given byte could be a valid part of a JSON number.
-	private function IsJSONNumeric(b : Int) : Bool {
-		switch (b)
-		{
-			case "+".code:  return true;
-			case "-".code:  return true;
-			case ".".code:  return true;
-			case "0".code:  return true;
-			case "1".code:  return true;
-			case "2".code:  return true;
-			case "3".code:  return true;
-			case "4".code:  return true;
-			case "5".code:  return true;
-			case "6".code:  return true;
-			case "7".code:  return true;
-			case "8".code:  return true;
-			case "9".code:  return true;
-			case "E".code:  return true;
-			case "e".code:  return true;
-		}
-		return false;
-	}
+    // Return true if the given byte could be a valid part of a JSON number.
+    private function IsJSONNumeric(b : Int) : Bool {
+        switch (b)
+        {
+            case "+".code:  return true;
+            case "-".code:  return true;
+            case ".".code:  return true;
+            case "0".code:  return true;
+            case "1".code:  return true;
+            case "2".code:  return true;
+            case "3".code:  return true;
+            case "4".code:  return true;
+            case "5".code:  return true;
+            case "6".code:  return true;
+            case "7".code:  return true;
+            case "8".code:  return true;
+            case "9".code:  return true;
+            case "E".code:  return true;
+            case "e".code:  return true;
+        }
+        return false;
+    }
 
-	// Read in a sequence of characters that are all valid in JSON numbers. Does
-	// not do a complete regex check to validate that this is actually a number.
-	private function ReadJSONNumericChars() : String
-	{
-		var buffer : BytesBuffer = new BytesBuffer();
-		while (true)
-		{
-			var ch = reader.Peek();
-			if( ! IsJSONNumeric( ch.get(0)))
-			{
-				break;
-			}
-			buffer.addByte( reader.Read().get(0));
-		}
-		return StringFromBytes( buffer.getBytes());
-	}
+    // Read in a sequence of characters that are all valid in JSON numbers. Does
+    // not do a complete regex check to validate that this is actually a number.
+    private function ReadJSONNumericChars() : String
+    {
+        var buffer : BytesBuffer = new BytesBuffer();
+        while (true)
+        {
+            var ch = reader.Peek();
+            if( ! IsJSONNumeric( ch.get(0)))
+            {
+                break;
+            }
+            buffer.addByte( reader.Read().get(0));
+        }
+        return StringFromBytes( buffer.getBytes());
+    }
 
-	// Read in a JSON number. If the context dictates, Read in enclosing quotes.
-	private function ReadJSONInteger() : Int {
-		context.Read();
+    // Read in a JSON number. If the context dictates, Read in enclosing quotes.
+    private function ReadJSONInteger() : Int {
+        context.Read();
 
-		if (context.EscapeNumbers()) {
-			ReadJSONSyntaxChar( JSONConstants.QUOTE);
-		}
+        if (context.EscapeNumbers()) {
+            ReadJSONSyntaxChar( JSONConstants.QUOTE);
+        }
 
-		var str : String = ReadJSONNumericChars();
+        var str : String = ReadJSONNumericChars();
 
-		if (context.EscapeNumbers()) {
-			ReadJSONSyntaxChar( JSONConstants.QUOTE);
-		}
+        if (context.EscapeNumbers()) {
+            ReadJSONSyntaxChar( JSONConstants.QUOTE);
+        }
 
-		var value = Std.parseInt(str);
-		if( value == null) {
-			throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
-		}
+        var value = Std.parseInt(str);
+        if( value == null) {
+            throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
+        }
 
-		return value;
-	}
+        return value;
+    }
 
-	// Read in a JSON number. If the context dictates, Read in enclosing quotes.
-	private function ReadJSONInt64() : haxe.Int64 {
-		context.Read();
+    // Read in a JSON number. If the context dictates, Read in enclosing quotes.
+    private function ReadJSONInt64() : haxe.Int64 {
+        context.Read();
 
-		if (context.EscapeNumbers()) {
-			ReadJSONSyntaxChar( JSONConstants.QUOTE);
-		}
+        if (context.EscapeNumbers()) {
+            ReadJSONSyntaxChar( JSONConstants.QUOTE);
+        }
 
-		var str : String = ReadJSONNumericChars();
-		if( str.length == 0) {
-			throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
-		}
+        var str : String = ReadJSONNumericChars();
+        if( str.length == 0) {
+            throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
+        }
 
-		if (context.EscapeNumbers()) {
-			ReadJSONSyntaxChar( JSONConstants.QUOTE);
-		}
+        if (context.EscapeNumbers()) {
+            ReadJSONSyntaxChar( JSONConstants.QUOTE);
+        }
 
-	    // process sign
-		var bMinus = false;
-		var startAt = 0;
-		if( (str.charAt(0) == "+") || (str.charAt(0) == "-")) {
-			bMinus = (str.charAt(0) == "-");
-			startAt++;
-		}
+        // process sign
+        var bMinus = false;
+        var startAt = 0;
+        if( (str.charAt(0) == "+") || (str.charAt(0) == "-")) {
+            bMinus = (str.charAt(0) == "-");
+            startAt++;
+        }
 
-		// process digits
-		var value : Int64 = Int64.make(0,0);
-		var bGotDigits = false;
-		for( i in startAt ... str.length) {
-			var ch = str.charAt(i);
-			var digit = JSONConstants.DECIMAL_DIGITS[ch];
-			if( digit == null) {
-				throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
-			}
-			bGotDigits = true;
+        // process digits
+        var value : Int64 = Int64.make(0,0);
+        var bGotDigits = false;
+        for( i in startAt ... str.length) {
+            var ch = str.charAt(i);
+            var digit = JSONConstants.DECIMAL_DIGITS[ch];
+            if( digit == null) {
+                throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
+            }
+            bGotDigits = true;
 
-			// these are decimal digits
-			value = Int64.mul( value, Int64.make(0,10));
-			value = Int64.add( value, Int64.make(0,digit));
-		}
+            // these are decimal digits
+            value = Int64.mul( value, Int64.make(0,10));
+            value = Int64.add( value, Int64.make(0,digit));
+        }
 
-		// process pending minus sign, if applicable
-		// this should also handle the edge case MIN_INT64 correctly
-		if( bMinus && (Int64.compare(value,Int64.make(0,0)) > 0)) {
-			value = Int64.neg( value);
-			bMinus = false;
-		}
+        // process pending minus sign, if applicable
+        // this should also handle the edge case MIN_INT64 correctly
+        if( bMinus && (Int64.compare(value,Int64.make(0,0)) > 0)) {
+            value = Int64.neg( value);
+            bMinus = false;
+        }
 
-		if( ! bGotDigits) {
-			throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
-		}
-			
-		return value;
-	}
+        if( ! bGotDigits) {
+            throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
+        }
 
-	// Read in a JSON double value. Throw if the value is not wrapped in quotes
-	// when expected or if wrapped in quotes when not expected.
-	private function ReadJSONDouble() : Float {
-		context.Read();
-		
-		var str : String = "";
-		if (StringFromBytes(reader.Peek()) == JSONConstants.QUOTE) {
-			str = ReadJSONString(true);
-			
-			// special cases
-			if( str == JSONConstants.FLOAT_IS_NAN) {
-				return Math.NaN;
-			}
-			if( str == JSONConstants.FLOAT_IS_POS_INF) {
-				return Math.POSITIVE_INFINITY;
-			}
-			if( str == JSONConstants.FLOAT_IS_NEG_INF) {
-				return Math.NEGATIVE_INFINITY;
-			}
-			
-			if( ! context.EscapeNumbers())	{
-				// throw - we should not be in a string in this case
-				throw new TProtocolException(TProtocolException.INVALID_DATA, "Numeric data unexpectedly quoted");
-			}
-		}
-		else
-		{
-			if( context.EscapeNumbers())	{
-				// This will throw - we should have had a quote if EscapeNumbers() == true
-				ReadJSONSyntaxChar( JSONConstants.QUOTE);
-			}
+        return value;
+    }
 
-			str = ReadJSONNumericChars();
-		}
+    // Read in a JSON double value. Throw if the value is not wrapped in quotes
+    // when expected or if wrapped in quotes when not expected.
+    private function ReadJSONDouble() : Float {
+        context.Read();
 
-		// parse and check - we should have at least one valid digit
-		var dub = Std.parseFloat( str);
-		if( (str.length == 0) || Math.isNaN(dub)) {
-			throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
-		}
+        var str : String = "";
+        if (StringFromBytes(reader.Peek()) == JSONConstants.QUOTE) {
+            str = ReadJSONString(true);
 
-		return dub;
-	}
+            // special cases
+            if( str == JSONConstants.FLOAT_IS_NAN) {
+                return Math.NaN;
+            }
+            if( str == JSONConstants.FLOAT_IS_POS_INF) {
+                return Math.POSITIVE_INFINITY;
+            }
+            if( str == JSONConstants.FLOAT_IS_NEG_INF) {
+                return Math.NEGATIVE_INFINITY;
+            }
 
-	// Read in a JSON string containing base-64 encoded data and decode it.
-	private function ReadJSONBase64() : Bytes
-	{
-		var str = ReadJSONString(false);
-		return Base64.decode( str);
-	}
+            if( ! context.EscapeNumbers())    {
+                // throw - we should not be in a string in this case
+                throw new TProtocolException(TProtocolException.INVALID_DATA, "Numeric data unexpectedly quoted");
+            }
+        }
+        else
+        {
+            if( context.EscapeNumbers())    {
+                // This will throw - we should have had a quote if EscapeNumbers() == true
+                ReadJSONSyntaxChar( JSONConstants.QUOTE);
+            }
 
-	private function ReadJSONObjectStart() : Void {
-		context.Read();
-		ReadJSONSyntaxChar( JSONConstants.LBRACE);
-		PushContext(new JSONPairContext(this));
-	}
+            str = ReadJSONNumericChars();
+        }
 
-	private function ReadJSONObjectEnd() : Void {
-		ReadJSONSyntaxChar( JSONConstants.RBRACE);
-		PopContext();
-	}
+        // parse and check - we should have at least one valid digit
+        var dub = Std.parseFloat( str);
+        if( (str.length == 0) || Math.isNaN(dub)) {
+            throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
+        }
 
-	private function ReadJSONArrayStart() : Void {
-		context.Read();
-		ReadJSONSyntaxChar( JSONConstants.LBRACKET);
-		PushContext(new JSONListContext(this));
-	}
+        return dub;
+    }
 
-	private function ReadJSONArrayEnd() : Void {
-		ReadJSONSyntaxChar( JSONConstants.RBRACKET);
-		PopContext();
-	}
+    // Read in a JSON string containing base-64 encoded data and decode it.
+    private function ReadJSONBase64() : Bytes
+    {
+        var str = ReadJSONString(false);
+        return Base64.decode( str);
+    }
+
+    private function ReadJSONObjectStart() : Void {
+        context.Read();
+        ReadJSONSyntaxChar( JSONConstants.LBRACE);
+        PushContext(new JSONPairContext(this));
+    }
+
+    private function ReadJSONObjectEnd() : Void {
+        ReadJSONSyntaxChar( JSONConstants.RBRACE);
+        PopContext();
+    }
+
+    private function ReadJSONArrayStart() : Void {
+        context.Read();
+        ReadJSONSyntaxChar( JSONConstants.LBRACKET);
+        PushContext(new JSONListContext(this));
+    }
+
+    private function ReadJSONArrayEnd() : Void {
+        ReadJSONSyntaxChar( JSONConstants.RBRACKET);
+        PopContext();
+    }
 
 
-	public static function BytesFromString( str : String) : Bytes {
-		var buf = new BytesBuffer();
-		if( utf8Strings)
-			buf.addString( str);  // no need to encode on UTF8 targets, the string is just fine
-		else
-			buf.addString( Utf8.encode( str));
-		return buf.getBytes();
-	}
+    public static function BytesFromString( str : String) : Bytes {
+        var buf = new BytesBuffer();
+        if( utf8Strings)
+            buf.addString( str);  // no need to encode on UTF8 targets, the string is just fine
+        else
+            buf.addString( Utf8.encode( str));
+        return buf.getBytes();
+    }
 
-	public static function StringFromBytes( buf : Bytes) : String {
-		var inp = new BytesInput( buf);
-		if( buf.length == 0)
-			return "";  // readString() would return null in that case, which is wrong
-		var str = inp.readString( buf.length);
-		if( utf8Strings)
-			return str;  // no need to decode on UTF8 targets, the string is just fine
-		else
-			return Utf8.decode( str);
-	}
+    public static function StringFromBytes( buf : Bytes) : String {
+        var inp = new BytesInput( buf);
+        if( buf.length == 0)
+            return "";  // readString() would return null in that case, which is wrong
+        var str = inp.readString( buf.length);
+        if( utf8Strings)
+            return str;  // no need to decode on UTF8 targets, the string is just fine
+        else
+            return Utf8.decode( str);
+    }
 
-	// Convert a byte containing a hex char ('0'-'9' or 'a'-'f') into its corresponding hex value
-	private static function HexVal(char : String) : Int {
-		var value = JSONConstants.HEX_DIGITS[char];
-		if( value == null) {
-			throw new TProtocolException(TProtocolException.INVALID_DATA, 'Expected hex character: $char');
-		}
-		return value;
-	}
+    // Convert a byte containing a hex char ('0'-'9' or 'a'-'f') into its corresponding hex value
+    private static function HexVal(char : String) : Int {
+        var value = JSONConstants.HEX_DIGITS[char];
+        if( value == null) {
+            throw new TProtocolException(TProtocolException.INVALID_DATA, 'Expected hex character: $char');
+        }
+        return value;
+    }
 
-	// Convert a byte containing a hex nibble to its corresponding hex character
-	private static function HexChar(nibble : Int) : String
-	{
-		return "0123456789abcdef".charAt(nibble & 0x0F);
-	}
+    // Convert a byte containing a hex nibble to its corresponding hex character
+    private static function HexChar(nibble : Int) : String
+    {
+        return "0123456789abcdef".charAt(nibble & 0x0F);
+    }
 
 
 }
@@ -795,136 +795,136 @@
 
 @:allow(TJSONProtocol)
 class JSONConstants {
-	public static var COMMA = ",";
-	public static var COLON = ":";
-	public static var LBRACE = "{";
-	public static var RBRACE = "}";
-	public static var LBRACKET = "[";
-	public static var RBRACKET = "]";
-	public static var QUOTE = "\"";
-	public static var BACKSLASH = "\\";
+    public static var COMMA = ",";
+    public static var COLON = ":";
+    public static var LBRACE = "{";
+    public static var RBRACE = "}";
+    public static var LBRACKET = "[";
+    public static var RBRACKET = "]";
+    public static var QUOTE = "\"";
+    public static var BACKSLASH = "\\";
 
-	public static var ESCSEQ = "\\u";
+    public static var ESCSEQ = "\\u";
 
-	public static var FLOAT_IS_NAN = "NaN";
-	public static var FLOAT_IS_POS_INF = "Infinity";
-	public static var FLOAT_IS_NEG_INF = "-Infinity";
-	
-	public static var VERSION = 1;
-	public static var JSON_CHAR_TABLE = [
-		0,  0,  0,  0,  0,  0,  0,  0,
-		"b".code, "t".code, "n".code,  0, "f".code, "r".code,  0,  0,
-		0,  0,  0,  0,  0,  0,  0,  0,
-		0,  0,  0,  0,  0,  0,  0,  0,
-		1,  1, "\"".code,  1,  1,  1,  1,  1,
-		1,  1,  1,  1,  1,  1,  1,  1,
-	];
+    public static var FLOAT_IS_NAN = "NaN";
+    public static var FLOAT_IS_POS_INF = "Infinity";
+    public static var FLOAT_IS_NEG_INF = "-Infinity";
 
-	public static var ESCAPE_CHARS     = ['"','\\','/','b','f','n','r','t'];
-	public static var ESCAPE_CHARS_TO_VALUES = [
-		"\"".code => 0x22,
-		"\\".code => 0x5C,
-		"/".code  => 0x2F,
-		"b".code  => 0x08,
-		"f".code  => 0x0C,
-		"n".code  => 0x0A,
-		"r".code  => 0x0D,
-		"t".code  => 0x09
-	];
+    public static var VERSION = 1;
+    public static var JSON_CHAR_TABLE = [
+        0,  0,  0,  0,  0,  0,  0,  0,
+        "b".code, "t".code, "n".code,  0, "f".code, "r".code,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,
+        1,  1, "\"".code,  1,  1,  1,  1,  1,
+        1,  1,  1,  1,  1,  1,  1,  1,
+    ];
 
-	public static var DECIMAL_DIGITS = [
-		"0" => 0,
-		"1" => 1,
-		"2" => 2,
-		"3" => 3,
-		"4" => 4,
-		"5" => 5,
-		"6" => 6,
-		"7" => 7,
-		"8" => 8,
-		"9" => 9
-	];
+    public static var ESCAPE_CHARS     = ['"','\\','/','b','f','n','r','t'];
+    public static var ESCAPE_CHARS_TO_VALUES = [
+        "\"".code => 0x22,
+        "\\".code => 0x5C,
+        "/".code  => 0x2F,
+        "b".code  => 0x08,
+        "f".code  => 0x0C,
+        "n".code  => 0x0A,
+        "r".code  => 0x0D,
+        "t".code  => 0x09
+    ];
 
-	public static var HEX_DIGITS = [
-		"0" => 0,
-		"1" => 1,
-		"2" => 2,
-		"3" => 3,
-		"4" => 4,
-		"5" => 5,
-		"6" => 6,
-		"7" => 7,
-		"8" => 8,
-		"9" => 9,
-		"A" => 10,
-		"a" => 10,
-		"B" => 11,
-		"b" => 11,
-		"C" => 12,
-		"c" => 12,
-		"D" => 13,
-		"d" => 13,
-		"E" => 14,
-		"e" => 14,
-		"F" => 15,
-		"f" => 15
-	];
+    public static var DECIMAL_DIGITS = [
+        "0" => 0,
+        "1" => 1,
+        "2" => 2,
+        "3" => 3,
+        "4" => 4,
+        "5" => 5,
+        "6" => 6,
+        "7" => 7,
+        "8" => 8,
+        "9" => 9
+    ];
+
+    public static var HEX_DIGITS = [
+        "0" => 0,
+        "1" => 1,
+        "2" => 2,
+        "3" => 3,
+        "4" => 4,
+        "5" => 5,
+        "6" => 6,
+        "7" => 7,
+        "8" => 8,
+        "9" => 9,
+        "A" => 10,
+        "a" => 10,
+        "B" => 11,
+        "b" => 11,
+        "C" => 12,
+        "c" => 12,
+        "D" => 13,
+        "d" => 13,
+        "E" => 14,
+        "e" => 14,
+        "F" => 15,
+        "f" => 15
+    ];
 
 
-	public static var DEF_STRING_SIZE = 16;
+    public static var DEF_STRING_SIZE = 16;
 
-	public static var NAME_BOOL   = 'tf';
-	public static var NAME_BYTE   = 'i8';
-	public static var NAME_I16    = 'i16';
-	public static var NAME_I32    = 'i32';
-	public static var NAME_I64    = 'i64';
-	public static var NAME_DOUBLE = 'dbl';
-	public static var NAME_STRUCT = 'rec';
-	public static var NAME_STRING = 'str';
-	public static var NAME_MAP    = 'map';
-	public static var NAME_LIST   = 'lst';
-	public static var NAME_SET    = 'set';
+    public static var NAME_BOOL   = 'tf';
+    public static var NAME_BYTE   = 'i8';
+    public static var NAME_I16    = 'i16';
+    public static var NAME_I32    = 'i32';
+    public static var NAME_I64    = 'i64';
+    public static var NAME_DOUBLE = 'dbl';
+    public static var NAME_STRUCT = 'rec';
+    public static var NAME_STRING = 'str';
+    public static var NAME_MAP    = 'map';
+    public static var NAME_LIST   = 'lst';
+    public static var NAME_SET    = 'set';
 
-	public static function GetTypeNameForTypeID(typeID : Int) : String {
-		switch (typeID)
-		{
-			case TType.BOOL:     return NAME_BOOL;
-			case TType.BYTE:     return NAME_BYTE;
-			case TType.I16:		 return NAME_I16;
-			case TType.I32:		 return NAME_I32;
-			case TType.I64:		 return NAME_I64;
-			case TType.DOUBLE:	 return NAME_DOUBLE;
-			case TType.STRING:	 return NAME_STRING;
-			case TType.STRUCT:	 return NAME_STRUCT;
-			case TType.MAP:		 return NAME_MAP;
-			case TType.SET:		 return NAME_SET;
-			case TType.LIST:	 return NAME_LIST;
-		}
-		throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, "Unrecognized type");
-	}
+    public static function GetTypeNameForTypeID(typeID : Int) : String {
+        switch (typeID)
+        {
+            case TType.BOOL:     return NAME_BOOL;
+            case TType.BYTE:     return NAME_BYTE;
+            case TType.I16:         return NAME_I16;
+            case TType.I32:         return NAME_I32;
+            case TType.I64:         return NAME_I64;
+            case TType.DOUBLE:     return NAME_DOUBLE;
+            case TType.STRING:     return NAME_STRING;
+            case TType.STRUCT:     return NAME_STRUCT;
+            case TType.MAP:         return NAME_MAP;
+            case TType.SET:         return NAME_SET;
+            case TType.LIST:     return NAME_LIST;
+        }
+        throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, "Unrecognized type");
+    }
 
-	private static var NAMES_TO_TYPES = [
-		NAME_BOOL   => TType.BOOL,
-		NAME_BYTE   => TType.BYTE,
-		NAME_I16    => TType.I16,
-		NAME_I32    => TType.I32,
-		NAME_I64    => TType.I64,
-		NAME_DOUBLE => TType.DOUBLE,
-		NAME_STRING => TType.STRING,
-		NAME_STRUCT => TType.STRUCT,
-		NAME_MAP    => TType.MAP,
-		NAME_SET    => TType.SET,
-		NAME_LIST   => TType.LIST
-	];
+    private static var NAMES_TO_TYPES = [
+        NAME_BOOL   => TType.BOOL,
+        NAME_BYTE   => TType.BYTE,
+        NAME_I16    => TType.I16,
+        NAME_I32    => TType.I32,
+        NAME_I64    => TType.I64,
+        NAME_DOUBLE => TType.DOUBLE,
+        NAME_STRING => TType.STRING,
+        NAME_STRUCT => TType.STRUCT,
+        NAME_MAP    => TType.MAP,
+        NAME_SET    => TType.SET,
+        NAME_LIST   => TType.LIST
+    ];
 
-	public static function GetTypeIDForTypeName(name : String) : Int
-	{
-		var type = NAMES_TO_TYPES[name];
-		if( null != type) {
-			return type;
-		}
-		throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, "Unrecognized type");
-	}
+    public static function GetTypeIDForTypeName(name : String) : Int
+    {
+        var type = NAMES_TO_TYPES[name];
+        if( null != type) {
+            return type;
+        }
+        throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, "Unrecognized type");
+    }
 
 }
 
@@ -934,19 +934,19 @@
 @:allow(TJSONProtocol)
 class JSONBaseContext
 {
-	private var proto : TJSONProtocol;
+    private var proto : TJSONProtocol;
 
-	public function new(proto : TJSONProtocol )
-	{
-		this.proto = proto;
-	}
+    public function new(proto : TJSONProtocol )
+    {
+        this.proto = proto;
+    }
 
-	public function Write() : Void { }
-	public function Read() : Void { }
+    public function Write() : Void { }
+    public function Read() : Void { }
 
-	public function EscapeNumbers() : Bool {
-		return false;
-	}
+    public function EscapeNumbers() : Bool {
+        return false;
+    }
 }
 
 
@@ -955,36 +955,36 @@
 @:allow(TJSONProtocol)
 class JSONListContext extends JSONBaseContext
 {
-	public function new( proto : TJSONProtocol) {
-		super(proto);
-	}
+    public function new( proto : TJSONProtocol) {
+        super(proto);
+    }
 
-	private var first : Bool = true;
+    private var first : Bool = true;
 
-	public override function Write() : Void {
-		if (first)
-		{
-			first = false;
-		}
-		else
-		{
-			var buf = new BytesBuffer();
-			buf.addString( JSONConstants.COMMA);
-			var tmp = buf.getBytes();
-			proto.trans.write( tmp, 0, tmp.length);
-		}
-	}
+    public override function Write() : Void {
+        if (first)
+        {
+            first = false;
+        }
+        else
+        {
+            var buf = new BytesBuffer();
+            buf.addString( JSONConstants.COMMA);
+            var tmp = buf.getBytes();
+            proto.trans.write( tmp, 0, tmp.length);
+        }
+    }
 
-	public override function Read() : Void {
-		if (first)
-		{
-			first = false;
-		}
-		else
-		{
-			proto.ReadJSONSyntaxChar( JSONConstants.COMMA);
-		}
-	}
+    public override function Read() : Void {
+        if (first)
+        {
+            first = false;
+        }
+        else
+        {
+            proto.ReadJSONSyntaxChar( JSONConstants.COMMA);
+        }
+    }
 }
 
 
@@ -996,78 +996,78 @@
 @:allow(TJSONProtocol)
 class JSONPairContext extends JSONBaseContext
 {
-	public function new( proto : TJSONProtocol ) {
-		super( proto);
-	}
+    public function new( proto : TJSONProtocol ) {
+        super( proto);
+    }
 
-	private var first : Bool = true;
-	private var colon : Bool  = true;
+    private var first : Bool = true;
+    private var colon : Bool  = true;
 
-	public override function Write() : Void {
-		if (first)
-		{
-			first = false;
-			colon = true;
-		}
-		else
-		{
-			var buf = new BytesBuffer();
-			buf.addString( colon ? JSONConstants.COLON : JSONConstants.COMMA);
-			var tmp = buf.getBytes();
-			proto.trans.write( tmp, 0, tmp.length);
-			colon = !colon;
-		}
-	}
+    public override function Write() : Void {
+        if (first)
+        {
+            first = false;
+            colon = true;
+        }
+        else
+        {
+            var buf = new BytesBuffer();
+            buf.addString( colon ? JSONConstants.COLON : JSONConstants.COMMA);
+            var tmp = buf.getBytes();
+            proto.trans.write( tmp, 0, tmp.length);
+            colon = !colon;
+        }
+    }
 
-	public override function Read() : Void {
-		if (first)
-		{
-			first = false;
-			colon = true;
-		}
-		else
-		{
-			proto.ReadJSONSyntaxChar( colon ? JSONConstants.COLON : JSONConstants.COMMA);
-			colon = !colon;
-		}
-	}
+    public override function Read() : Void {
+        if (first)
+        {
+            first = false;
+            colon = true;
+        }
+        else
+        {
+            proto.ReadJSONSyntaxChar( colon ? JSONConstants.COLON : JSONConstants.COMMA);
+            colon = !colon;
+        }
+    }
 
-	public override function EscapeNumbers() : Bool
-	{
-		return colon;
-	}
+    public override function EscapeNumbers() : Bool
+    {
+        return colon;
+    }
 }
 
 // Holds up to one byte from the transport
 @:allow(TJSONProtocol)
 class LookaheadReader {
 
-	private var proto : TJSONProtocol;
-	private var data : Bytes;
+    private var proto : TJSONProtocol;
+    private var data : Bytes;
 
-	public function new( proto : TJSONProtocol ) {
-		this.proto = proto;
-		data = null;
-	}
+    public function new( proto : TJSONProtocol ) {
+        this.proto = proto;
+        data = null;
+    }
 
-	
-	// Return and consume the next byte to be Read, either taking it from the
-	// data buffer if present or getting it from the transport otherwise.
-	public function Read() : Bytes {
-		var retval = Peek();
-		data = null;
-		return retval;
-	}
 
-	// Return the next byte to be Read without consuming, filling the data
-	// buffer if it has not been filled alReady.
-	public function Peek() : Bytes {
-		if (data == null) {
-			var buf = new BytesBuffer();
-			proto.trans.readAll(buf, 0, 1);
-			data = buf.getBytes();
-		}
-		return data;
-	}
+    // Return and consume the next byte to be Read, either taking it from the
+    // data buffer if present or getting it from the transport otherwise.
+    public function Read() : Bytes {
+        var retval = Peek();
+        data = null;
+        return retval;
+    }
+
+    // Return the next byte to be Read without consuming, filling the data
+    // buffer if it has not been filled alReady.
+    public function Peek() : Bytes {
+        if (data == null) {
+            var buf = new BytesBuffer();
+            proto.trans.readAll(buf, 0, 1);
+            data = buf.getBytes();
+        }
+        return data;
+    }
 }
 
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocolFactory.hx b/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocolFactory.hx
index 169629a..363558a 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocolFactory.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocolFactory.hx
@@ -26,15 +26,15 @@
 * JSON Protocol Factory
 */
 class TJSONProtocolFactory implements TProtocolFactory {
-	
-	public function new() {
-	}
 
-	public function getProtocol( trans : TTransport) : TProtocol  {
-		return new TJSONProtocol( trans);
-	}
+    public function new() {
+    }
+
+    public function getProtocol( trans : TTransport) : TProtocol  {
+        return new TJSONProtocol( trans);
+    }
 }
 
 
 
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TList.hx b/lib/haxe/src/org/apache/thrift/protocol/TList.hx
index d6c15c1..5a1fb55 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TList.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TList.hx
@@ -16,14 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.protocol;
-  
+
 class TList {
 
     public var elemType : Int;
     public var size : Int;
-  
+
       public function new(t : Int = 0, s : Int = 0) {
         elemType = t;
         size = s;
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TMap.hx b/lib/haxe/src/org/apache/thrift/protocol/TMap.hx
index 5af8c4e..f4e6288 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TMap.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TMap.hx
@@ -16,19 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.protocol;
 
 class TMap {
-    
+
     public var keyType : Int;
     public var valueType : Int;
     public var size : Int;
-  
+
     public function new(k : Int = 0, v : Int = 0, s : Int = 0) {
       keyType = k;
       valueType = v;
       size = s;
     }
- 
+
 }
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TMessage.hx b/lib/haxe/src/org/apache/thrift/protocol/TMessage.hx
index 98c883b..58d71a9 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TMessage.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TMessage.hx
@@ -16,25 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.protocol;
-  
+
 class TMessage {
-    
+
     public var name : String;
     public var type : Int;
     public var seqid : Int;
-  
+
     public function new(n : String = "", t : Int = 0, s : Int = 0) {
       name = n;
       type = t;
       seqid = s;
     }
-    
+
     public function toString() : String {
       return "<TMessage name:'" + name + "' type: " + type + " seqid:" + seqid + ">";
     }
-    
+
     public function equals(other:TMessage) : Bool {
       return name == other.name && type == other.type && seqid == other.seqid;
     }
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TMessageType.hx b/lib/haxe/src/org/apache/thrift/protocol/TMessageType.hx
index b141940..7cb38b3 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TMessageType.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TMessageType.hx
@@ -16,12 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.protocol;
-  
+
 class TMessageType {
     public static inline var CALL      : Int = 1;
-    public static inline var REPLY 	   : Int = 2;
+    public static inline var REPLY        : Int = 2;
     public static inline var EXCEPTION : Int = 3;
     public static inline var ONEWAY    : Int = 4;
 }
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TProtocol.hx b/lib/haxe/src/org/apache/thrift/protocol/TProtocol.hx
index 58873da..0998e92 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TProtocol.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TProtocol.hx
@@ -27,7 +27,7 @@
 * Protocol interface definition
 */
 interface TProtocol {
-  
+
     function getTransport() : TTransport;
 
     /**
@@ -39,44 +39,44 @@
     function writeStructEnd() : Void;
     function writeFieldBegin(field:TField) : Void;
     function writeFieldEnd() : Void;
-    function writeFieldStop() : Void;    
-    function writeMapBegin(map:TMap) : Void;    
-    function writeMapEnd() : Void;    
-    function writeListBegin(list:TList) : Void;    
-    function writeListEnd() : Void;    
-    function writeSetBegin(set:TSet) : Void;    
-    function writeSetEnd() : Void;    
-    function writeBool(b : Bool) : Void;    
-    function writeByte(b : Int) : Void;    
-    function writeI16(i16 : Int) : Void;    
-    function writeI32(i32 : Int) : Void;    
-    function writeI64(i64 : haxe.Int64) : Void;    
-    function writeDouble(dub : Float) : Void;    
-    function writeString(str : String) : Void;    
-    function writeBinary(bin : Bytes) : Void;    
-	
+    function writeFieldStop() : Void;
+    function writeMapBegin(map:TMap) : Void;
+    function writeMapEnd() : Void;
+    function writeListBegin(list:TList) : Void;
+    function writeListEnd() : Void;
+    function writeSetBegin(set:TSet) : Void;
+    function writeSetEnd() : Void;
+    function writeBool(b : Bool) : Void;
+    function writeByte(b : Int) : Void;
+    function writeI16(i16 : Int) : Void;
+    function writeI32(i32 : Int) : Void;
+    function writeI64(i64 : haxe.Int64) : Void;
+    function writeDouble(dub : Float) : Void;
+    function writeString(str : String) : Void;
+    function writeBinary(bin : Bytes) : Void;
+
     /**
      * Reading methods.
      */
-    function readMessageBegin():TMessage;   
-    function readMessageEnd() : Void;    
-    function readStructBegin():TStruct;    
-    function readStructEnd() : Void;    
-    function readFieldBegin():TField;    
-    function readFieldEnd() : Void;    
-    function readMapBegin():TMap;    
-    function readMapEnd() : Void;    
-    function readListBegin():TList;    
-    function readListEnd() : Void;    
-    function readSetBegin():TSet;    
-    function readSetEnd() : Void;    
-    function readBool() : Bool;    
-    function readByte() : Int;    
-    function readI16() : Int;    
-    function readI32() : Int;    
-    function readI64() : haxe.Int64;     
-    function readDouble() : Float;    
-    function readString() : String;    
+    function readMessageBegin():TMessage;
+    function readMessageEnd() : Void;
+    function readStructBegin():TStruct;
+    function readStructEnd() : Void;
+    function readFieldBegin():TField;
+    function readFieldEnd() : Void;
+    function readMapBegin():TMap;
+    function readMapEnd() : Void;
+    function readListBegin():TList;
+    function readListEnd() : Void;
+    function readSetBegin():TSet;
+    function readSetEnd() : Void;
+    function readBool() : Bool;
+    function readByte() : Int;
+    function readI16() : Int;
+    function readI32() : Int;
+    function readI64() : haxe.Int64;
+    function readDouble() : Float;
+    function readString() : String;
     function readBinary() : Bytes;
 
 }
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TProtocolException.hx b/lib/haxe/src/org/apache/thrift/protocol/TProtocolException.hx
index dbbcb8c..6e528cb 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TProtocolException.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TProtocolException.hx
@@ -18,11 +18,11 @@
  */
 
 package org.apache.thrift.protocol;
-  
+
 import org.apache.thrift.TException;
 
 class TProtocolException extends TException {
-    
+
     public static inline var UNKNOWN : Int = 0;
     public static inline var INVALID_DATA : Int = 1;
     public static inline var NEGATIVE_SIZE : Int = 2;
@@ -30,10 +30,10 @@
     public static inline var BAD_VERSION : Int = 4;
     public static inline var NOT_IMPLEMENTED : Int = 5;
     public static inline var DEPTH_LIMIT : Int = 6;
-  
+
     public function new(error : Int = UNKNOWN, message : String = "") {
       super(message, error);
     }
-    
-  
-}
\ No newline at end of file
+
+
+} 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TProtocolFactory.hx b/lib/haxe/src/org/apache/thrift/protocol/TProtocolFactory.hx
index d231dbe..1c2d62e 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TProtocolFactory.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TProtocolFactory.hx
@@ -20,7 +20,7 @@
 package org.apache.thrift.protocol;
 
 import org.apache.thrift.transport.TTransport;
-  
+
 interface TProtocolFactory {
      function getProtocol(trans:TTransport):TProtocol;
 }
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TSet.hx b/lib/haxe/src/org/apache/thrift/protocol/TSet.hx
index 77806e6..44eab36 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TSet.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TSet.hx
@@ -18,15 +18,15 @@
  */
 
 package org.apache.thrift.protocol;
-  
+
 class TSet {
 
     public var elemType : Int;
     public var size : Int;
-  
+
       public function new(t : Int = 0, s : Int = 0) {
         elemType = t;
         size = s;
       }
-      
-}
\ No newline at end of file
+
+}    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TStruct.hx b/lib/haxe/src/org/apache/thrift/protocol/TStruct.hx
index faeef40..9e0b7dd 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TStruct.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TStruct.hx
@@ -18,13 +18,13 @@
  */
 
 package org.apache.thrift.protocol;
-  
+
 class TStruct {
-    
+
     public var name : String;
-    
+
     public function new(n : String = "") {
       name = n;
     }
-    
-}
\ No newline at end of file
+
+}  
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TType.hx b/lib/haxe/src/org/apache/thrift/protocol/TType.hx
index 0534399..1e093c2 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TType.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TType.hx
@@ -18,9 +18,9 @@
  */
 
 package org.apache.thrift.protocol;
-  
+
 class TType {
-    
+
     public static inline var STOP : Int   = 0;
     public static inline var VOID : Int   = 1;
     public static inline var BOOL : Int   = 2;
diff --git a/lib/haxe/src/org/apache/thrift/server/TServer.hx b/lib/haxe/src/org/apache/thrift/server/TServer.hx
index 37105bd..e689b32 100644
--- a/lib/haxe/src/org/apache/thrift/server/TServer.hx
+++ b/lib/haxe/src/org/apache/thrift/server/TServer.hx
@@ -33,73 +33,74 @@
     private var inputProtocolFactory : TProtocolFactory = null;
     private var outputProtocolFactory : TProtocolFactory = null;
 
-	// server events
-	public var serverEventHandler : TServerEventHandler = null;
+    // server events
+    public var serverEventHandler : TServerEventHandler = null;
 
     // Log delegation
     private var _logDelegate : Dynamic->Void  = null;
     public var logDelegate(default,set) : Dynamic->Void;
-	
+
     public function new( processor : TProcessor,
-						 serverTransport : TServerTransport,
-						 inputTransportFactory : TTransportFactory = null,
-						 outputTransportFactory : TTransportFactory = null,
-						 inputProtocolFactory : TProtocolFactory = null,
-						 outputProtocolFactory : TProtocolFactory = null,
-						 logDelegate : Dynamic->Void = null)
+                         serverTransport : TServerTransport,
+                         inputTransportFactory : TTransportFactory = null,
+                         outputTransportFactory : TTransportFactory = null,
+                         inputProtocolFactory : TProtocolFactory = null,
+                         outputProtocolFactory : TProtocolFactory = null,
+                         logDelegate : Dynamic->Void = null)
     {
       this.processor = processor;
       this.serverTransport = serverTransport;
-      this.inputTransportFactory = inputTransportFactory;	
+      this.inputTransportFactory = inputTransportFactory;
       this.outputTransportFactory = outputTransportFactory;
       this.inputProtocolFactory = inputProtocolFactory;
       this.outputProtocolFactory = outputProtocolFactory;
       this.logDelegate = logDelegate;
 
-	  ApplyMissingDefaults();
-	}
-	
-	private function ApplyMissingDefaults() {
-		if( processor == null) 
-			throw "Invalid server configuration: processor missing";
-		if( serverTransport == null)
-			throw "Invalid server configuration: serverTransport missing";
-		if( inputTransportFactory == null)
-			inputTransportFactory = new TTransportFactory();
-		if( outputTransportFactory  == null)
-			outputTransportFactory = new TTransportFactory();
-		if( inputProtocolFactory  == null)
-			inputProtocolFactory = new TBinaryProtocolFactory();
-		if( outputProtocolFactory == null)
-			outputProtocolFactory= new TBinaryProtocolFactory();
-		if( logDelegate == null)
-			logDelegate = DefaultLogDelegate;
+      ApplyMissingDefaults();
+    }
+
+    private function ApplyMissingDefaults() {
+        if( processor == null)
+            throw "Invalid server configuration: processor missing";
+        if( serverTransport == null)
+            throw "Invalid server configuration: serverTransport missing";
+        if( inputTransportFactory == null)
+            inputTransportFactory = new TTransportFactory();
+        if( outputTransportFactory  == null)
+            outputTransportFactory = new TTransportFactory();
+        if( inputProtocolFactory  == null)
+            inputProtocolFactory = new TBinaryProtocolFactory();
+        if( outputProtocolFactory == null)
+            outputProtocolFactory= new TBinaryProtocolFactory();
+        if( logDelegate == null)
+            logDelegate = DefaultLogDelegate;
     }
 
 
-	private function set_logDelegate(value : Dynamic->Void) : Dynamic->Void {
-		if(value != null) {
-			_logDelegate = value;
-		} else {
-			_logDelegate = DefaultLogDelegate; 
-		}
-		return _logDelegate;
-    }
-    
-		
-	private function DefaultLogDelegate(value : Dynamic) : Void  {
-		trace( value);
+    private function set_logDelegate(value : Dynamic->Void) : Dynamic->Void {
+        if(value != null) {
+            _logDelegate = value;
+        } else {
+            _logDelegate = DefaultLogDelegate;
+        }
+        return _logDelegate;
     }
 
-    
-		
+
+    private function DefaultLogDelegate(value : Dynamic) : Void  {
+        trace( value);
+    }
+
+
+
     public function Serve() : Void {
-		throw new AbstractMethodError();
-	}
-		
-	
+        throw new AbstractMethodError();
+    }
+
+
     public function Stop() : Void {
-		throw new AbstractMethodError();
-	}
-	
+        throw new AbstractMethodError();
+    }
+
 }
+ 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/server/TServerEventHandler.hx b/lib/haxe/src/org/apache/thrift/server/TServerEventHandler.hx
index 83bff95..9bc9927 100644
--- a/lib/haxe/src/org/apache/thrift/server/TServerEventHandler.hx
+++ b/lib/haxe/src/org/apache/thrift/server/TServerEventHandler.hx
@@ -27,15 +27,15 @@
 // Interface implemented by server users to handle events from the server
 interface TServerEventHandler {
 
-	// Called before the server begins 
+    // Called before the server begins
     function preServe() : Void;
-	
-    // Called when a new client has connected and is about to being processing 
+
+    // Called when a new client has connected and is about to being processing
     function createContext( input : TProtocol, output : TProtocol) : Dynamic;
-    
-	// Called when a client has finished request-handling to delete server context 
+
+    // Called when a client has finished request-handling to delete server context
     function deleteContext( serverContext : Dynamic, input : TProtocol, output : TProtocol) : Void;
-    
-	// Called when a client is about to call the processor 
+
+    // Called when a client is about to call the processor
     function processContext( serverContext : Dynamic, transport : TTransport) : Void;
 }
diff --git a/lib/haxe/src/org/apache/thrift/server/TSimpleServer.hx b/lib/haxe/src/org/apache/thrift/server/TSimpleServer.hx
index c516b78..cb7cbd6 100644
--- a/lib/haxe/src/org/apache/thrift/server/TSimpleServer.hx
+++ b/lib/haxe/src/org/apache/thrift/server/TSimpleServer.hx
@@ -30,92 +30,92 @@
     private var stop : Bool = false;
 
     public function new( processor : TProcessor,
-						 serverTransport : TServerTransport,
-						 transportFactory : TTransportFactory = null,
-						 protocolFactory : TProtocolFactory = null,
-						 logDelegate : Dynamic->Void = null) {
+                         serverTransport : TServerTransport,
+                         transportFactory : TTransportFactory = null,
+                         protocolFactory : TProtocolFactory = null,
+                         logDelegate : Dynamic->Void = null) {
       super( processor, serverTransport,
-			 transportFactory, transportFactory,
-			 protocolFactory, protocolFactory,
-			 logDelegate);
+             transportFactory, transportFactory,
+             protocolFactory, protocolFactory,
+             logDelegate);
     }
 
 
-	
-    public override function Serve() : Void 
-	{
-		try
-		{
-			serverTransport.Listen();
-		}
-		catch (ttx : TTransportException)
-		{
-			logDelegate(ttx);
-			return;
-		}
 
-		// Fire the preServe server event when server is up, 
-		// but before any client connections
-		if (serverEventHandler != null) {
-			serverEventHandler.preServe();
-		}
+    public override function Serve() : Void
+    {
+        try
+        {
+            serverTransport.Listen();
+        }
+        catch (ttx : TTransportException)
+        {
+            logDelegate(ttx);
+            return;
+        }
 
-		while( ! stop)
-		{
-			var client : TTransport = null;
-			var inputTransport : TTransport = null;
-			var outputTransport : TTransport = null;
-			var inputProtocol : TProtocol = null;
-			var outputProtocol : TProtocol = null;
-			var connectionContext : Dynamic = null;
-			try
-			{
-				client = serverTransport.Accept();
-				if (client != null) {
-					inputTransport = inputTransportFactory.getTransport( client);
-					outputTransport = outputTransportFactory.getTransport( client);
-					inputProtocol = inputProtocolFactory.getProtocol( inputTransport);
-					outputProtocol = outputProtocolFactory.getProtocol( outputTransport);
+        // Fire the preServe server event when server is up,
+        // but before any client connections
+        if (serverEventHandler != null) {
+            serverEventHandler.preServe();
+        }
 
-					// Recover event handler (if any) and fire createContext 
-					// server event when a client connects
-					if (serverEventHandler != null) {
-						connectionContext = serverEventHandler.createContext(inputProtocol, outputProtocol);
-					}
+        while( ! stop)
+        {
+            var client : TTransport = null;
+            var inputTransport : TTransport = null;
+            var outputTransport : TTransport = null;
+            var inputProtocol : TProtocol = null;
+            var outputProtocol : TProtocol = null;
+            var connectionContext : Dynamic = null;
+            try
+            {
+                client = serverTransport.Accept();
+                if (client != null) {
+                    inputTransport = inputTransportFactory.getTransport( client);
+                    outputTransport = outputTransportFactory.getTransport( client);
+                    inputProtocol = inputProtocolFactory.getProtocol( inputTransport);
+                    outputProtocol = outputProtocolFactory.getProtocol( outputTransport);
 
-					// Process client requests until client disconnects
-					while( true) {
-						// Fire processContext server event
-						// N.B. This is the pattern implemented in C++ and the event fires provisionally.
-						// That is to say it may be many minutes between the event firing and the client request
-						// actually arriving or the client may hang up without ever makeing a request.
-						if (serverEventHandler != null) {
-							serverEventHandler.processContext(connectionContext, inputTransport);
-						}
-							
-						//Process client request (blocks until transport is readable)
-						if( ! processor.process( inputProtocol, outputProtocol)) {
-							break;
-						}
-					}
-				}
-			}
-			catch( ttx : TTransportException)
-			{
-			  	// Usually a client disconnect, expected
-			}
-			catch( e : Dynamic)
-			{
-				// Unexpected
-			  	logDelegate(e); 
-			}
+                    // Recover event handler (if any) and fire createContext
+                    // server event when a client connects
+                    if (serverEventHandler != null) {
+                        connectionContext = serverEventHandler.createContext(inputProtocol, outputProtocol);
+                    }
 
-			// Fire deleteContext server event after client disconnects
-			if (serverEventHandler != null) {
-				serverEventHandler.deleteContext(connectionContext, inputProtocol, outputProtocol);
-			}
-		}
-	}
+                    // Process client requests until client disconnects
+                    while( true) {
+                        // Fire processContext server event
+                        // N.B. This is the pattern implemented in C++ and the event fires provisionally.
+                        // That is to say it may be many minutes between the event firing and the client request
+                        // actually arriving or the client may hang up without ever makeing a request.
+                        if (serverEventHandler != null) {
+                            serverEventHandler.processContext(connectionContext, inputTransport);
+                        }
+
+                        //Process client request (blocks until transport is readable)
+                        if( ! processor.process( inputProtocol, outputProtocol)) {
+                            break;
+                        }
+                    }
+                }
+            }
+            catch( ttx : TTransportException)
+            {
+                  // Usually a client disconnect, expected
+            }
+            catch( e : Dynamic)
+            {
+                // Unexpected
+                  logDelegate(e);
+            }
+
+            // Fire deleteContext server event after client disconnects
+            if (serverEventHandler != null) {
+                serverEventHandler.deleteContext(connectionContext, inputProtocol, outputProtocol);
+            }
+        }
+    }
 
     public override function Stop() : Void
     {
diff --git a/lib/haxe/src/org/apache/thrift/transport/TFileStream.hx b/lib/haxe/src/org/apache/thrift/transport/TFileStream.hx
index 03e031f..cd8ad17 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TFileStream.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TFileStream.hx
@@ -26,75 +26,76 @@
 
 
 enum TFileMode {
-	CreateNew;
-	Append;
-	Read;
+    CreateNew;
+    Append;
+    Read;
 }
-	
+
 
 class TFileStream implements TStream {
 
-	public var FileName(default,null) : String;
-	
-	private var Input  : sys.io.FileInput;
-	private var Output : sys.io.FileOutput;
-	
-	
-	public function new( fname : String, mode : TFileMode) {
-		FileName = fname;	
-		switch ( mode)
-		{
-			case TFileMode.CreateNew:
-				Output = sys.io.File.write( fname, true);
+    public var FileName(default,null) : String;
 
-			case TFileMode.Append:
-				Output = sys.io.File.append( fname, true);
+    private var Input  : sys.io.FileInput;
+    private var Output : sys.io.FileOutput;
 
-			case TFileMode.Read:
-				Input = sys.io.File.read( fname, true);
 
-			default:
-				throw new TTransportException( TTransportException.UNKNOWN,
-											   "Unsupported mode");
-		}
+    public function new( fname : String, mode : TFileMode) {
+        FileName = fname;
+        switch ( mode)
+        {
+            case TFileMode.CreateNew:
+                Output = sys.io.File.write( fname, true);
 
-	}
-	
-	public function Close() : Void {
-		if( Input != null) {
-			Input.close();
-			Input = null;
-		}
-		if( Output != null) { 
-			Output.close();
-			Output = null;
-		}
-	}
-	
-	public function Peek() : Bool {
-		if( Input == null)
-			throw new TTransportException( TTransportException.NOT_OPEN, "File not open for input");
+            case TFileMode.Append:
+                Output = sys.io.File.append( fname, true);
 
-		return (! Input.eof());
-	}
-	
-	public function Read( buf : Bytes, offset : Int, count : Int) : Int {
-		if( Input == null)
-			throw new TTransportException( TTransportException.NOT_OPEN, "File not open for input");
+            case TFileMode.Read:
+                Input = sys.io.File.read( fname, true);
 
-		return Input.readBytes( buf, offset, count);
-	}
-	
-	public function Write( buf : Bytes, offset : Int, count : Int) : Void {
-		if( Output == null)
-			throw new TTransportException( TTransportException.NOT_OPEN, "File not open for output");
-		
-		Output.writeBytes( buf, offset, count);			
-	}
+            default:
+                throw new TTransportException( TTransportException.UNKNOWN,
+                                               "Unsupported mode");
+        }
 
-	public function Flush() : Void {
-		if( Output != null) 
-			Output.flush();
-	}
-	
+    }
+
+    public function Close() : Void {
+        if( Input != null) {
+            Input.close();
+            Input = null;
+        }
+        if( Output != null) {
+            Output.close();
+            Output = null;
+        }
+    }
+
+    public function Peek() : Bool {
+        if( Input == null)
+            throw new TTransportException( TTransportException.NOT_OPEN, "File not open for input");
+
+        return (! Input.eof());
+    }
+
+    public function Read( buf : Bytes, offset : Int, count : Int) : Int {
+        if( Input == null)
+            throw new TTransportException( TTransportException.NOT_OPEN, "File not open for input");
+
+        return Input.readBytes( buf, offset, count);
+    }
+
+    public function Write( buf : Bytes, offset : Int, count : Int) : Void {
+        if( Output == null)
+            throw new TTransportException( TTransportException.NOT_OPEN, "File not open for output");
+
+        Output.writeBytes( buf, offset, count);
+    }
+
+    public function Flush() : Void {
+        if( Output != null)
+            Output.flush();
+    }
+
 }
+ 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/transport/TFramedTransport.hx b/lib/haxe/src/org/apache/thrift/transport/TFramedTransport.hx
index 77335e7..5f0168a 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TFramedTransport.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TFramedTransport.hx
@@ -56,86 +56,86 @@
      * Constructor wraps around another transport
      */
     public function new( transport : TTransport, maxLength : Int = DEFAULT_MAX_LENGTH) {
-    	transport_ = transport;
-    	maxLength_ = maxLength;
+        transport_ = transport;
+        maxLength_ = maxLength;
     }
 
     public override function open() : Void {
-    	transport_.open();
+        transport_.open();
     }
 
     public override function isOpen() : Bool {
-    	return transport_.isOpen();
+        return transport_.isOpen();
     }
 
     public override function close() : Void {
-    	transport_.close();
+        transport_.close();
     }
 
     public override function read(buf : BytesBuffer, off : Int, len : Int) : Int {
-		var data = Bytes.alloc(len);
-		
-    	if (readBuffer_ != null) {
-    		var got : Int = readBuffer_.readBytes(data, off, len);
-    		if (got > 0) {
-				buf.addBytes(data,0,got);
-    			return got;
-    		};
-    	};
-		
-    	// Read another frame of data
-    	readFrame();
+        var data = Bytes.alloc(len);
 
-    	var got = readBuffer_.readBytes(data, off, len);
-		buf.addBytes(data,0,got);
-		return got;
+        if (readBuffer_ != null) {
+            var got : Int = readBuffer_.readBytes(data, off, len);
+            if (got > 0) {
+                buf.addBytes(data,0,got);
+                return got;
+            };
+        };
+
+        // Read another frame of data
+        readFrame();
+
+        var got = readBuffer_.readBytes(data, off, len);
+        buf.addBytes(data,0,got);
+        return got;
     }
 
 
     function readFrameSize() : Int {
-    	var buffer = new BytesBuffer();
-    	var len = transport_.readAll( buffer, 0, 4);
-    	var inp = new BytesInput( buffer.getBytes(), 0, 4);
-    	inp.bigEndian = true;
-    	return inp.readInt32();
+        var buffer = new BytesBuffer();
+        var len = transport_.readAll( buffer, 0, 4);
+        var inp = new BytesInput( buffer.getBytes(), 0, 4);
+        inp.bigEndian = true;
+        return inp.readInt32();
     }
 
 
     function readFrame() : Void {
-    	var size : Int = readFrameSize();
-		
-    	if (size < 0) {
-    		throw new TTransportException(TTransportException.UNKNOWN, 'Read a negative frame size ($size)!');
-    	};
-    	if (size > maxLength_) {
-    		throw new TTransportException(TTransportException.UNKNOWN, 'Frame size ($size) larger than max length ($maxLength_)!');
-    	};
+        var size : Int = readFrameSize();
 
-    	var buffer = new BytesBuffer();
-    	size = transport_.readAll( buffer, 0, size);
-    	readBuffer_ = new BytesInput( buffer.getBytes(), 0, size);
-    	readBuffer_.bigEndian = true;
+        if (size < 0) {
+            throw new TTransportException(TTransportException.UNKNOWN, 'Read a negative frame size ($size)!');
+        };
+        if (size > maxLength_) {
+            throw new TTransportException(TTransportException.UNKNOWN, 'Frame size ($size) larger than max length ($maxLength_)!');
+        };
+
+        var buffer = new BytesBuffer();
+        size = transport_.readAll( buffer, 0, size);
+        readBuffer_ = new BytesInput( buffer.getBytes(), 0, size);
+        readBuffer_.bigEndian = true;
     }
 
     public override function write(buf : Bytes, off : Int, len : Int) : Void {
-    	writeBuffer_.writeBytes(buf, off, len);
+        writeBuffer_.writeBytes(buf, off, len);
     }
 
     function writeFrameSize(len : Int) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeInt32(len);
-		transport_.write(out.getBytes(), 0, 4);
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeInt32(len);
+        transport_.write(out.getBytes(), 0, 4);
     }
 
     public override function flush( callback : Dynamic->Void =null) : Void {
-    	var buf : Bytes = writeBuffer_.getBytes();
-    	var len : Int = buf.length;
-    	writeBuffer_ = new BytesOutput();
+        var buf : Bytes = writeBuffer_.getBytes();
+        var len : Int = buf.length;
+        writeBuffer_ = new BytesOutput();
 
-		writeFrameSize(len);
-    	transport_.write(buf, 0, len);
-    	transport_.flush();
+        writeFrameSize(len);
+        transport_.write(buf, 0, len);
+        transport_.flush();
     }
 }
 
diff --git a/lib/haxe/src/org/apache/thrift/transport/TFramedTransportFactory.hx b/lib/haxe/src/org/apache/thrift/transport/TFramedTransportFactory.hx
index 3cca1f8..8d45a64 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TFramedTransportFactory.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TFramedTransportFactory.hx
@@ -27,11 +27,11 @@
     var maxLength_ : Int;
 
     public function new(maxLength : Int = TFramedTransport.DEFAULT_MAX_LENGTH) {
-		super();
-    	maxLength_ = maxLength;
+        super();
+        maxLength_ = maxLength;
     }
 
     public override function getTransport(base : TTransport) : TTransport {
-    	return new TFramedTransport(base, maxLength_);
+        return new TFramedTransport(base, maxLength_);
     }
 }
diff --git a/lib/haxe/src/org/apache/thrift/transport/TFullDuplexHttpClient.hx b/lib/haxe/src/org/apache/thrift/transport/TFullDuplexHttpClient.hx
index 4e898f8..3cd2e51 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TFullDuplexHttpClient.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TFullDuplexHttpClient.hx
@@ -73,15 +73,15 @@
             socket.close()
         }
 
-    	public override function peek()  :  Bool
-    	{
-			if(socket.connected)
-			{
-				trace("Bytes remained:" + socket.bytesAvailable);
-				return socket.bytesAvailable>0;
-			}
-			return false;
-		}
+        public override function peek()  :  Bool
+        {
+            if(socket.connected)
+            {
+                trace("Bytes remained:" + socket.bytesAvailable);
+                return socket.bytesAvailable>0;
+            }
+            return false;
+        }
 
         public override function read(buf : Bytes, off  :  Int, len  :  Int)  :  Int
         {
@@ -137,11 +137,11 @@
                 trace(e);
                 throw new TTransportException(TTransportException.UNKNOWN, "No more data available.");
             }
-			catch (e : TException)
-			{
-				trace('TException $e');
-				throw e;
-			}
+            catch (e : TException)
+            {
+                trace('TException $e');
+                throw e;
+            }
             catch (e : Error)
             {
                 trace(e);
@@ -217,7 +217,7 @@
 
         public function socketDataHandler(event : ProgressEvent)  :  Void
         {
-        	trace("Got Data call:" +ioCallback);
+            trace("Got Data call:" +ioCallback);
             if (ioCallback != null)
             {
                 ioCallback(null);
diff --git a/lib/haxe/src/org/apache/thrift/transport/THttpClient.hx b/lib/haxe/src/org/apache/thrift/transport/THttpClient.hx
index 52a9d26..79f8661 100644
--- a/lib/haxe/src/org/apache/thrift/transport/THttpClient.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/THttpClient.hx
@@ -19,7 +19,7 @@
 
 package org.apache.thrift.transport;
 
-	
+
 import haxe.io.Bytes;
 import haxe.io.BytesBuffer;
 import haxe.io.BytesOutput;
@@ -28,76 +28,76 @@
 import haxe.Http;
 
 
-	
+
 /**
 * HTTP implementation of the TTransport interface. Used for working with a
 * Thrift web services implementation.
 */
-	
+
 class THttpClient extends TTransport {
 
     private var requestBuffer_  : BytesOutput = new BytesOutput();
     private var responseBuffer_ : BytesInput = null;
 
-	private var request_        : Http = null;
+    private var request_        : Http = null;
 
-    
-	public function new( requestUrl : String) : Void {
-	  	request_ = new Http(requestUrl);
-		request_.addHeader( "contentType", "application/x-thrift");
+
+    public function new( requestUrl : String) : Void {
+          request_ = new Http(requestUrl);
+        request_.addHeader( "contentType", "application/x-thrift");
     }
-    
-   
+
+
     public override function open() : Void {
     }
 
     public override function close() : Void {
     }
- 
+
     public override function isOpen() : Bool {
       return true;
     }
-    
+
     public override function read(buf:BytesBuffer, off : Int, len : Int) : Int {
-		if (responseBuffer_ == null) {
-        	throw new TTransportException(TTransportException.UNKNOWN, "Response buffer is empty, no request.");
-		}
-		
+        if (responseBuffer_ == null) {
+            throw new TTransportException(TTransportException.UNKNOWN, "Response buffer is empty, no request.");
+        }
+
         var data =Bytes.alloc(len);
-		len = responseBuffer_.readBytes(data, off, len);
-		buf.addBytes(data,0,len);
-		return len;
+        len = responseBuffer_.readBytes(data, off, len);
+        buf.addBytes(data,0,len);
+        return len;
     }
 
     public override function write(buf:Bytes, off : Int, len : Int) : Void {
       requestBuffer_.writeBytes(buf, off, len);
     }
 
-	
+
     public override function flush(callback:Dynamic->Void = null) : Void {
-		var buffer = requestBuffer_;
-		requestBuffer_ = new BytesOutput();
-		responseBuffer_ = null;
-			
-		request_.onData = function(data : String) { 
-			var tmp = new BytesBuffer();
-			tmp.addString(data);
-			responseBuffer_ = new BytesInput(tmp.getBytes());
-			if( callback != null) {
-				callback(null);
-			}
-		};
-		
-		request_.onError = function(msg : String) {
-			if( callback != null) {
-				callback(new TTransportException(TTransportException.UNKNOWN, "IOError: " + msg));
-			}
-		};
-		
-		request_.setPostData(buffer.getBytes().toString());
-		request_.request(true/*POST*/);
+        var buffer = requestBuffer_;
+        requestBuffer_ = new BytesOutput();
+        responseBuffer_ = null;
+
+        request_.onData = function(data : String) {
+            var tmp = new BytesBuffer();
+            tmp.addString(data);
+            responseBuffer_ = new BytesInput(tmp.getBytes());
+            if( callback != null) {
+                callback(null);
+            }
+        };
+
+        request_.onError = function(msg : String) {
+            if( callback != null) {
+                callback(new TTransportException(TTransportException.UNKNOWN, "IOError: " + msg));
+            }
+        };
+
+        request_.setPostData(buffer.getBytes().toString());
+        request_.request(true/*POST*/);
     }
-		
+
 }
 
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/transport/TServerSocket.hx b/lib/haxe/src/org/apache/thrift/transport/TServerSocket.hx
index 0eae931..f38b584 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TServerSocket.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TServerSocket.hx
@@ -19,7 +19,7 @@
 
 package org.apache.thrift.transport;
 
-import haxe.remoting.SocketProtocol;	
+import haxe.remoting.SocketProtocol;
 import haxe.io.Bytes;
 import haxe.io.BytesBuffer;
 import haxe.io.BytesInput;
@@ -29,104 +29,104 @@
 import haxe.io.Eof;
 
 //import flash.net.ServerSocket; - not yet available on Haxe 3.1.3
-#if ! (flash || html5) 
-	
+#if ! (flash || html5)
+
 import sys.net.Host;
 
 
 class TServerSocket extends TServerTransport {
 
-	// Underlying server with socket
-	private var _socket : Socket= null;
+    // Underlying server with socket
+    private var _socket : Socket= null;
 
-	// Port to listen on
-	private var _port : Int = 0;
+    // Port to listen on
+    private var _port : Int = 0;
 
-	// Timeout for client sockets from accept
-	private var _clientTimeout : Int = 0;
+    // Timeout for client sockets from accept
+    private var _clientTimeout : Int = 0;
 
-	// Whether or not to wrap new TSocket connections in buffers
-	private var _useBufferedSockets : Bool = false;
-
-	
-	public function new( port : Int, clientTimeout : Int = 0, useBufferedSockets : Bool = false)
-	{
-		_port = port;
-		_clientTimeout = clientTimeout;
-		_useBufferedSockets = useBufferedSockets;
-
-		try
-		{
-			_socket = new Socket();
-			_socket.bind( new Host('localhost'), port);
-		}
-		catch (e : Dynamic)
-		{
-			_socket = null;
-			throw new TTransportException( TTransportException.UNKNOWN, 'Could not create ServerSocket on port $port: $e');
-		}
-	}
+    // Whether or not to wrap new TSocket connections in buffers
+    private var _useBufferedSockets : Bool = false;
 
 
-	public override function Listen() : Void
-	{
-		// Make sure not to block on accept
-		if (_socket != null)	{
-			try
-			{
-				_socket.listen(1);
-			}
-			catch (e : Dynamic)
-			{
-				trace('Error $e');
-				throw new TTransportException( TTransportException.UNKNOWN, 'Could not accept on listening socket: $e');
-			}
-		}
-	}
+    public function new( port : Int, clientTimeout : Int = 0, useBufferedSockets : Bool = false)
+    {
+        _port = port;
+        _clientTimeout = clientTimeout;
+        _useBufferedSockets = useBufferedSockets;
 
-	private override function AcceptImpl() : TTransport
-	{
-		if (_socket == null) {
-			throw new TTransportException( TTransportException.NOT_OPEN, "No underlying server socket.");
-		}
-		
-		try
-		{
-			var accepted = _socket.accept();
-			var result = TSocket.fromSocket(accepted);
-			accepted.setTimeout( _clientTimeout);
+        try
+        {
+            _socket = new Socket();
+            _socket.bind( new Host('localhost'), port);
+        }
+        catch (e : Dynamic)
+        {
+            _socket = null;
+            throw new TTransportException( TTransportException.UNKNOWN, 'Could not create ServerSocket on port $port: $e');
+        }
+    }
 
-			if( _useBufferedSockets)
-			{
-				throw "buffered transport not yet supported";  // TODO
-				//result = new TBufferedTransport(result);
-			}
 
-			return result;
-		}
-		catch (e : Dynamic)
-		{
-			trace('Error $e');
-			throw new TTransportException( TTransportException.UNKNOWN, '$e');
-		}
-	}
+    public override function Listen() : Void
+    {
+        // Make sure not to block on accept
+        if (_socket != null)    {
+            try
+            {
+                _socket.listen(1);
+            }
+            catch (e : Dynamic)
+            {
+                trace('Error $e');
+                throw new TTransportException( TTransportException.UNKNOWN, 'Could not accept on listening socket: $e');
+            }
+        }
+    }
 
-	public override function Close() : Void
-	{
-		if (_socket != null)
-		{
-			try
-			{
-				_socket.close();
-			}
-			catch (e : Dynamic)
-			{
-				trace('Error $e');
-				throw new TTransportException( TTransportException.UNKNOWN, 'WARNING: Could not close server socket: $e');
-			}
-			_socket = null;
-		}
-	}
+    private override function AcceptImpl() : TTransport
+    {
+        if (_socket == null) {
+            throw new TTransportException( TTransportException.NOT_OPEN, "No underlying server socket.");
+        }
+
+        try
+        {
+            var accepted = _socket.accept();
+            var result = TSocket.fromSocket(accepted);
+            accepted.setTimeout( _clientTimeout);
+
+            if( _useBufferedSockets)
+            {
+                throw "buffered transport not yet supported";  // TODO
+                //result = new TBufferedTransport(result);
+            }
+
+            return result;
+        }
+        catch (e : Dynamic)
+        {
+            trace('Error $e');
+            throw new TTransportException( TTransportException.UNKNOWN, '$e');
+        }
+    }
+
+    public override function Close() : Void
+    {
+        if (_socket != null)
+        {
+            try
+            {
+                _socket.close();
+            }
+            catch (e : Dynamic)
+            {
+                trace('Error $e');
+                throw new TTransportException( TTransportException.UNKNOWN, 'WARNING: Could not close server socket: $e');
+            }
+            _socket = null;
+        }
+    }
 }
 
 #end
diff --git a/lib/haxe/src/org/apache/thrift/transport/TServerTransport.hx b/lib/haxe/src/org/apache/thrift/transport/TServerTransport.hx
index 5819803..2189981 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TServerTransport.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TServerTransport.hx
@@ -21,23 +21,23 @@
 
 class TServerTransport {
 
-	public function Accept() : TTransport {
-		var transport = AcceptImpl();
-		if (transport == null) {
-		  throw new TTransportException( TTransportException.UNKNOWN, "accept() may not return NULL");
-		}
-		return transport;
-	}
-	
-	public function Listen() : Void {
-		throw new AbstractMethodError();
-	}
-	
-	public function Close() : Void {
-		throw new AbstractMethodError();
-	}
-	
-	private function AcceptImpl() : TTransport {
-		throw new AbstractMethodError();
-	}
+    public function Accept() : TTransport {
+        var transport = AcceptImpl();
+        if (transport == null) {
+          throw new TTransportException( TTransportException.UNKNOWN, "accept() may not return NULL");
+        }
+        return transport;
+    }
+
+    public function Listen() : Void {
+        throw new AbstractMethodError();
+    }
+
+    public function Close() : Void {
+        throw new AbstractMethodError();
+    }
+
+    private function AcceptImpl() : TTransport {
+        throw new AbstractMethodError();
+    }
 }
diff --git a/lib/haxe/src/org/apache/thrift/transport/TSocket.hx b/lib/haxe/src/org/apache/thrift/transport/TSocket.hx
index 306730d..9d5e2dc 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TSocket.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TSocket.hx
@@ -24,7 +24,7 @@
 #elseif js
 import js.html.WebSocket;
 #else
-import haxe.remoting.SocketProtocol;	
+import haxe.remoting.SocketProtocol;
 #end
 
 import haxe.io.Bytes;
@@ -47,250 +47,250 @@
    */
 
 class TSocket extends TTransport  {
-	
+
     #if (flash || js)
-	private var host  :  String;
-	#else
-	private var host  :  Host;
-	#end
-	
+    private var host  :  String;
+    #else
+    private var host  :  Host;
+    #end
+
     private var port  :  Int;
 
-	#if js
+    #if js
     private var socket : WebSocket = null;
-	#else
+    #else
     private var socket : Socket = null;
-	#end
+    #end
 
-	#if js
+    #if js
     private var input : Dynamic = null;
     private var output : WebSocket = null;
-	#elseif flash
+    #elseif flash
     private var input : Socket = null;
     private var output : Socket = null;
-	#else 
-	private var input : Input = null;
+    #else
+    private var input : Input = null;
     private var output : Output = null;
-	#end
+    #end
 
-	private var obuffer : BytesOutput = new BytesOutput();
+    private var obuffer : BytesOutput = new BytesOutput();
     private var ioCallback : TException->Void = null;
-	private var readCount : Int = 0;
-	
+    private var readCount : Int = 0;
+
     public function new(host : String, port  :  Int)  :  Void  {
-		#if (flash || js)
-		this.host = host;
-		#else
-		this.host = new Host(host);
-		#end
-		this.port = port;
+        #if (flash || js)
+        this.host = host;
+        #else
+        this.host = new Host(host);
+        #end
+        this.port = port;
     }
 
-	#if ! (flash || js)
-	// used by TSocketServer
+    #if ! (flash || js)
+    // used by TSocketServer
     public static function fromSocket( socket : Socket) : TSocket  {
-		var result = new TSocket("",0);
-		result.assignSocket(socket);
-		return result;
+        var result = new TSocket("",0);
+        result.assignSocket(socket);
+        return result;
     }
-	#end
+    #end
 
     public override function close()  :  Void  {
-		input = null;
-		output = null;
-		socket.close();
+        input = null;
+        output = null;
+        socket.close();
     }
 
     public override function peek()  :  Bool  {
-		if( (input == null) || (socket == null)) {
-			return false;
-		} else {
-			#if flash 
-			return (input.bytesAvailable > 0);
-			#elseif js
-			return true;
-			#else
-			var ready = Socket.select( [socket], null, null, 0);
-			return (ready.read.length > 0);
-			#end
-		}
+        if( (input == null) || (socket == null)) {
+            return false;
+        } else {
+            #if flash
+            return (input.bytesAvailable > 0);
+            #elseif js
+            return true;
+            #else
+            var ready = Socket.select( [socket], null, null, 0);
+            return (ready.read.length > 0);
+            #end
+        }
     }
 
-	
-	public override function read( buf : BytesBuffer, off : Int, len : Int) : Int   {
-		try
-		{
-			#if flash
 
-			var remaining = len;	
-			while( remaining > 0) {
-				buf.addByte( input.readByte());
-				--remaining;
-			}
-			return len;
-			
-			#elseif js
-			
-			if( input == null) {
-				throw new TTransportException(TTransportException.UNKNOWN, "Still no data ");  // don't block
-			}
-			var nr = len;	
-			while( nr < len) {
-				buf.addByte( input.get(off+nr));
-				++nr;
-			}
-			return len;
-			
-			#else
-			
-			socket.waitForRead();
-			if(readCount < off) {
-				input.read(off-readCount);	
-				readCount = off;
-			}
-			var data = input.read(len);
-			readCount += data.length;
-			buf.add(data);
-			return data.length;
-			
-			#end
-		}
-		catch (e : Eof)
-		{
-			trace('Eof $e');
-			throw new TTransportException(TTransportException.END_OF_FILE, "No more data available.");
-		}
-		catch (e : TException)
-		{
-			trace('TException $e');
-			throw e;
-		}
-		catch (e : Dynamic)
-		{
-			trace('Error $e');
-			throw new TTransportException(TTransportException.UNKNOWN, 'Bad IO error : $e');
-		}
+    public override function read( buf : BytesBuffer, off : Int, len : Int) : Int   {
+        try
+        {
+            #if flash
+
+            var remaining = len;
+            while( remaining > 0) {
+                buf.addByte( input.readByte());
+                --remaining;
+            }
+            return len;
+
+            #elseif js
+
+            if( input == null) {
+                throw new TTransportException(TTransportException.UNKNOWN, "Still no data ");  // don't block
+            }
+            var nr = len;
+            while( nr < len) {
+                buf.addByte( input.get(off+nr));
+                ++nr;
+            }
+            return len;
+
+            #else
+
+            socket.waitForRead();
+            if(readCount < off) {
+                input.read(off-readCount);
+                readCount = off;
+            }
+            var data = input.read(len);
+            readCount += data.length;
+            buf.add(data);
+            return data.length;
+
+            #end
+        }
+        catch (e : Eof)
+        {
+            trace('Eof $e');
+            throw new TTransportException(TTransportException.END_OF_FILE, "No more data available.");
+        }
+        catch (e : TException)
+        {
+            trace('TException $e');
+            throw e;
+        }
+        catch (e : Dynamic)
+        {
+            trace('Error $e');
+            throw new TTransportException(TTransportException.UNKNOWN, 'Bad IO error : $e');
+        }
     }
-		
-	
+
+
     public override function write(buf : Bytes, off  :  Int, len  :  Int)  :  Void
     {
-		obuffer.writeBytes(buf, off, len);
+        obuffer.writeBytes(buf, off, len);
     }
 
 
-		
+
     public override function flush(callback : Dynamic->Void = null)  :  Void
     {
-		if( ! isOpen())
-		{
-			throw new TTransportException(TTransportException.NOT_OPEN, "Transport not open");
-		}
+        if( ! isOpen())
+        {
+            throw new TTransportException(TTransportException.NOT_OPEN, "Transport not open");
+        }
 
-		#if flash
-			
-		var bytes = new flash.utils.ByteArray();
-		var data = obuffer.getBytes();
-		var len = 0;
-		while( len < data.length) {
-			bytes.writeByte(data.get(len));
-			++len;
-		}
+        #if flash
 
-		#elseif js
-		
-		var data = obuffer.getBytes();
-		var outbuf = new js.html.Int8Array(data.length);
-		var len = 0;
-		while( len < data.length) {
-			outbuf.set( [data.get(len)], len);
-			++len;
-		}
-		var bytes = outbuf.buffer;
-		
+        var bytes = new flash.utils.ByteArray();
+        var data = obuffer.getBytes();
+        var len = 0;
+        while( len < data.length) {
+            bytes.writeByte(data.get(len));
+            ++len;
+        }
 
-		#else
-		
-		var bytes = obuffer.getBytes();
-		var len = bytes.length;
-		
-		#end
-			
-		obuffer = new BytesOutput();
+        #elseif js
 
-		
-		ioCallback = callback;
-		try {
-			readCount = 0;
-			#if js
-			output.send( bytes);
-			#else
-			output.writeBytes( bytes, 0, bytes.length);
-			#end
-			if(ioCallback != null) {
-				ioCallback(null);  // success call 
-			}
-		}
-		catch (e : TException)
-		{
-			trace('TException $e');
-			if(ioCallback != null) {
-				ioCallback(e);
-			}
-		}
-		catch (e : Dynamic) {
-			trace(e);
-			if(ioCallback != null) {
-				ioCallback(new TTransportException(TTransportException.UNKNOWN, 'Bad IO error : $e'));
-			}
-		}
+        var data = obuffer.getBytes();
+        var outbuf = new js.html.Int8Array(data.length);
+        var len = 0;
+        while( len < data.length) {
+            outbuf.set( [data.get(len)], len);
+            ++len;
+        }
+        var bytes = outbuf.buffer;
+
+
+        #else
+
+        var bytes = obuffer.getBytes();
+        var len = bytes.length;
+
+        #end
+
+        obuffer = new BytesOutput();
+
+
+        ioCallback = callback;
+        try {
+            readCount = 0;
+            #if js
+            output.send( bytes);
+            #else
+            output.writeBytes( bytes, 0, bytes.length);
+            #end
+            if(ioCallback != null) {
+                ioCallback(null);  // success call
+            }
+        }
+        catch (e : TException)
+        {
+            trace('TException $e');
+            if(ioCallback != null) {
+                ioCallback(e);
+            }
+        }
+        catch (e : Dynamic) {
+            trace(e);
+            if(ioCallback != null) {
+                ioCallback(new TTransportException(TTransportException.UNKNOWN, 'Bad IO error : $e'));
+            }
+        }
     }
 
     public override function isOpen()  :  Bool
     {
-		return (socket != null);
+        return (socket != null);
     }
 
     public override function open()  :  Void
     {
-		#if js
-		var socket = new WebSocket();
-		socket.onmessage = function( event : js.html.MessageEvent) {
-			this.input = event.data;
-		}
-		
-		#elseif flash
-			
-		var socket = new Socket();
-		socket.connect(host, port);
+        #if js
+        var socket = new WebSocket();
+        socket.onmessage = function( event : js.html.MessageEvent) {
+            this.input = event.data;
+        }
 
-		#else
-			
-		var socket = new Socket();
-		socket.setBlocking(true);
-		socket.setFastSend(true);
-		socket.connect(host, port);
+        #elseif flash
 
-		#end
-			
-		assignSocket( socket);
+        var socket = new Socket();
+        socket.connect(host, port);
+
+        #else
+
+        var socket = new Socket();
+        socket.setBlocking(true);
+        socket.setFastSend(true);
+        socket.connect(host, port);
+
+        #end
+
+        assignSocket( socket);
     }
 
-	#if js
-	private function assignSocket( socket : WebSocket)  :  Void
-	#else
-	private function assignSocket( socket : Socket)  :  Void
-	#end
+    #if js
+    private function assignSocket( socket : WebSocket)  :  Void
+    #else
+    private function assignSocket( socket : Socket)  :  Void
+    #end
     {
-		this.socket = socket;
-		
-		#if (flash || js)
-		output = socket;
-      	input = socket;
-		#else
-      	output = socket.output;
-      	input = socket.input;
-		#end
+        this.socket = socket;
+
+        #if (flash || js)
+        output = socket;
+          input = socket;
+        #else
+          output = socket.output;
+          input = socket.input;
+        #end
     }
 
 }
diff --git a/lib/haxe/src/org/apache/thrift/transport/TStream.hx b/lib/haxe/src/org/apache/thrift/transport/TStream.hx
index 0e1b52d..50b3ed3 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TStream.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TStream.hx
@@ -24,9 +24,9 @@
 
 
 interface TStream {
-	function Close() : Void;
-	function Peek() : Bool;
-	function Read( buf : Bytes, offset : Int, count : Int) : Int;
-	function Write( buf : Bytes, offset : Int, count : Int) : Void;
-	function Flush() : Void;
+    function Close() : Void;
+    function Peek() : Bool;
+    function Read( buf : Bytes, offset : Int, count : Int) : Int;
+    function Write( buf : Bytes, offset : Int, count : Int) : Void;
+    function Flush() : Void;
 }
diff --git a/lib/haxe/src/org/apache/thrift/transport/TStreamTransport.hx b/lib/haxe/src/org/apache/thrift/transport/TStreamTransport.hx
index 99203b4..31a7c14 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TStreamTransport.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TStreamTransport.hx
@@ -29,75 +29,75 @@
 
 
 class TStreamTransport extends TTransport {
-	
-	public var InputStream(default,null) : TStream;
-	public var OutputStream(default,null) : TStream;
+
+    public var InputStream(default,null) : TStream;
+    public var OutputStream(default,null) : TStream;
 
 
-	public function new( input : TStream, output : TStream) {
-		this.InputStream = input;
-		this.OutputStream = output;
-	}
-	
-	public override function isOpen() : Bool {
-		return true;
-	}
-	
+    public function new( input : TStream, output : TStream) {
+        this.InputStream = input;
+        this.OutputStream = output;
+    }
+
+    public override function isOpen() : Bool {
+        return true;
+    }
+
     public override function peek() : Bool {
-		return (InputStream != null);
-	}
+        return (InputStream != null);
+    }
 
     public override function open() : Void {
-	}
+    }
 
-	public override function close() : Void {
-		if (InputStream != null)
-		{
-			InputStream.Close();
-			InputStream = null;
-		}
-		if (OutputStream != null)
-		{
-			OutputStream.Close();
-			OutputStream = null;
-		}
-	}
+    public override function close() : Void {
+        if (InputStream != null)
+        {
+            InputStream.Close();
+            InputStream = null;
+        }
+        if (OutputStream != null)
+        {
+            OutputStream.Close();
+            OutputStream = null;
+        }
+    }
 
-	public override function read( buf : BytesBuffer, off : Int, len : Int) : Int {
-		if (InputStream == null)
-		{
-			throw new TTransportException( TTransportException.NOT_OPEN, 
-								  		   "Cannot read from null InputStream");
-		}
+    public override function read( buf : BytesBuffer, off : Int, len : Int) : Int {
+        if (InputStream == null)
+        {
+            throw new TTransportException( TTransportException.NOT_OPEN,
+                                             "Cannot read from null InputStream");
+        }
 
-		var data : Bytes =  Bytes.alloc(len);
-		var size = InputStream.Read( data, off, len);
-		buf.addBytes( data, 0, size);
-		return size;
-	}
+        var data : Bytes =  Bytes.alloc(len);
+        var size = InputStream.Read( data, off, len);
+        buf.addBytes( data, 0, size);
+        return size;
+    }
 
     public override function write(buf:Bytes, off : Int, len : Int) : Void {
-		if (OutputStream == null)
-		{
-			throw new TTransportException( TTransportException.NOT_OPEN, 
-										   "Cannot write to null OutputStream");
-		}
+        if (OutputStream == null)
+        {
+            throw new TTransportException( TTransportException.NOT_OPEN,
+                                           "Cannot write to null OutputStream");
+        }
 
-		OutputStream.Write(buf, off, len);
-	}
+        OutputStream.Write(buf, off, len);
+    }
 
     public override function flush(callback:Dynamic->Void =null) : Void {
-		if (OutputStream == null)
-		{
-			var err = new TTransportException( TTransportException.NOT_OPEN,
-											   "Cannot flush null OutputStream");
-	    	if(callback != null)
-				callback(err);
-			else
-				throw err;
-		}
+        if (OutputStream == null)
+        {
+            var err = new TTransportException( TTransportException.NOT_OPEN,
+                                               "Cannot flush null OutputStream");
+            if(callback != null)
+                callback(err);
+            else
+                throw err;
+        }
 
-		OutputStream.Flush();
-	}
+        OutputStream.Flush();
+    }
 
 }
diff --git a/lib/haxe/src/org/apache/thrift/transport/TTransport.hx b/lib/haxe/src/org/apache/thrift/transport/TTransport.hx
index 35303d5..4a3bd90 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TTransport.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TTransport.hx
@@ -22,7 +22,7 @@
 import haxe.io.Bytes;
 import haxe.io.BytesBuffer;
 import org.apache.thrift.AbstractMethodError;
-  
+
 class TTransport {
 
     /**
@@ -31,16 +31,16 @@
      * @return True if the transport is open.
      */
     public function isOpen() : Bool {
-      	throw new AbstractMethodError();
+          throw new AbstractMethodError();
     }
-    
+
     /**
      * Is there more data to be read?
      *
      * @return True if the remote side is still alive and feeding us
      */
     public function peek() : Bool {
-      	return isOpen();
+          return isOpen();
     }
 
     /**
@@ -49,14 +49,14 @@
      * @throws TTransportException if the transport could not be opened
      */
     public function open() : Void {
-      	throw new AbstractMethodError();
+          throw new AbstractMethodError();
     }
 
     /**
      * Closes the transport.
      */
     public function close() : Void {
-      	throw new AbstractMethodError();
+          throw new AbstractMethodError();
     };
 
     /**
@@ -69,7 +69,7 @@
      * @throws TTransportException if there was an error reading data
      */
      public function read( buf : BytesBuffer, off : Int, len : Int) : Int {
-      	throw new AbstractMethodError();
+          throw new AbstractMethodError();
      }
 
     /**
@@ -82,14 +82,14 @@
      * @throws TTransportException if there was an error reading data
      */
     public function readAll(buf : BytesBuffer, off : Int, len : Int) : Int {
-		var got : Int = 0;
-		var ret : Int = 0;
+        var got : Int = 0;
+        var ret : Int = 0;
         while (got < len) {
             ret = read(buf, off+got, len-got);
             if (ret <= 0) {
-              throw new TTransportException(TTransportException.UNKNOWN, 
-										"Cannot read. Remote side has closed. Tried to read " 
-										+ len + " bytes, but only got " + got + " bytes.");
+              throw new TTransportException(TTransportException.UNKNOWN,
+                                        "Cannot read. Remote side has closed. Tried to read "
+                                        + len + " bytes, but only got " + got + " bytes.");
             }
             got += ret;
         }
@@ -103,7 +103,7 @@
      * @throws TTransportException if an error occurs writing data
      */
     public function writeAll(buf:Bytes) : Void {
-		write(buf, 0, buf.length);
+        write(buf, 0, buf.length);
     }
 
     /**
@@ -115,7 +115,7 @@
      * @throws TTransportException if there was an error writing data
      */
     public function write(buf:Bytes, off : Int, len : Int) : Void {
-    	throw new AbstractMethodError();
+        throw new AbstractMethodError();
     }
 
     /**
@@ -124,10 +124,10 @@
      * @throws TTransportException if there was an error writing out data.
      */
     public function flush(callback:Dynamic->Void =null) : Void {
-    	if(callback != null)
-			callback(new AbstractMethodError());
-		else
-			throw new AbstractMethodError();
+        if(callback != null)
+            callback(new AbstractMethodError());
+        else
+            throw new AbstractMethodError();
     }
- 
+
 }
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/transport/TTransportException.hx b/lib/haxe/src/org/apache/thrift/transport/TTransportException.hx
index 3db6456..f930c52 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TTransportException.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TTransportException.hx
@@ -16,21 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.transport;
-  
+
 import org.apache.thrift.TException;
 
 class TTransportException extends TException {
-    
+
     public static inline var UNKNOWN : Int = 0;
     public static inline var NOT_OPEN : Int = 1;
     public static inline var ALREADY_OPEN : Int = 2;
     public static inline var TIMED_OUT : Int = 3;
     public static inline var END_OF_FILE : Int = 4;
-  
+
     public function new(error : Int = UNKNOWN, message : String = "") {
-		super(message, error);
+        super(message, error);
     }
-    
+
 }
+ 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/transport/TTransportFactory.hx b/lib/haxe/src/org/apache/thrift/transport/TTransportFactory.hx
index f20321f..361f35f 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TTransportFactory.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TTransportFactory.hx
@@ -28,17 +28,17 @@
  */
 class TTransportFactory {
 
-	public function new() {
-	}
+    public function new() {
+    }
 
-	/**
-	* Return a wrapped instance of the base Transport.
-	*
-	* @param trans The base transport
-	* @return Wrapped Transport
-	*/
-	public function getTransport( trans : TTransport) : TTransport {
-		return trans;
-	}
+    /**
+    * Return a wrapped instance of the base Transport.
+    *
+    * @param trans The base transport
+    * @return Wrapped Transport
+    */
+    public function getTransport( trans : TTransport) : TTransport {
+        return trans;
+    }
 
 }
diff --git a/lib/haxe/test/src/Main.hx b/lib/haxe/test/src/Main.hx
index fff8be5..da0a7f5 100644
--- a/lib/haxe/test/src/Main.hx
+++ b/lib/haxe/test/src/Main.hx
@@ -31,15 +31,15 @@
 {
     static public function main()
     {
-		try
-		{
-        	StreamTest.Run();
-			
-			trace("All tests completed.");
-		}
-		catch( e: Dynamic)
-		{
-			trace('$e');
-		}
-	}
+        try
+        {
+            StreamTest.Run();
+
+            trace("All tests completed.");
+        }
+        catch( e: Dynamic)
+        {
+            trace('$e');
+        }
+    }
 }
\ No newline at end of file
diff --git a/lib/haxe/test/src/StreamTest.hx b/lib/haxe/test/src/StreamTest.hx
index b28c8e9..7500eee 100644
--- a/lib/haxe/test/src/StreamTest.hx
+++ b/lib/haxe/test/src/StreamTest.hx
@@ -31,62 +31,62 @@
 
 
 class StreamTest extends TestBase {
-	
 
-	private inline static var tmpfile : String = "bin/data.tmp";
-	
 
-	private static function Expect( expr : Bool, info : String, ?pos : haxe.PosInfos) : Void {
-		if( ! expr) {
-			throw ('Test "$info" failed at '+pos.methodName+' in '+pos.fileName+':'+pos.lineNumber);
-		}			
-	}
-	
-	private static function MakeTestData() : Xtruct {
-		var data : Xtruct = new Xtruct();
-		data.string_thing = "Streamtest";
-		data.byte_thing = -128;
-		data.i32_thing = 4711;
-		data.i64_thing = Int64.make(0x12345678,0x9ABCDEF0);
-		return data;
-	}
-	
-	public static function WriteData() : Xtruct
-	{
-		var stream : TStream = new TFileStream( tmpfile, CreateNew);
-		var trans : TTransport = new TStreamTransport( null, stream);
-		var prot = new TJSONProtocol( trans);
+    private inline static var tmpfile : String = "bin/data.tmp";
 
-		var data = MakeTestData();	
-		data.write(prot);
-		trans.close();
-		
-		return data;
-	}
-	
-	public static function ReadData() : Xtruct
-	{
-		var stream : TStream = new TFileStream( tmpfile, Read);
-		var trans : TTransport = new TStreamTransport( stream, null);
-		var prot = new TJSONProtocol( trans);
 
-		var data : Xtruct = new Xtruct();
-		data.read(prot);
-		trans.close();
-		
-		return data;
-	}
-	
-	public static override function Run() : Void
-	{
-		var written = WriteData();
-		var read = ReadData();
+    private static function Expect( expr : Bool, info : String, ?pos : haxe.PosInfos) : Void {
+        if( ! expr) {
+            throw ('Test "$info" failed at '+pos.methodName+' in '+pos.fileName+':'+pos.lineNumber);
+        }
+    }
 
-		Expect( read.string_thing == written.string_thing, "string data");
-		Expect( read.byte_thing == written.byte_thing, "byte data");
-		Expect( read.i32_thing == written.i32_thing, "i32 data");
-		Expect( Int64.compare( read.i64_thing, written.i64_thing) == 0, "i64 data");
-	}
+    private static function MakeTestData() : Xtruct {
+        var data : Xtruct = new Xtruct();
+        data.string_thing = "Streamtest";
+        data.byte_thing = -128;
+        data.i32_thing = 4711;
+        data.i64_thing = Int64.make(0x12345678,0x9ABCDEF0);
+        return data;
+    }
+
+    public static function WriteData() : Xtruct
+    {
+        var stream : TStream = new TFileStream( tmpfile, CreateNew);
+        var trans : TTransport = new TStreamTransport( null, stream);
+        var prot = new TJSONProtocol( trans);
+
+        var data = MakeTestData();
+        data.write(prot);
+        trans.close();
+
+        return data;
+    }
+
+    public static function ReadData() : Xtruct
+    {
+        var stream : TStream = new TFileStream( tmpfile, Read);
+        var trans : TTransport = new TStreamTransport( stream, null);
+        var prot = new TJSONProtocol( trans);
+
+        var data : Xtruct = new Xtruct();
+        data.read(prot);
+        trans.close();
+
+        return data;
+    }
+
+    public static override function Run() : Void
+    {
+        var written = WriteData();
+        var read = ReadData();
+
+        Expect( read.string_thing == written.string_thing, "string data");
+        Expect( read.byte_thing == written.byte_thing, "byte data");
+        Expect( read.i32_thing == written.i32_thing, "i32 data");
+        Expect( Int64.compare( read.i64_thing, written.i64_thing) == 0, "i64 data");
+    }
 
 }
 
diff --git a/lib/haxe/test/src/TestBase.hx b/lib/haxe/test/src/TestBase.hx
index 03b66dd..2a344d6 100644
--- a/lib/haxe/test/src/TestBase.hx
+++ b/lib/haxe/test/src/TestBase.hx
@@ -28,12 +28,13 @@
 import thrift.test.*;  // generated code
 
 class TestBase {
-	
-	private function new() {
-		// override, if necessary
-	}
-	
-	public static function Run() : Void {
-      	throw new AbstractMethodError();
-	}	
+
+    private function new() {
+        // override, if necessary
+    }
+
+    public static function Run() : Void {
+          throw new AbstractMethodError();
+    }
 }
+ 
\ No newline at end of file
diff --git a/test/haxe/src/Arguments.hx b/test/haxe/src/Arguments.hx
index ae23fa1..132f208 100644
--- a/test/haxe/src/Arguments.hx
+++ b/test/haxe/src/Arguments.hx
@@ -30,299 +30,299 @@
 
 
 enum ProtocolType {
-	binary;
-	json;
+    binary;
+    json;
 }
 
 enum EndpointTransport {
-	socket;
-	http;	
+    socket;
+    http;
 }
 
 enum ServerType {
-	simple;
-	/*
-	threadpool;	
-	threaded;
-	nonblocking;
-	*/
+    simple;
+    /*
+    threadpool;
+    threaded;
+    nonblocking;
+    */
 }
 
 
 class Arguments
 {
-	public var printHelpOnly(default,null) : Bool = false;
+    public var printHelpOnly(default,null) : Bool = false;
 
-	public var server(default,null) : Bool = false;
-	public var servertype(default,null) : ServerType = simple;
+    public var server(default,null) : Bool = false;
+    public var servertype(default,null) : ServerType = simple;
 
-	public var host(default,null) : String = "localhost";
-	public var port(default,null) : Int = 9090;
-	
-	public var protocol(default,null) : ProtocolType = binary;
-	public var transport(default,null) : EndpointTransport = socket;
-	public var framed(default,null) : Bool = false;
-	public var buffered(default,null) : Bool = false;
+    public var host(default,null) : String = "localhost";
+    public var port(default,null) : Int = 9090;
 
-	public var numIterations(default,null) : Int = 1;
-	public var numThreads(default,null) : Int = 1;
-	public var skipSpeedTest(default,null) : Bool = false;
-	
-	
-	public function new() {
-		#if sys
-		try {
-  			ParseArgs();
-		} catch (e : String) {
-			trace(GetHelp());
-			throw e;
-		}
-		#else
-		trace("WN: Platform does not support program arguments, using defaults.");
-		#end
-	}
-	
-	#if sys
-		
-	private static function GetHelp() : String {
-		var sProg = Path.withoutDirectory( Sys.executablePath());
-		return "\n"
-			+sProg+"  [client|server]  [options]\n"
-			+"\n"
-			+"Modus: Either client or server, the default is client.\n"
-			+"\n"
-			+"Common options:\n"
-			+"  -h [ --help ]               produce help message\n"
-			+"  --port arg (=9090)          Port number to listen / connect to\n"
-			/* not supported yet
-			+"  --domain-socket arg         Unix Domain Socket (e.g. /tmp/ThriftTest.thrift)\n"
+    public var protocol(default,null) : ProtocolType = binary;
+    public var transport(default,null) : EndpointTransport = socket;
+    public var framed(default,null) : Bool = false;
+    public var buffered(default,null) : Bool = false;
+
+    public var numIterations(default,null) : Int = 1;
+    public var numThreads(default,null) : Int = 1;
+    public var skipSpeedTest(default,null) : Bool = false;
+
+
+    public function new() {
+        #if sys
+        try {
+              ParseArgs();
+        } catch (e : String) {
+            trace(GetHelp());
+            throw e;
+        }
+        #else
+        trace("WN: Platform does not support program arguments, using defaults.");
+        #end
+    }
+
+    #if sys
+
+    private static function GetHelp() : String {
+        var sProg = Path.withoutDirectory( Sys.executablePath());
+        return "\n"
+            +sProg+"  [client|server]  [options]\n"
+            +"\n"
+            +"Modus: Either client or server, the default is client.\n"
+            +"\n"
+            +"Common options:\n"
+            +"  -h [ --help ]               produce help message\n"
+            +"  --port arg (=9090)          Port number to listen / connect to\n"
+            /* not supported yet
+            +"  --domain-socket arg         Unix Domain Socket (e.g. /tmp/ThriftTest.thrift)\n"
             +"  --named-pipe arg            Windows Named Pipe (e.g. MyThriftPipe)\n"
-			*/
-			+"  --protocol arg (=binary)    protocol: binary, compact, json\n"
-			/* not supported yet
-			+"  --ssl                       Encrypted Transport using SSL\n"
-			*/
-			+"\n"
-			+"Server only options:\n"
+            */
+            +"  --protocol arg (=binary)    protocol: binary, compact, json\n"
+            /* not supported yet
+            +"  --ssl                       Encrypted Transport using SSL\n"
+            */
+            +"\n"
+            +"Server only options:\n"
             +"  --transport arg (=sockets)  Transport: buffered, framed, http, anonpipe\n"
-			/* not supported yet
-			+"  --processor-events          processor-events\n"
-			+"  --server-type arg (=simple) type of server, \"simple\", \"thread-pool\", \n"
-			+"                              \"threaded\", or \"nonblocking\"\n"
-			+"  -n [ --workers ] arg (=4)   Number of thread pools workers. Only valid for \n"
-			+"                              thread-pool server type\n"
-			*/
-			+"\n"
-			+"Client only options:\n"
+            /* not supported yet
+            +"  --processor-events          processor-events\n"
+            +"  --server-type arg (=simple) type of server, \"simple\", \"thread-pool\", \n"
+            +"                              \"threaded\", or \"nonblocking\"\n"
+            +"  -n [ --workers ] arg (=4)   Number of thread pools workers. Only valid for \n"
+            +"                              thread-pool server type\n"
+            */
+            +"\n"
+            +"Client only options:\n"
             +"  --host arg (=localhost)     Host to connect\n"
             +"  --transport arg (=sockets)  Transport: buffered, framed, http, evhttp\n"
-			/* not supported yet
+            /* not supported yet
             +"  --anon-pipes hRead hWrite   Windows Anonymous Pipes pair (handles)\n"
-			*/
+            */
             +"  -n [ --testloops ] arg (=1) Number of Tests\n"
             +"  -t [ --threads ] arg (=1)   Number of Test threads\n"
             +"  --skip-speed-test           Skip the speed test\n"
-			+"\n"
-			+"All arguments are optional.\n"
-			;
-	}
-	
+            +"\n"
+            +"All arguments are optional.\n"
+            ;
+    }
 
-	private function ParseArgs() : Void {
-		
-		var args = Sys.args().copy();
-		if( (args == null) || (args.length <= 0)) {
-			server = false;
-			numThreads = 1;
-			return;
-		}
-		
-		var arg = args.shift();
-		if ( arg == "client") {
-			server = false;
-			numThreads = 1;
-		} 
-		else if ( arg == "server") {
-			server = true;
-			numThreads = 4;
-		} 
-		else if ( (arg == "-h") || (arg == "--help")) {
-			// -h [ --help ]               produce help message
-			Sys.println( GetHelp());
-			printHelpOnly = true;
-			return;
-		} 
-		else {
-			throw "First argument must be 'server' or 'client'";
-		}
 
-			
-		while( args.length > 0) {
-			arg = args.shift();
-			
-			if ( (arg == "-h") || (arg == "--help")) {
-				// -h [ --help ]               produce help message
-			    Sys.println( GetHelp());
-				printHelpOnly = true;
-				return;
-			} 
-			else if (arg == "--port") {		
-				// --port arg (=9090)          Port number to listen
-				arg = args.shift();
-				var tmp = Std.parseInt(arg);
-				if( tmp != null) {
-					port = tmp;
-				} else {
-					throw "Invalid port number "+arg;
-				}  
-			} 
-			else if (arg == "--domain-socket") {		
-				//   --domain-socket arg         Unix Domain Socket (e.g. /tmp/ThriftTest.thrift)
-				throw "domain sockets not supported yet";
-			} 
-			else if (arg == "--named-pipe") {		
-				//   --named-pipe arg            Windows Named Pipe (e.g. MyThriftPipe)
-				throw "named pipes not supported yet";
-			} 
-			else if (arg == "--protocol") {		
-				// --protocol arg (=binary)    protocol: binary, compact, json
-				arg = args.shift();
-				if( arg == "binary") {
-					protocol = binary;
-				} else if( arg == "compact") {
-					throw "Compact protocol not supported yet";
-				} else if( arg == "json") {
-					protocol = json;
-				} else {
-					InvalidArg(arg);
-				}
-			}  
-			else if (arg == "--ssl") {		
-				// --ssl                       Encrypted Transport using SSL
-				throw "SSL not supported yet";
-			} 
-			else {
+    private function ParseArgs() : Void {
+
+        var args = Sys.args().copy();
+        if( (args == null) || (args.length <= 0)) {
+            server = false;
+            numThreads = 1;
+            return;
+        }
+
+        var arg = args.shift();
+        if ( arg == "client") {
+            server = false;
+            numThreads = 1;
+        }
+        else if ( arg == "server") {
+            server = true;
+            numThreads = 4;
+        }
+        else if ( (arg == "-h") || (arg == "--help")) {
+            // -h [ --help ]               produce help message
+            Sys.println( GetHelp());
+            printHelpOnly = true;
+            return;
+        }
+        else {
+            throw "First argument must be 'server' or 'client'";
+        }
+
+
+        while( args.length > 0) {
+            arg = args.shift();
+
+            if ( (arg == "-h") || (arg == "--help")) {
+                // -h [ --help ]               produce help message
+                Sys.println( GetHelp());
+                printHelpOnly = true;
+                return;
+            }
+            else if (arg == "--port") {
+                // --port arg (=9090)          Port number to listen
+                arg = args.shift();
+                var tmp = Std.parseInt(arg);
+                if( tmp != null) {
+                    port = tmp;
+                } else {
+                    throw "Invalid port number "+arg;
+                }
+            }
+            else if (arg == "--domain-socket") {
+                //   --domain-socket arg         Unix Domain Socket (e.g. /tmp/ThriftTest.thrift)
+                throw "domain sockets not supported yet";
+            }
+            else if (arg == "--named-pipe") {
+                //   --named-pipe arg            Windows Named Pipe (e.g. MyThriftPipe)
+                throw "named pipes not supported yet";
+            }
+            else if (arg == "--protocol") {
+                // --protocol arg (=binary)    protocol: binary, compact, json
+                arg = args.shift();
+                if( arg == "binary") {
+                    protocol = binary;
+                } else if( arg == "compact") {
+                    throw "Compact protocol not supported yet";
+                } else if( arg == "json") {
+                    protocol = json;
+                } else {
+                    InvalidArg(arg);
+                }
+            }
+            else if (arg == "--ssl") {
+                // --ssl                       Encrypted Transport using SSL
+                throw "SSL not supported yet";
+            }
+            else {
                 //Server only options:
-				if( server) {
-					ParseServerArgument( arg, args);
-				} else {
-					ParseClientArgument( arg, args);
-				}
-			}
-		}
-	}
-	
+                if( server) {
+                    ParseServerArgument( arg, args);
+                } else {
+                    ParseClientArgument( arg, args);
+                }
+            }
+        }
+    }
 
-	private function ParseServerArgument( arg : String, args : Array<String>) : Void {
-		if (arg == "--transport") {
-			//  --transport arg (=sockets)  Transport: buffered, framed, http, anonpipe
-			arg = args.shift();
-			if( arg == "buffered") {
-				buffered = true;
-			} else if( arg == "framed") {
-				framed = true;
-			} else if( arg == "http") {
-				transport = http;
-			} else if( arg == "anonpipe") {
-				throw "Anon pipes transport not supported yet";
-			} else {
-				InvalidArg(arg);
-			}  
-		}
-		else if (arg == "--processor-events") {
-			throw "Processor events not supported yet";
-		}
-		else if (arg == "--server-type") {
-			//  --server-type arg (=simple) type of server, 
-			// one of "simple", "thread-pool", "threaded", "nonblocking"
-			arg = args.shift();
-			if( arg == "simple") {
-				servertype = simple;
-			} else if( arg == "thread-pool") {
-				throw arg+" server not supported yet";
-			} else if( arg == "threaded") {
-				throw arg+" server not supported yet";
-			} else if( arg == "nonblocking") {
-				throw arg+" server not supported yet";
-			} else {
-				InvalidArg(arg);
-			}  
-		}
-		else if ((arg == "-n") || (arg == "--workers")) {
-			//  -n [ --workers ] arg (=4)   Number of thread pools workers. Only valid for 
-			//                              thread-pool server type
-			arg = args.shift();
-			var tmp = Std.parseInt(arg);
-			if( tmp != null) {
-				numThreads = tmp;
-			} else{
-				throw "Invalid number "+arg;
-			} 
-		}
-		else {
-			InvalidArg(arg);
-		}
-	}
-	
 
-	private function ParseClientArgument( arg : String, args : Array<String>) : Void {
-		if (arg == "--host") {
+    private function ParseServerArgument( arg : String, args : Array<String>) : Void {
+        if (arg == "--transport") {
+            //  --transport arg (=sockets)  Transport: buffered, framed, http, anonpipe
+            arg = args.shift();
+            if( arg == "buffered") {
+                buffered = true;
+            } else if( arg == "framed") {
+                framed = true;
+            } else if( arg == "http") {
+                transport = http;
+            } else if( arg == "anonpipe") {
+                throw "Anon pipes transport not supported yet";
+            } else {
+                InvalidArg(arg);
+            }
+        }
+        else if (arg == "--processor-events") {
+            throw "Processor events not supported yet";
+        }
+        else if (arg == "--server-type") {
+            //  --server-type arg (=simple) type of server,
+            // one of "simple", "thread-pool", "threaded", "nonblocking"
+            arg = args.shift();
+            if( arg == "simple") {
+                servertype = simple;
+            } else if( arg == "thread-pool") {
+                throw arg+" server not supported yet";
+            } else if( arg == "threaded") {
+                throw arg+" server not supported yet";
+            } else if( arg == "nonblocking") {
+                throw arg+" server not supported yet";
+            } else {
+                InvalidArg(arg);
+            }
+        }
+        else if ((arg == "-n") || (arg == "--workers")) {
+            //  -n [ --workers ] arg (=4)   Number of thread pools workers. Only valid for
+            //                              thread-pool server type
+            arg = args.shift();
+            var tmp = Std.parseInt(arg);
+            if( tmp != null) {
+                numThreads = tmp;
+            } else{
+                throw "Invalid number "+arg;
+            }
+        }
+        else {
+            InvalidArg(arg);
+        }
+    }
+
+
+    private function ParseClientArgument( arg : String, args : Array<String>) : Void {
+        if (arg == "--host") {
             //  --host arg (=localhost)     Host to connect
-			host = args.shift();
-		}
-		else if (arg == "--transport") {
+            host = args.shift();
+        }
+        else if (arg == "--transport") {
             //  --transport arg (=sockets)  Transport: buffered, framed, http, evhttp
-			arg = args.shift();
-			if( arg == "buffered") {
-				buffered = true;
-			} else if( arg == "framed") {
-				framed = true;
-			} else if( arg == "http") {
-				transport = http;
-			} else if( arg == "evhttp") {
-				throw "evhttp transport not supported yet";
-			} else {
-				InvalidArg(arg);
-			}  
-		}
-		else if (arg == "--anon-pipes") {
-			//  --anon-pipes hRead hWrite   Windows Anonymous Pipes pair (handles)
-			throw "Anon pipes transport not supported yet";
-		}
-		else if ((arg == "-n") || (arg == "--testloops")) {
-			//  -n [ --testloops ] arg (=1) Number of Tests
-			arg = args.shift();
-			var tmp = Std.parseInt(arg);
-			if( tmp != null) {
-				numIterations = tmp;
-			} else {
-				throw "Invalid number "+arg;
-			}  
-		}
-		else if ((arg == "-t") || (arg == "--threads")) {
-			//  -t [ --threads ] arg (=1)   Number of Test threads
-			arg = args.shift();
-			var tmp = Std.parseInt(arg);
-			if( tmp != null) {
-				numThreads = tmp;
-			} else {
-				throw "Invalid number "+arg;
-			}  
-		}
-		else if (arg == "--skip-speed-test") {
-			//  --skip-speed-test  			Skip the speed test
-			skipSpeedTest = true;
-		}			
-		else {
-			InvalidArg(arg);
-		}
-	}
+            arg = args.shift();
+            if( arg == "buffered") {
+                buffered = true;
+            } else if( arg == "framed") {
+                framed = true;
+            } else if( arg == "http") {
+                transport = http;
+            } else if( arg == "evhttp") {
+                throw "evhttp transport not supported yet";
+            } else {
+                InvalidArg(arg);
+            }
+        }
+        else if (arg == "--anon-pipes") {
+            //  --anon-pipes hRead hWrite   Windows Anonymous Pipes pair (handles)
+            throw "Anon pipes transport not supported yet";
+        }
+        else if ((arg == "-n") || (arg == "--testloops")) {
+            //  -n [ --testloops ] arg (=1) Number of Tests
+            arg = args.shift();
+            var tmp = Std.parseInt(arg);
+            if( tmp != null) {
+                numIterations = tmp;
+            } else {
+                throw "Invalid number "+arg;
+            }
+        }
+        else if ((arg == "-t") || (arg == "--threads")) {
+            //  -t [ --threads ] arg (=1)   Number of Test threads
+            arg = args.shift();
+            var tmp = Std.parseInt(arg);
+            if( tmp != null) {
+                numThreads = tmp;
+            } else {
+                throw "Invalid number "+arg;
+            }
+        }
+        else if (arg == "--skip-speed-test") {
+            //  --skip-speed-test              Skip the speed test
+            skipSpeedTest = true;
+        }
+        else {
+            InvalidArg(arg);
+        }
+    }
 
-	
-	#end
-		
-		
-	private function InvalidArg( arg : String) : Void {
-		throw 'Invalid argument $arg';
-	}
+
+    #end
+
+
+    private function InvalidArg( arg : String) : Void {
+        throw 'Invalid argument $arg';
+    }
 }
diff --git a/test/haxe/src/Main.hx b/test/haxe/src/Main.hx
index 6d80c21..30c04a6 100644
--- a/test/haxe/src/Main.hx
+++ b/test/haxe/src/Main.hx
@@ -17,7 +17,7 @@
  * under the License.
  */
 
- 
+
 package;
 
 import org.apache.thrift.*;
@@ -30,22 +30,22 @@
 
 class Main
 {
-	static function main() {
-		try {
-			var args = new Arguments();
-			
-			if( args.printHelpOnly) 
-				return;
-			
-			if (args.server)
-				TestServer.Execute(args);
-			else 
-				TestClient.Execute(args);
-			
-			trace("Completed.");
-		} catch (e : String) {
-			trace(e);
-		}
-	}
+    static function main() {
+        try {
+            var args = new Arguments();
+
+            if( args.printHelpOnly)
+                return;
+
+            if (args.server)
+                TestServer.Execute(args);
+            else
+                TestClient.Execute(args);
+
+            trace("Completed.");
+        } catch (e : String) {
+            trace(e);
+        }
+    }
 
 }
diff --git a/test/haxe/src/TestClient.hx b/test/haxe/src/TestClient.hx
index 3c98e6a..3f9158e 100644
--- a/test/haxe/src/TestClient.hx
+++ b/test/haxe/src/TestClient.hx
@@ -43,758 +43,758 @@
 
 
 class TestResults {
-	private var successCnt : Int = 0;
-	private var errorCnt : Int = 0;
-	private var failedTests : String = "";
-	private var print_direct : Bool = false;
-	
-	public static var EXITCODE_SUCCESS            = 0x00;  // no errors bits set
-	//
-	public static var EXITCODE_FAILBIT_BASETYPES  = 0x01;
-	public static var EXITCODE_FAILBIT_STRUCTS    = 0x02;
-	public static var EXITCODE_FAILBIT_CONTAINERS = 0x04;
-	public static var EXITCODE_FAILBIT_EXCEPTIONS = 0x08;
-	//
-	public static var EXITCODE_ALL_FAILBITS 	  = 0x0F;
-	//
-	private var testsExecuted : Int = 0;
-	private var testsFailed : Int = 0;
-	private var currentTest : Int = 0;
+    private var successCnt : Int = 0;
+    private var errorCnt : Int = 0;
+    private var failedTests : String = "";
+    private var print_direct : Bool = false;
 
-	
-	public function new(direct : Bool) {
-		print_direct = direct;
-	}
-	
-	public function StartTestGroup( groupBit : Int) : Void {
-		currentTest = groupBit;
-		testsExecuted |= groupBit;
-	}
-	
-	public function Expect( expr : Bool, msg : String) : Void {
-		if ( expr) {
-			++successCnt;
-		} else {
-			++errorCnt;
-			testsFailed |= currentTest;
-			failedTests += "\n  " + msg;
-			if( print_direct) {
-				trace('FAIL: $msg');
-			}
-		}
-	}
+    public static var EXITCODE_SUCCESS            = 0x00;  // no errors bits set
+    //
+    public static var EXITCODE_FAILBIT_BASETYPES  = 0x01;
+    public static var EXITCODE_FAILBIT_STRUCTS    = 0x02;
+    public static var EXITCODE_FAILBIT_CONTAINERS = 0x04;
+    public static var EXITCODE_FAILBIT_EXCEPTIONS = 0x08;
+    //
+    public static var EXITCODE_ALL_FAILBITS       = 0x0F;
+    //
+    private var testsExecuted : Int = 0;
+    private var testsFailed : Int = 0;
+    private var currentTest : Int = 0;
 
-	public function CalculateExitCode() : Int {
-		var notExecuted : Int = EXITCODE_ALL_FAILBITS & (~testsExecuted);
-		return testsFailed | notExecuted;
-	}
 
-	public function PrintSummary() : Void {
-		var total = successCnt + errorCnt;
-		var sp = (100 * successCnt) / total;
-		var ep = (100 * errorCnt) / total;
-		
-		trace('===========================');
-		trace('Tests executed    $total');
-		trace('Tests succeeded   $successCnt ($sp%)');
-		trace('Tests failed      $errorCnt ($ep%)');
-		if ( errorCnt > 0)
-		{
-			trace('===========================');
-  			trace('FAILED TESTS: $failedTests');
-		}
-		trace('===========================');
-	}
+    public function new(direct : Bool) {
+        print_direct = direct;
+    }
+
+    public function StartTestGroup( groupBit : Int) : Void {
+        currentTest = groupBit;
+        testsExecuted |= groupBit;
+    }
+
+    public function Expect( expr : Bool, msg : String) : Void {
+        if ( expr) {
+            ++successCnt;
+        } else {
+            ++errorCnt;
+            testsFailed |= currentTest;
+            failedTests += "\n  " + msg;
+            if( print_direct) {
+                trace('FAIL: $msg');
+            }
+        }
+    }
+
+    public function CalculateExitCode() : Int {
+        var notExecuted : Int = EXITCODE_ALL_FAILBITS & (~testsExecuted);
+        return testsFailed | notExecuted;
+    }
+
+    public function PrintSummary() : Void {
+        var total = successCnt + errorCnt;
+        var sp = (100 * successCnt) / total;
+        var ep = (100 * errorCnt) / total;
+
+        trace('===========================');
+        trace('Tests executed    $total');
+        trace('Tests succeeded   $successCnt ($sp%)');
+        trace('Tests failed      $errorCnt ($ep%)');
+        if ( errorCnt > 0)
+        {
+            trace('===========================');
+              trace('FAILED TESTS: $failedTests');
+        }
+        trace('===========================');
+    }
 }
 
 
 class TestClient {
 
-	public static function Execute(args : Arguments) :  Void
-	{
-		var exitCode = 0xFF;
-		try
-		{
-			var difft = Timer.stamp();
-	
-			if( args.numThreads > 1) {
-				var threads = new List<Thread>();
-				for( test in 0 ... args.numThreads) {
-					threads.add( StartThread( args));
-				} 
-				exitCode = 0;
-				for( thread in threads) {
-					exitCode |= Thread.readMessage(true);
-				}
-			} else {
-				var rslt = new TestResults(true);
-				RunClient(args,rslt);
-				rslt.PrintSummary();
-				exitCode = rslt.CalculateExitCode();
-			}
+    public static function Execute(args : Arguments) :  Void
+    {
+        var exitCode = 0xFF;
+        try
+        {
+            var difft = Timer.stamp();
 
-			difft = Timer.stamp() - difft;
-			trace('total test time: $difft seconds');
-		}
-		catch (e : TException)
-		{
-			trace('$e');
-			exitCode = 0xFF;
-		}
-		catch (e : Dynamic)
-		{
-			trace('$e');
-			exitCode = 0xFF;
-		}
-	
-		#if sys
-		Sys.exit( exitCode);
-		#end
-	}
+            if( args.numThreads > 1) {
+                var threads = new List<Thread>();
+                for( test in 0 ... args.numThreads) {
+                    threads.add( StartThread( args));
+                }
+                exitCode = 0;
+                for( thread in threads) {
+                    exitCode |= Thread.readMessage(true);
+                }
+            } else {
+                var rslt = new TestResults(true);
+                RunClient(args,rslt);
+                rslt.PrintSummary();
+                exitCode = rslt.CalculateExitCode();
+            }
 
-	
-	private static function StartThread(args : Arguments) : Thread {
-		var thread = Thread.create(
-			function() : Void {
-				var rslt = new TestResults(false);
-				var main : Thread = Thread.readMessage(true);
-				try 
-				{
-					RunClient(args,rslt);
-				}
-				catch (e : TException)
-				{
-					rslt.Expect( false, '$e');
-					trace('$e');
-				}
-				catch (e : Dynamic)
-				{
-					rslt.Expect( false, '$e');
-					trace('$e');
-				}					
-				main.sendMessage( rslt.CalculateExitCode());
-			});
-		
-		thread.sendMessage(Thread.current());
-		return thread;
-	}
+            difft = Timer.stamp() - difft;
+            trace('total test time: $difft seconds');
+        }
+        catch (e : TException)
+        {
+            trace('$e');
+            exitCode = 0xFF;
+        }
+        catch (e : Dynamic)
+        {
+            trace('$e');
+            exitCode = 0xFF;
+        }
 
-	
-	public static function RunClient(args : Arguments, rslt : TestResults)
-	{
-		var transport : TTransport = null;
-		switch (args.transport)
-		{
-			case socket:
-				transport = new TSocket(args.host, args.port);
-			case http:
-				transport = new THttpClient(args.host);
-			default:
-				throw "Unhandled transport";
-		}
+        #if sys
+        Sys.exit( exitCode);
+        #end
+    }
 
-		// optional: layered transport
-		if ( args.framed) {
-			trace("- framed transport");
-			transport = new TFramedTransport(transport);
-		} 
-		if ( args.buffered) {
-			trace("- buffered transport");
-			throw "TBufferedTransport not implemented yet";
-			//transport = new TBufferedTransport(transport);
-		}
 
-		// protocol
-		var protocol : TProtocol = null;
-		switch( args.protocol)
-		{
-		case binary:
-			trace("- binary protocol");
-			protocol = new TBinaryProtocol(transport);
-		case json:
-			trace("- json protocol");
-			protocol = new TJSONProtocol(transport);
-		default:
-			throw "Unhandled protocol";
-		}
+    private static function StartThread(args : Arguments) : Thread {
+        var thread = Thread.create(
+            function() : Void {
+                var rslt = new TestResults(false);
+                var main : Thread = Thread.readMessage(true);
+                try
+                {
+                    RunClient(args,rslt);
+                }
+                catch (e : TException)
+                {
+                    rslt.Expect( false, '$e');
+                    trace('$e');
+                }
+                catch (e : Dynamic)
+                {
+                    rslt.Expect( false, '$e');
+                    trace('$e');
+                }
+                main.sendMessage( rslt.CalculateExitCode());
+            });
 
+        thread.sendMessage(Thread.current());
+        return thread;
+    }
 
-		// run the test code
-		HaxeBasicsTest( args, rslt);
-		for( i in 0 ... args.numIterations) {
-			ClientTest( transport, protocol, args, rslt);
-		}
-	}
 
+    public static function RunClient(args : Arguments, rslt : TestResults)
+    {
+        var transport : TTransport = null;
+        switch (args.transport)
+        {
+            case socket:
+                transport = new TSocket(args.host, args.port);
+            case http:
+                transport = new THttpClient(args.host);
+            default:
+                throw "Unhandled transport";
+        }
 
-	public static function HaxeBasicsTest( args : Arguments, rslt : TestResults) : Void
-	{
-		// We need to test a few basic things used in the ClientTest
-		// Anything else beyond this scope should go into /lib/haxe/ instead
-		rslt.StartTestGroup( 0);
-		
-		var map32 = new IntMap<Int32>();
-		var map64 = new Int64Map<Int32>();
+        // optional: layered transport
+        if ( args.framed) {
+            trace("- framed transport");
+            transport = new TFramedTransport(transport);
+        }
+        if ( args.buffered) {
+            trace("- buffered transport");
+            throw "TBufferedTransport not implemented yet";
+            //transport = new TBufferedTransport(transport);
+        }
 
-		rslt.Expect( map32.keys().hasNext() == map64.keys().hasNext(), "Int64Map<Int32> Test #1");
-		rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map<Int32> Test #2");
-		rslt.Expect( map32.remove( 4711) == map64.remove( Int64.make(47,11)), "Int64Map<Int32> Test #3");
-		rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map<Int32> Test #4");
-		
-		map32.set( 42, 815);
-		map64.set( Int64.make(0,42), 815);
-		map32.set( -517, 23);
-		map64.set( Int64.make(-5,17), 23);
-		map32.set( 0, -123);
-		map64.set( Int64.make(0,0), -123);
+        // protocol
+        var protocol : TProtocol = null;
+        switch( args.protocol)
+        {
+        case binary:
+            trace("- binary protocol");
+            protocol = new TBinaryProtocol(transport);
+        case json:
+            trace("- json protocol");
+            protocol = new TJSONProtocol(transport);
+        default:
+            throw "Unhandled protocol";
+        }
 
-		rslt.Expect( map32.keys().hasNext() == map64.keys().hasNext(), "Int64Map<Int32> Test #10");
-		rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map<Int32> Test #11");
-		rslt.Expect( map32.exists( -517) == map64.exists( Int64.make(-5,17)), "Int64Map<Int32> Test #12");
-		rslt.Expect( map32.exists( 42) == map64.exists( Int64.make(0,42)), "Int64Map<Int32> Test #13");
-		rslt.Expect( map32.exists( 0) == map64.exists( Int64.make(0,0)), "Int64Map<Int32> Test #14");
-		rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map<Int32> Test #15");
-		rslt.Expect( map32.get( -517) == map64.get( Int64.make(-5,17)), "Int64Map<Int32> Test #16");
-		rslt.Expect( map32.get( 42) == map64.get( Int64.make(0,42)), "Int64Map<Int32> Test #Int64.make(-5,17)");
-		rslt.Expect( map32.get( 0) == map64.get( Int64.make(0,0)), "Int64Map<Int32> Test #18");
-		rslt.Expect( map32.remove( 4711) == map64.remove( Int64.make(47,11)), "Int64Map<Int32> Test #19");
-		rslt.Expect( map32.remove( -517) == map64.remove( Int64.make(-5,17)), "Int64Map<Int32> Test #20");
-		rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map<Int32> Test #21");
-		rslt.Expect( map32.exists( -517) == map64.exists( Int64.make(-5,17)), "Int64Map<Int32> Test #22");
-		rslt.Expect( map32.exists( 42) == map64.exists( Int64.make(0,42)), "Int64Map<Int32> Test #23");
-		rslt.Expect( map32.exists( 0) == map64.exists( Int64.make(0,0)), "Int64Map<Int32> Test #24");
-		rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map<Int32> Test #25");
-		rslt.Expect( map32.get( -517) == map64.get( Int64.make(-5,17)), "Int64Map<Int32> Test #26");
-		rslt.Expect( map32.get( 42) == map64.get( Int64.make(0,42)), "Int64Map<Int32> Test #27");
-		rslt.Expect( map32.get( 0) == map64.get( Int64.make(0,0)), "Int64Map<Int32> Test #28");
 
-		map32.set( 42, 1);
-		map64.set( Int64.make(0,42), 1);
-		map32.set( -517, -2);
-		map64.set( Int64.make(-5,17), -2);
-		map32.set( 0, 3);
-		map64.set( Int64.make(0,0), 3);
+        // run the test code
+        HaxeBasicsTest( args, rslt);
+        for( i in 0 ... args.numIterations) {
+            ClientTest( transport, protocol, args, rslt);
+        }
+    }
 
-		var c32 = 0;
-		for (key in map32.keys()) {
-			++c32;
-		}
-		var c64 = 0;
-		for (key in map64.keys()) {
-			++c64;
-		}
-		rslt.Expect( c32 == c64, "Int64Map<Int32> Test #30");
 
-		var s32 = map32.toString();
-		var s64 = map64.toString();
-		trace("Int64Map<Int32>.toString(): " + ' ("$s32" == "$s64")');
+    public static function HaxeBasicsTest( args : Arguments, rslt : TestResults) : Void
+    {
+        // We need to test a few basic things used in the ClientTest
+        // Anything else beyond this scope should go into /lib/haxe/ instead
+        rslt.StartTestGroup( 0);
 
-		map32.remove( 42);
-		map64.remove( Int64.make(0,42));
-		map32.remove( -517);
-		map64.remove( Int64.make(-5,17));
-		map32.remove( 0);
-		map64.remove( Int64.make(0,0));
-		
-		rslt.Expect( map32.keys().hasNext() == map64.keys().hasNext(), "Int64Map<Int32> Test #90");
-		rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map<Int32> Test #91");
-		rslt.Expect( map32.exists( -517) == map64.exists( Int64.make(-5,17)), "Int64Map<Int32> Test #92");
-		rslt.Expect( map32.exists( 42) == map64.exists( Int64.make(0,42)), "Int64Map<Int32> Test #93");
-		rslt.Expect( map32.exists( 0) == map64.exists( Int64.make(0,0)), "Int64Map<Int32> Test #94");
-		rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map<Int32> Test #95");
-		rslt.Expect( map32.get( -517) == map64.get( Int64.make(-5,17)), "Int64Map<Int32> Test #96");
-		rslt.Expect( map32.get( 42) == map64.get( Int64.make(0,42)), "Int64Map<Int32> Test #97");
-		rslt.Expect( map32.get( 0) == map64.get( Int64.make(0,0)), "Int64Map<Int32> Test #98");
-	}
+        var map32 = new IntMap<Int32>();
+        var map64 = new Int64Map<Int32>();
 
+        rslt.Expect( map32.keys().hasNext() == map64.keys().hasNext(), "Int64Map<Int32> Test #1");
+        rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map<Int32> Test #2");
+        rslt.Expect( map32.remove( 4711) == map64.remove( Int64.make(47,11)), "Int64Map<Int32> Test #3");
+        rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map<Int32> Test #4");
 
-	public static function ClientTest( transport : TTransport, protocol : TProtocol, 
-									   args : Arguments, rslt : TestResults) : Void
-	{
-		var client = new ThriftTestImpl(protocol,protocol);
-		try
-		{
-			if (!transport.isOpen())
-			{
-				transport.open();
-			}
-		}
-		catch (e : TException)
-		{
-			trace('$e');
-			return;
-		}
-		catch (e : Dynamic)
-		{
-			trace('$e');
-			return;
-		}
+        map32.set( 42, 815);
+        map64.set( Int64.make(0,42), 815);
+        map32.set( -517, 23);
+        map64.set( Int64.make(-5,17), 23);
+        map32.set( 0, -123);
+        map64.set( Int64.make(0,0), -123);
 
-		var start = Date.now();
+        rslt.Expect( map32.keys().hasNext() == map64.keys().hasNext(), "Int64Map<Int32> Test #10");
+        rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map<Int32> Test #11");
+        rslt.Expect( map32.exists( -517) == map64.exists( Int64.make(-5,17)), "Int64Map<Int32> Test #12");
+        rslt.Expect( map32.exists( 42) == map64.exists( Int64.make(0,42)), "Int64Map<Int32> Test #13");
+        rslt.Expect( map32.exists( 0) == map64.exists( Int64.make(0,0)), "Int64Map<Int32> Test #14");
+        rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map<Int32> Test #15");
+        rslt.Expect( map32.get( -517) == map64.get( Int64.make(-5,17)), "Int64Map<Int32> Test #16");
+        rslt.Expect( map32.get( 42) == map64.get( Int64.make(0,42)), "Int64Map<Int32> Test #Int64.make(-5,17)");
+        rslt.Expect( map32.get( 0) == map64.get( Int64.make(0,0)), "Int64Map<Int32> Test #18");
+        rslt.Expect( map32.remove( 4711) == map64.remove( Int64.make(47,11)), "Int64Map<Int32> Test #19");
+        rslt.Expect( map32.remove( -517) == map64.remove( Int64.make(-5,17)), "Int64Map<Int32> Test #20");
+        rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map<Int32> Test #21");
+        rslt.Expect( map32.exists( -517) == map64.exists( Int64.make(-5,17)), "Int64Map<Int32> Test #22");
+        rslt.Expect( map32.exists( 42) == map64.exists( Int64.make(0,42)), "Int64Map<Int32> Test #23");
+        rslt.Expect( map32.exists( 0) == map64.exists( Int64.make(0,0)), "Int64Map<Int32> Test #24");
+        rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map<Int32> Test #25");
+        rslt.Expect( map32.get( -517) == map64.get( Int64.make(-5,17)), "Int64Map<Int32> Test #26");
+        rslt.Expect( map32.get( 42) == map64.get( Int64.make(0,42)), "Int64Map<Int32> Test #27");
+        rslt.Expect( map32.get( 0) == map64.get( Int64.make(0,0)), "Int64Map<Int32> Test #28");
 
-		rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_EXCEPTIONS);
-	
-		// if arg == "Xception" throw Xception with errorCode = 1001 and message = arg
-		trace('testException("Xception")');
-		try {
-			client.testException("Xception");
-			rslt.Expect( false, 'testException("Xception") should throw');
-		}
-		catch (e : Xception)
-		{
-			rslt.Expect( e.message == "Xception", 'testException("Xception")  -  e.message == "Xception"');
-			rslt.Expect( e.errorCode == 1001, 'testException("Xception")  -  e.errorCode == 1001');
-		}
-		catch (e : Dynamic)
-		{
-			rslt.Expect( false, 'testException("Xception")  -  $e');
-		} 
-	
-		// if arg == "TException" throw TException
-		trace('testException("TException")');
-		try {
-			client.testException("TException");
-			rslt.Expect( false, 'testException("TException") should throw');
-		}
-		catch (e : TException)
-		{
-			rslt.Expect( true, 'testException("TException")  -  $e');
-		}
-		catch (e : Dynamic)
-		{
-			rslt.Expect( false, 'testException("TException")  -  $e');
-		} 
-	
-		// else do not throw anything
-		trace('testException("bla")');
-		try {
-			client.testException("bla");
-			rslt.Expect( true, 'testException("bla") should not throw');
-		}
-		catch (e : Dynamic)
-		{
-			rslt.Expect( false, 'testException("bla")  -  $e');
-		} 
-			
-		
+        map32.set( 42, 1);
+        map64.set( Int64.make(0,42), 1);
+        map32.set( -517, -2);
+        map64.set( Int64.make(-5,17), -2);
+        map32.set( 0, 3);
+        map64.set( Int64.make(0,0), 3);
 
-		rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_BASETYPES);
-		
-		trace('testVoid()');
-		client.testVoid();
-		trace(' = void');
-		rslt.Expect(true,"testVoid()");  // bump counter
+        var c32 = 0;
+        for (key in map32.keys()) {
+            ++c32;
+        }
+        var c64 = 0;
+        for (key in map64.keys()) {
+            ++c64;
+        }
+        rslt.Expect( c32 == c64, "Int64Map<Int32> Test #30");
 
-		trace('testString("Test")');
-		var s = client.testString("Test");
-		trace(' = "$s"');
-		rslt.Expect(s == "Test", '$s == "Test"');
+        var s32 = map32.toString();
+        var s64 = map64.toString();
+        trace("Int64Map<Int32>.toString(): " + ' ("$s32" == "$s64")');
 
-		trace('testByte(1)');
-		var i8 = client.testByte(1);
-		trace(' = $i8');
-		rslt.Expect(i8 == 1, '$i8 == 1');
+        map32.remove( 42);
+        map64.remove( Int64.make(0,42));
+        map32.remove( -517);
+        map64.remove( Int64.make(-5,17));
+        map32.remove( 0);
+        map64.remove( Int64.make(0,0));
 
-		trace('testI32(-1)');
-		var i32 = client.testI32(-1);
-		trace(' = $i32');
-		rslt.Expect(i32 == -1, '$i32 == -1');
+        rslt.Expect( map32.keys().hasNext() == map64.keys().hasNext(), "Int64Map<Int32> Test #90");
+        rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map<Int32> Test #91");
+        rslt.Expect( map32.exists( -517) == map64.exists( Int64.make(-5,17)), "Int64Map<Int32> Test #92");
+        rslt.Expect( map32.exists( 42) == map64.exists( Int64.make(0,42)), "Int64Map<Int32> Test #93");
+        rslt.Expect( map32.exists( 0) == map64.exists( Int64.make(0,0)), "Int64Map<Int32> Test #94");
+        rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map<Int32> Test #95");
+        rslt.Expect( map32.get( -517) == map64.get( Int64.make(-5,17)), "Int64Map<Int32> Test #96");
+        rslt.Expect( map32.get( 42) == map64.get( Int64.make(0,42)), "Int64Map<Int32> Test #97");
+        rslt.Expect( map32.get( 0) == map64.get( Int64.make(0,0)), "Int64Map<Int32> Test #98");
+    }
 
-		trace('testI64(-34359738368)');
-		var i64 = client.testI64( Int64.make( 0xFFFFFFF8, 0x00000000)); // -34359738368
-		trace(' = $i64');
-		rslt.Expect( Int64.compare( i64, Int64.make( 0xFFFFFFF8, 0x00000000)) == 0, 
-		             Int64.toStr(i64) +" == "+Int64.toStr(Int64.make( 0xFFFFFFF8, 0x00000000)));
 
-		// edge case: the largest negative Int64 has no positive Int64 equivalent
-		trace('testI64(-9223372036854775808)');
-		i64 = client.testI64( Int64.make( 0x80000000, 0x00000000)); // -9223372036854775808
-		trace(' = $i64');
-		rslt.Expect( Int64.compare( i64, Int64.make( 0x80000000, 0x00000000)) == 0, 
-		             Int64.toStr(i64) +" == "+Int64.toStr(Int64.make( 0x80000000, 0x00000000)));
+    public static function ClientTest( transport : TTransport, protocol : TProtocol,
+                                       args : Arguments, rslt : TestResults) : Void
+    {
+        var client = new ThriftTestImpl(protocol,protocol);
+        try
+        {
+            if (!transport.isOpen())
+            {
+                transport.open();
+            }
+        }
+        catch (e : TException)
+        {
+            trace('$e');
+            return;
+        }
+        catch (e : Dynamic)
+        {
+            trace('$e');
+            return;
+        }
 
-		trace('testDouble(5.325098235)');
-		var dub = client.testDouble(5.325098235);
-		trace(' = $dub');
-		rslt.Expect(dub == 5.325098235, '$dub == 5.325098235');
+        var start = Date.now();
+
+        rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_EXCEPTIONS);
+
+        // if arg == "Xception" throw Xception with errorCode = 1001 and message = arg
+        trace('testException("Xception")');
+        try {
+            client.testException("Xception");
+            rslt.Expect( false, 'testException("Xception") should throw');
+        }
+        catch (e : Xception)
+        {
+            rslt.Expect( e.message == "Xception", 'testException("Xception")  -  e.message == "Xception"');
+            rslt.Expect( e.errorCode == 1001, 'testException("Xception")  -  e.errorCode == 1001');
+        }
+        catch (e : Dynamic)
+        {
+            rslt.Expect( false, 'testException("Xception")  -  $e');
+        }
+
+        // if arg == "TException" throw TException
+        trace('testException("TException")');
+        try {
+            client.testException("TException");
+            rslt.Expect( false, 'testException("TException") should throw');
+        }
+        catch (e : TException)
+        {
+            rslt.Expect( true, 'testException("TException")  -  $e');
+        }
+        catch (e : Dynamic)
+        {
+            rslt.Expect( false, 'testException("TException")  -  $e');
+        }
+
+        // else do not throw anything
+        trace('testException("bla")');
+        try {
+            client.testException("bla");
+            rslt.Expect( true, 'testException("bla") should not throw');
+        }
+        catch (e : Dynamic)
+        {
+            rslt.Expect( false, 'testException("bla")  -  $e');
+        }
+
+
+
+        rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_BASETYPES);
+
+        trace('testVoid()');
+        client.testVoid();
+        trace(' = void');
+        rslt.Expect(true,"testVoid()");  // bump counter
+
+        trace('testString("Test")');
+        var s = client.testString("Test");
+        trace(' = "$s"');
+        rslt.Expect(s == "Test", '$s == "Test"');
+
+        trace('testByte(1)');
+        var i8 = client.testByte(1);
+        trace(' = $i8');
+        rslt.Expect(i8 == 1, '$i8 == 1');
+
+        trace('testI32(-1)');
+        var i32 = client.testI32(-1);
+        trace(' = $i32');
+        rslt.Expect(i32 == -1, '$i32 == -1');
+
+        trace('testI64(-34359738368)');
+        var i64 = client.testI64( Int64.make( 0xFFFFFFF8, 0x00000000)); // -34359738368
+        trace(' = $i64');
+        rslt.Expect( Int64.compare( i64, Int64.make( 0xFFFFFFF8, 0x00000000)) == 0,
+                     Int64.toStr(i64) +" == "+Int64.toStr(Int64.make( 0xFFFFFFF8, 0x00000000)));
+
+        // edge case: the largest negative Int64 has no positive Int64 equivalent
+        trace('testI64(-9223372036854775808)');
+        i64 = client.testI64( Int64.make( 0x80000000, 0x00000000)); // -9223372036854775808
+        trace(' = $i64');
+        rslt.Expect( Int64.compare( i64, Int64.make( 0x80000000, 0x00000000)) == 0,
+                     Int64.toStr(i64) +" == "+Int64.toStr(Int64.make( 0x80000000, 0x00000000)));
+
+        trace('testDouble(5.325098235)');
+        var dub = client.testDouble(5.325098235);
+        trace(' = $dub');
+        rslt.Expect(dub == 5.325098235, '$dub == 5.325098235');
+
+
+        rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_STRUCTS);
+
+        trace('testStruct({"Zero", 1, -3, -5})');
+        var o = new Xtruct();
+        o.string_thing = "Zero";
+        o.byte_thing = 1;
+        o.i32_thing = -3;
+        o.i64_thing = Int64.make(0,-5);
+        var i = client.testStruct(o);
+        trace(' = {"' + i.string_thing + '", ' + i.byte_thing +', '
+                      + i.i32_thing +', '+ Int64.toStr(i.i64_thing) + '}');
+        rslt.Expect( i.string_thing == o.string_thing, "i.string_thing == o.string_thing");
+        rslt.Expect( i.byte_thing == o.byte_thing, "i.byte_thing == o.byte_thing");
+        rslt.Expect( i.i32_thing == o.i32_thing, "i.i64_thing == o.i64_thing");
+        rslt.Expect( i.i32_thing == o.i32_thing, "i.i64_thing == o.i64_thing");
+
+        trace('testNest({1, {\"Zero\", 1, -3, -5}, 5})');
+        var o2 = new Xtruct2();
+        o2.byte_thing = 1;
+        o2.struct_thing = o;
+        o2.i32_thing = 5;
+        var i2 = client.testNest(o2);
+        i = i2.struct_thing;
+        trace(" = {" + i2.byte_thing + ", {\"" + i.string_thing + "\", "
+              + i.byte_thing + ", " + i.i32_thing + ", " + Int64.toStr(i.i64_thing) + "}, "
+              + i2.i32_thing + "}");
+        rslt.Expect( i2.byte_thing == o2.byte_thing, "i2.byte_thing == o2.byte_thing");
+        rslt.Expect( i2.i32_thing == o2.i32_thing, "i2.i32_thing == o2.i32_thing");
+        rslt.Expect( i.string_thing == o.string_thing, "i.string_thing == o.string_thing");
+        rslt.Expect( i.byte_thing == o.byte_thing, "i.byte_thing == o.byte_thing");
+        rslt.Expect( i.i32_thing == o.i32_thing, "i.i32_thing == o.i32_thing");
+        rslt.Expect( Int64.compare( i.i64_thing, o.i64_thing) == 0, "i.i64_thing == o.i64_thing");
+
+
+        rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_CONTAINERS);
+
+        var mapout = new IntMap< haxe.Int32>();
+        for ( j in 0 ... 5)
+        {
+            mapout.set(j, j - 10);
+        }
+        trace("testMap({");
+        var first : Bool = true;
+        for( key in mapout.keys())
+        {
+            if (first)
+            {
+                first = false;
+            }
+            else
+            {
+                trace(", ");
+            }
+            trace(key + " => " + mapout.get(key));
+        }
+        trace("})");
 
-		
-		rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_STRUCTS);
-		
-		trace('testStruct({"Zero", 1, -3, -5})');
-		var o = new Xtruct();
-		o.string_thing = "Zero";
-		o.byte_thing = 1;
-		o.i32_thing = -3;
-		o.i64_thing = Int64.make(0,-5);
-		var i = client.testStruct(o);
-		trace(' = {"' + i.string_thing + '", ' + i.byte_thing +', ' 
-					  + i.i32_thing +', '+ Int64.toStr(i.i64_thing) + '}');
-		rslt.Expect( i.string_thing == o.string_thing, "i.string_thing == o.string_thing");
-		rslt.Expect( i.byte_thing == o.byte_thing, "i.byte_thing == o.byte_thing");
-		rslt.Expect( i.i32_thing == o.i32_thing, "i.i64_thing == o.i64_thing");
-		rslt.Expect( i.i32_thing == o.i32_thing, "i.i64_thing == o.i64_thing");
+        var mapin = client.testMap(mapout);
 
-		trace('testNest({1, {\"Zero\", 1, -3, -5}, 5})');
-		var o2 = new Xtruct2();
-		o2.byte_thing = 1;
-		o2.struct_thing = o;
-		o2.i32_thing = 5;
-		var i2 = client.testNest(o2);
-		i = i2.struct_thing;
-		trace(" = {" + i2.byte_thing + ", {\"" + i.string_thing + "\", " 
-			  + i.byte_thing + ", " + i.i32_thing + ", " + Int64.toStr(i.i64_thing) + "}, " 
-			  + i2.i32_thing + "}");
-		rslt.Expect( i2.byte_thing == o2.byte_thing, "i2.byte_thing == o2.byte_thing");
-		rslt.Expect( i2.i32_thing == o2.i32_thing, "i2.i32_thing == o2.i32_thing");
-		rslt.Expect( i.string_thing == o.string_thing, "i.string_thing == o.string_thing");
-		rslt.Expect( i.byte_thing == o.byte_thing, "i.byte_thing == o.byte_thing");
-		rslt.Expect( i.i32_thing == o.i32_thing, "i.i32_thing == o.i32_thing");
-		rslt.Expect( Int64.compare( i.i64_thing, o.i64_thing) == 0, "i.i64_thing == o.i64_thing");
+        trace(" = {");
+        first = true;
+        for( key in mapin.keys())
+        {
+            if (first)
+            {
+                first = false;
+            }
+            else
+            {
+                trace(", ");
+            }
+            trace(key + " => " + mapin.get(key));
+            rslt.Expect( mapin.get(key) == mapout.get(key), ' mapin.get($key) == mapout.get($key)');
+        }
+        trace("}");
+        for( key in mapout.keys())
+        {
+            rslt.Expect(mapin.exists(key), 'mapin.exists($key)');
+        }
 
-		
-		rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_CONTAINERS);
-		
-		var mapout = new IntMap< haxe.Int32>();
-		for ( j in 0 ... 5)
-		{
-			mapout.set(j, j - 10);
-		}
-		trace("testMap({");
-		var first : Bool = true;
-		for( key in mapout.keys())
-		{
-			if (first)
-			{
-				first = false;
-			}
-			else
-			{
-				trace(", ");
-			}
-			trace(key + " => " + mapout.get(key));
-		}
-		trace("})");
+        var listout = new List<Int>();
+        for (j in -2 ... 3)
+        {
+            listout.add(j);
+        }
+        trace("testList({");
+        first = true;
+        for( j in listout)
+        {
+            if (first)
+            {
+                first = false;
+            }
+            else
+            {
+                trace(", ");
+            }
+            trace(j);
+        }
+        trace("})");
 
-		var mapin = client.testMap(mapout);
+        var listin = client.testList(listout);
 
-		trace(" = {");
-		first = true;
-		for( key in mapin.keys())
-		{
-			if (first)
-			{
-				first = false;
-			}
-			else
-			{
-				trace(", ");
-			}
-			trace(key + " => " + mapin.get(key));
-			rslt.Expect( mapin.get(key) == mapout.get(key), ' mapin.get($key) == mapout.get($key)');
-		}
-		trace("}");
-		for( key in mapout.keys())
-		{
-			rslt.Expect(mapin.exists(key), 'mapin.exists($key)');
-		}
+        trace(" = {");
+        first = true;
+        for( j in listin)
+        {
+            if (first)
+            {
+                first = false;
+            }
+            else
+            {
+                trace(", ");
+            }
+            trace(j);
+        }
+        trace("}");
 
-		var listout = new List<Int>();
-		for (j in -2 ... 3)
-		{
-			listout.add(j);
-		}
-		trace("testList({");
-		first = true;
-		for( j in listout)
-		{
-			if (first)
-			{
-				first = false;
-			}
-			else
-			{
-				trace(", ");
-			}
-			trace(j);
-		}
-		trace("})");
+        rslt.Expect(listin.length == listout.length, "listin.length == listout.length");
+        var literout = listout.iterator();
+        var literin = listin.iterator();
+        while( literin.hasNext()) {
+            rslt.Expect(literin.next() == literout.next(), "literin[i] == literout[i]");
+        }
 
-		var listin = client.testList(listout);
+        //set
+        var setout = new IntSet();
+        for (j in -2 ... 3)
+        {
+            setout.add(j);
+        }
+        trace("testSet({");
+        first = true;
+        for( j in setout)
+        {
+            if (first)
+            {
+                first = false;
+            }
+            else
+            {
+                trace(", ");
+            }
+            trace(j);
+        }
+        trace("})");
 
-		trace(" = {");
-		first = true;
-		for( j in listin)
-		{
-			if (first)
-			{
-				first = false;
-			}
-			else
-			{
-				trace(", ");
-			}
-			trace(j);
-		}
-		trace("}");
+        var setin = client.testSet(setout);
 
-		rslt.Expect(listin.length == listout.length, "listin.length == listout.length");
-		var literout = listout.iterator();
-		var literin = listin.iterator();
-		while( literin.hasNext()) {
-			rslt.Expect(literin.next() == literout.next(), "literin[i] == literout[i]");
-		}
-	
-		//set
-		var setout = new IntSet();
-		for (j in -2 ... 3)
-		{
-			setout.add(j);
-		}
-		trace("testSet({");
-		first = true;
-		for( j in setout)
-		{
-			if (first)
-			{
-				first = false;
-			}
-			else
-			{
-				trace(", ");
-			}
-			trace(j);
-		}
-		trace("})");
+        trace(" = {");
+        first = true;
+        for( j in setin)
+        {
+            if (first)
+            {
+                first = false;
+            }
+            else
+            {
+                trace(", ");
+            }
+            trace(j);
+            rslt.Expect(setout.contains(j), 'setout.contains($j)');
+        }
+        trace("}");
+        rslt.Expect(setin.size == setout.size, "setin.length == setout.length");
 
-		var setin = client.testSet(setout);
 
-		trace(" = {");
-		first = true;
-		for( j in setin)
-		{
-			if (first)
-			{
-				first = false;
-			}
-			else
-			{
-				trace(", ");
-			}
-			trace(j);
-			rslt.Expect(setout.contains(j), 'setout.contains($j)');
-		}
-		trace("}");
-		rslt.Expect(setin.size == setout.size, "setin.length == setout.length");
-	
+        rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_BASETYPES);
 
-		rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_BASETYPES);
+        trace("testEnum(ONE)");
+        var ret = client.testEnum(Numberz.ONE);
+        trace(" = " + ret);
+        rslt.Expect(ret == Numberz.ONE, '$ret == Numberz.ONE');
 
-		trace("testEnum(ONE)");
-		var ret = client.testEnum(Numberz.ONE);
-		trace(" = " + ret);
-		rslt.Expect(ret == Numberz.ONE, '$ret == Numberz.ONE');
+        trace("testEnum(TWO)");
+        ret = client.testEnum(Numberz.TWO);
+        trace(" = " + ret);
+        rslt.Expect(ret == Numberz.TWO, '$ret == Numberz.TWO');
 
-		trace("testEnum(TWO)");
-		ret = client.testEnum(Numberz.TWO);
-		trace(" = " + ret);
-		rslt.Expect(ret == Numberz.TWO, '$ret == Numberz.TWO');
+        trace("testEnum(THREE)");
+        ret = client.testEnum(Numberz.THREE);
+        trace(" = " + ret);
+        rslt.Expect(ret == Numberz.THREE, '$ret == Numberz.THREE');
 
-		trace("testEnum(THREE)");
-		ret = client.testEnum(Numberz.THREE);
-		trace(" = " + ret);
-		rslt.Expect(ret == Numberz.THREE, '$ret == Numberz.THREE');
+        trace("testEnum(FIVE)");
+        ret = client.testEnum(Numberz.FIVE);
+        trace(" = " + ret);
+        rslt.Expect(ret == Numberz.FIVE, '$ret == Numberz.FIVE');
 
-		trace("testEnum(FIVE)");
-		ret = client.testEnum(Numberz.FIVE);
-		trace(" = " + ret);
-		rslt.Expect(ret == Numberz.FIVE, '$ret == Numberz.FIVE');
+        trace("testEnum(EIGHT)");
+        ret = client.testEnum(Numberz.EIGHT);
+        trace(" = " + ret);
+        rslt.Expect(ret == Numberz.EIGHT, '$ret == Numberz.EIGHT');
 
-		trace("testEnum(EIGHT)");
-		ret = client.testEnum(Numberz.EIGHT);
-		trace(" = " + ret);
-		rslt.Expect(ret == Numberz.EIGHT, '$ret == Numberz.EIGHT');
+        trace("testTypedef(309858235082523)");
+        var uid = client.testTypedef( Int64.make( 0x119D0, 0x7E08671B));  // 309858235082523
+        trace(" = " + uid);
+        rslt.Expect( Int64.compare( uid, Int64.make( 0x119D0, 0x7E08671B)) == 0,
+                     Int64.toStr(uid)+" == "+Int64.toStr(Int64.make( 0x119D0, 0x7E08671B)));
 
-		trace("testTypedef(309858235082523)");
-		var uid = client.testTypedef( Int64.make( 0x119D0, 0x7E08671B));  // 309858235082523
-		trace(" = " + uid);
-		rslt.Expect( Int64.compare( uid, Int64.make( 0x119D0, 0x7E08671B)) == 0,
-		             Int64.toStr(uid)+" == "+Int64.toStr(Int64.make( 0x119D0, 0x7E08671B)));
 
+        rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_CONTAINERS);
 
-		rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_CONTAINERS);
+        trace("testMapMap(1)");
+        var mm = client.testMapMap(1);
+        trace(" = {");
+        for( key in mm.keys())
+        {
+            trace(key + " => {");
+            var m2 = mm.get(key);
+            for( k2 in m2.keys())
+            {
+                trace(k2 + " => " + m2.get(k2) + ", ");
+            }
+            trace("}, ");
+        }
+        trace("}");
 
-		trace("testMapMap(1)");
-		var mm = client.testMapMap(1);
-		trace(" = {");
-		for( key in mm.keys())
-		{
-			trace(key + " => {");
-			var m2 = mm.get(key);
-			for( k2 in m2.keys())
-			{
-				trace(k2 + " => " + m2.get(k2) + ", ");
-			}
-			trace("}, ");
-		}
-		trace("}");
+        var pos = mm.get(4);
+        var neg = mm.get(-4);
+        rslt.Expect( (pos != null) && (neg != null), "(pos != null) && (neg != null)");
+        for (i in 0 ... 5) {
+            rslt.Expect( pos.get(i) == i, 'pos.get($i) == $i');
+            rslt.Expect( neg.get(-i) == -i, 'neg.get(-$i) == -$i');
+         }
 
-		var pos = mm.get(4);
-		var neg = mm.get(-4);
-		rslt.Expect( (pos != null) && (neg != null), "(pos != null) && (neg != null)");
-		for (i in 0 ... 5) {
-			rslt.Expect( pos.get(i) == i, 'pos.get($i) == $i');
-			rslt.Expect( neg.get(-i) == -i, 'neg.get(-$i) == -$i');
-	 	}
 
-			
-		rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_STRUCTS);
+        rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_STRUCTS);
 
-		var insane = new Insanity();
-		insane.userMap = new IntMap< Int64>();
-		insane.userMap.set( Numberz.FIVE, Int64.make(0,5000));
-		var truck = new Xtruct();
-		truck.string_thing = "Truck";
-		truck.byte_thing = 8;
-		truck.i32_thing = 8;
-		truck.i64_thing = Int64.make(0,8);
-		insane.xtructs = new List<Xtruct>();
-		insane.xtructs.add(truck);
-		trace("testInsanity()");
-		var whoa = client.testInsanity(insane);
-		trace(" = {");
-		for( key in whoa.keys())
-		{
-			var val = whoa.get(key);
-			trace(key + " => {");
+        var insane = new Insanity();
+        insane.userMap = new IntMap< Int64>();
+        insane.userMap.set( Numberz.FIVE, Int64.make(0,5000));
+        var truck = new Xtruct();
+        truck.string_thing = "Truck";
+        truck.byte_thing = 8;
+        truck.i32_thing = 8;
+        truck.i64_thing = Int64.make(0,8);
+        insane.xtructs = new List<Xtruct>();
+        insane.xtructs.add(truck);
+        trace("testInsanity()");
+        var whoa = client.testInsanity(insane);
+        trace(" = {");
+        for( key in whoa.keys())
+        {
+            var val = whoa.get(key);
+            trace(key + " => {");
 
-			for( k2 in val.keys())
-			{
-				var v2 = val.get(k2);
+            for( k2 in val.keys())
+            {
+                var v2 = val.get(k2);
 
-				trace(k2 + " => {");
-				var userMap = v2.userMap;
+                trace(k2 + " => {");
+                var userMap = v2.userMap;
 
-				trace("{");
-				if (userMap != null)
-				{
-					for( k3 in userMap.keys())
-					{
-						trace(k3 + " => " + userMap.get(k3) + ", ");
-					}
-				}
-				else
-				{
-					trace("null");
-				}
-				trace("}, ");
+                trace("{");
+                if (userMap != null)
+                {
+                    for( k3 in userMap.keys())
+                    {
+                        trace(k3 + " => " + userMap.get(k3) + ", ");
+                    }
+                }
+                else
+                {
+                    trace("null");
+                }
+                trace("}, ");
 
-				var xtructs = v2.xtructs;
+                var xtructs = v2.xtructs;
 
-				trace("{");
-				if (xtructs != null)
-				{
-					for( x in xtructs)
-					{
-						trace("{\"" + x.string_thing + "\", " 
-							  + x.byte_thing + ", " + x.i32_thing + ", " 
-							  + x.i32_thing + "}, ");
-					}
-				}
-				else
-				{
-					trace("null");
-				}
-				trace("}");
+                trace("{");
+                if (xtructs != null)
+                {
+                    for( x in xtructs)
+                    {
+                        trace("{\"" + x.string_thing + "\", "
+                              + x.byte_thing + ", " + x.i32_thing + ", "
+                              + x.i32_thing + "}, ");
+                    }
+                }
+                else
+                {
+                    trace("null");
+                }
+                trace("}");
 
-				trace("}, ");
-			}
-			trace("}, ");
-		}
-		trace("}");
+                trace("}, ");
+            }
+            trace("}, ");
+        }
+        trace("}");
 
 
-		var first_map = whoa.get(Int64.make(0,1));
-		var second_map = whoa.get(Int64.make(0,2));
-		rslt.Expect( (first_map != null) && (second_map != null), "(first_map != null) && (second_map != null)");
-		if ((first_map != null) && (second_map != null))
-		{
-			var crazy2 = first_map.get(Numberz.TWO);
-			var crazy3 = first_map.get(Numberz.THREE);
-			var looney = second_map.get(Numberz.SIX);
-			rslt.Expect( (crazy2 != null) && (crazy3 != null) && (looney != null), 
-						"(crazy2 != null) && (crazy3 != null) && (looney != null)");
+        var first_map = whoa.get(Int64.make(0,1));
+        var second_map = whoa.get(Int64.make(0,2));
+        rslt.Expect( (first_map != null) && (second_map != null), "(first_map != null) && (second_map != null)");
+        if ((first_map != null) && (second_map != null))
+        {
+            var crazy2 = first_map.get(Numberz.TWO);
+            var crazy3 = first_map.get(Numberz.THREE);
+            var looney = second_map.get(Numberz.SIX);
+            rslt.Expect( (crazy2 != null) && (crazy3 != null) && (looney != null),
+                        "(crazy2 != null) && (crazy3 != null) && (looney != null)");
 
-			rslt.Expect( Int64.compare( crazy2.userMap.get(Numberz.EIGHT), Int64.make(0,8)) == 0, 
-						"crazy2.UserMap.get(Numberz.EIGHT) == 8");
-			rslt.Expect( Int64.compare( crazy3.userMap.get(Numberz.EIGHT), Int64.make(0,8)) == 0, 
-						"crazy3.UserMap.get(Numberz.EIGHT) == 8");
-			rslt.Expect( Int64.compare( crazy2.userMap.get(Numberz.FIVE), Int64.make(0,5)) == 0, 
-						"crazy2.UserMap.get(Numberz.FIVE) == 5");
-			rslt.Expect( Int64.compare( crazy3.userMap.get(Numberz.FIVE), Int64.make(0,5)) == 0, 
-						"crazy3.UserMap.get(Numberz.FIVE) == 5");
+            rslt.Expect( Int64.compare( crazy2.userMap.get(Numberz.EIGHT), Int64.make(0,8)) == 0,
+                        "crazy2.UserMap.get(Numberz.EIGHT) == 8");
+            rslt.Expect( Int64.compare( crazy3.userMap.get(Numberz.EIGHT), Int64.make(0,8)) == 0,
+                        "crazy3.UserMap.get(Numberz.EIGHT) == 8");
+            rslt.Expect( Int64.compare( crazy2.userMap.get(Numberz.FIVE), Int64.make(0,5)) == 0,
+                        "crazy2.UserMap.get(Numberz.FIVE) == 5");
+            rslt.Expect( Int64.compare( crazy3.userMap.get(Numberz.FIVE), Int64.make(0,5)) == 0,
+                        "crazy3.UserMap.get(Numberz.FIVE) == 5");
 
-			var crz2iter = crazy2.xtructs.iterator();
-			var crz3iter = crazy3.xtructs.iterator();
-			rslt.Expect( crz2iter.hasNext() && crz3iter.hasNext(), "crz2iter.hasNext() && crz3iter.hasNext()");
-			var goodbye2 = crz2iter.next();
-			var goodbye3 = crz3iter.next();
-			rslt.Expect( crz2iter.hasNext() && crz3iter.hasNext(), "crz2iter.hasNext() && crz3iter.hasNext()");
-			var hello2 = crz2iter.next();
-			var hello3 = crz3iter.next();
-			rslt.Expect( ! (crz2iter.hasNext() || crz3iter.hasNext()), "! (crz2iter.hasNext() || crz3iter.hasNext())");
+            var crz2iter = crazy2.xtructs.iterator();
+            var crz3iter = crazy3.xtructs.iterator();
+            rslt.Expect( crz2iter.hasNext() && crz3iter.hasNext(), "crz2iter.hasNext() && crz3iter.hasNext()");
+            var goodbye2 = crz2iter.next();
+            var goodbye3 = crz3iter.next();
+            rslt.Expect( crz2iter.hasNext() && crz3iter.hasNext(), "crz2iter.hasNext() && crz3iter.hasNext()");
+            var hello2 = crz2iter.next();
+            var hello3 = crz3iter.next();
+            rslt.Expect( ! (crz2iter.hasNext() || crz3iter.hasNext()), "! (crz2iter.hasNext() || crz3iter.hasNext())");
 
-			rslt.Expect( hello2.string_thing == "Hello2", 'hello2.String_thing == "Hello2"');
-			rslt.Expect( hello2.byte_thing == 2, 'hello2.Byte_thing == 2');
-			rslt.Expect( hello2.i32_thing == 2, 'hello2.I32_thing == 2');
-			rslt.Expect( Int64.compare( hello2.i64_thing, Int64.make(0,2)) == 0, 'hello2.I64_thing == 2');
-			rslt.Expect( hello3.string_thing == "Hello2", 'hello3.String_thing == "Hello2"');
-			rslt.Expect( hello3.byte_thing == 2, 'hello3.Byte_thing == 2');
-			rslt.Expect( hello3.i32_thing == 2, 'hello3.I32_thing == 2');
-			rslt.Expect( Int64.compare( hello3.i64_thing, Int64.make(0,2)) == 0, 'hello3.I64_thing == 2');
+            rslt.Expect( hello2.string_thing == "Hello2", 'hello2.String_thing == "Hello2"');
+            rslt.Expect( hello2.byte_thing == 2, 'hello2.Byte_thing == 2');
+            rslt.Expect( hello2.i32_thing == 2, 'hello2.I32_thing == 2');
+            rslt.Expect( Int64.compare( hello2.i64_thing, Int64.make(0,2)) == 0, 'hello2.I64_thing == 2');
+            rslt.Expect( hello3.string_thing == "Hello2", 'hello3.String_thing == "Hello2"');
+            rslt.Expect( hello3.byte_thing == 2, 'hello3.Byte_thing == 2');
+            rslt.Expect( hello3.i32_thing == 2, 'hello3.I32_thing == 2');
+            rslt.Expect( Int64.compare( hello3.i64_thing, Int64.make(0,2)) == 0, 'hello3.I64_thing == 2');
 
-			rslt.Expect( goodbye2.string_thing == "Goodbye4", 'goodbye2.String_thing == "Goodbye4"');
-			rslt.Expect( goodbye2.byte_thing == 4, 'goodbye2.Byte_thing == 4');
-			rslt.Expect( goodbye2.i32_thing == 4, 'goodbye2.I32_thing == 4');
-			rslt.Expect( Int64.compare( goodbye2.i64_thing, Int64.make(0,4)) == 0, 'goodbye2.I64_thing == 4');
-			rslt.Expect( goodbye3.string_thing == "Goodbye4", 'goodbye3.String_thing == "Goodbye4"');
-			rslt.Expect( goodbye3.byte_thing == 4, 'goodbye3.Byte_thing == 4');
-			rslt.Expect( goodbye3.i32_thing == 4, 'goodbye3.I32_thing == 4');
-			rslt.Expect( Int64.compare( goodbye3.i64_thing, Int64.make(0,4)) == 0, 'goodbye3.I64_thing == 4');
-		}
+            rslt.Expect( goodbye2.string_thing == "Goodbye4", 'goodbye2.String_thing == "Goodbye4"');
+            rslt.Expect( goodbye2.byte_thing == 4, 'goodbye2.Byte_thing == 4');
+            rslt.Expect( goodbye2.i32_thing == 4, 'goodbye2.I32_thing == 4');
+            rslt.Expect( Int64.compare( goodbye2.i64_thing, Int64.make(0,4)) == 0, 'goodbye2.I64_thing == 4');
+            rslt.Expect( goodbye3.string_thing == "Goodbye4", 'goodbye3.String_thing == "Goodbye4"');
+            rslt.Expect( goodbye3.byte_thing == 4, 'goodbye3.Byte_thing == 4');
+            rslt.Expect( goodbye3.i32_thing == 4, 'goodbye3.I32_thing == 4');
+            rslt.Expect( Int64.compare( goodbye3.i64_thing, Int64.make(0,4)) == 0, 'goodbye3.I64_thing == 4');
+        }
 
-		var arg0 = 1;
-		var arg1 = 2;
-		var arg2 = Int64.make( 0x7FFFFFFF,0xFFFFFFFF);
-		var multiDict = new IntMap< String>();
-		multiDict.set(1, "one");
-		var arg4 = Numberz.FIVE;
-		var arg5 = Int64.make(0,5000000);
-		trace("Test Multi(" + arg0 + "," + arg1 + "," + arg2 + "," + multiDict + "," + arg4 + "," + arg5 + ")");
-		var multiResponse = client.testMulti(arg0, arg1, arg2, multiDict, arg4, arg5);
-		trace(" = Xtruct(byte_thing:" + multiResponse.byte_thing + ",string_thing:" + multiResponse.string_thing
-					+ ",i32_thing:" + multiResponse.i32_thing 
-			        + ",i64_thing:" + Int64.toStr(multiResponse.i64_thing) + ")");
+        var arg0 = 1;
+        var arg1 = 2;
+        var arg2 = Int64.make( 0x7FFFFFFF,0xFFFFFFFF);
+        var multiDict = new IntMap< String>();
+        multiDict.set(1, "one");
+        var arg4 = Numberz.FIVE;
+        var arg5 = Int64.make(0,5000000);
+        trace("Test Multi(" + arg0 + "," + arg1 + "," + arg2 + "," + multiDict + "," + arg4 + "," + arg5 + ")");
+        var multiResponse = client.testMulti(arg0, arg1, arg2, multiDict, arg4, arg5);
+        trace(" = Xtruct(byte_thing:" + multiResponse.byte_thing + ",string_thing:" + multiResponse.string_thing
+                    + ",i32_thing:" + multiResponse.i32_thing
+                    + ",i64_thing:" + Int64.toStr(multiResponse.i64_thing) + ")");
 
-		rslt.Expect( multiResponse.string_thing == "Hello2", 'multiResponse.String_thing == "Hello2"');
-		rslt.Expect( multiResponse.byte_thing == arg0, 'multiResponse.Byte_thing == arg0');
-		rslt.Expect( multiResponse.i32_thing == arg1, 'multiResponse.I32_thing == arg1');
-		rslt.Expect( Int64.compare( multiResponse.i64_thing, arg2) == 0, 'multiResponse.I64_thing == arg2');
+        rslt.Expect( multiResponse.string_thing == "Hello2", 'multiResponse.String_thing == "Hello2"');
+        rslt.Expect( multiResponse.byte_thing == arg0, 'multiResponse.Byte_thing == arg0');
+        rslt.Expect( multiResponse.i32_thing == arg1, 'multiResponse.I32_thing == arg1');
+        rslt.Expect( Int64.compare( multiResponse.i64_thing, arg2) == 0, 'multiResponse.I64_thing == arg2');
 
 
-		rslt.StartTestGroup( 0);
+        rslt.StartTestGroup( 0);
 
-		trace("Test Oneway(1)");
-		client.testOneway(1);
+        trace("Test Oneway(1)");
+        client.testOneway(1);
 
-		if( ! args.skipSpeedTest) {
-			trace("Test Calltime()");
-			var difft = Timer.stamp();
-			for ( k in 0 ... 1000) {
-				client.testVoid();
-			}
-			difft = Timer.stamp() - difft;
-			trace('$difft ms per testVoid() call');
-		}
-	}
+        if( ! args.skipSpeedTest) {
+            trace("Test Calltime()");
+            var difft = Timer.stamp();
+            for ( k in 0 ... 1000) {
+                client.testVoid();
+            }
+            difft = Timer.stamp() - difft;
+            trace('$difft ms per testVoid() call');
+        }
+    }
 }
diff --git a/test/haxe/src/TestServer.hx b/test/haxe/src/TestServer.hx
index 92fab01..e9c838f 100644
--- a/test/haxe/src/TestServer.hx
+++ b/test/haxe/src/TestServer.hx
@@ -30,87 +30,87 @@
 
 class TestServer
 {
-	public static function Execute(args : Arguments) :  Void
-	{
-		try
-		{
-			// Transport
-			var transport : TServerTransport = null;
-			switch( args.transport) {
-			case socket:
-				trace("- socket port "+args.port);
-				transport = new TServerSocket( args.port);
-			case http:
-				trace("- http");
-				throw "HTTP server not implemented yet";
-		 		//transport = new THttpServer( targetHost);
-			default:
-				throw "Unhandled transport";
-			}
+    public static function Execute(args : Arguments) :  Void
+    {
+        try
+        {
+            // Transport
+            var transport : TServerTransport = null;
+            switch( args.transport) {
+            case socket:
+                trace("- socket port "+args.port);
+                transport = new TServerSocket( args.port);
+            case http:
+                trace("- http");
+                throw "HTTP server not implemented yet";
+                 //transport = new THttpServer( targetHost);
+            default:
+                throw "Unhandled transport";
+            }
 
-			// optional: layered transport
-			var transfactory : TTransportFactory = null;
-			if ( args.framed) {
-				trace("- framed transport");
-				transfactory = new TFramedTransportFactory();
-			} 
-			if ( args.buffered) {
-				trace("- buffered transport");
-				throw "TBufferedTransport not implemented yet";
-				//transfactory = new TBufferedTransportFactory();
-			}
+            // optional: layered transport
+            var transfactory : TTransportFactory = null;
+            if ( args.framed) {
+                trace("- framed transport");
+                transfactory = new TFramedTransportFactory();
+            }
+            if ( args.buffered) {
+                trace("- buffered transport");
+                throw "TBufferedTransport not implemented yet";
+                //transfactory = new TBufferedTransportFactory();
+            }
 
-			// protocol
-			var protfactory : TProtocolFactory = null;
-			switch( args.protocol)
-			{
-			case binary:
-				trace("- binary protocol");
-				protfactory = new TBinaryProtocolFactory();
-			case json:
-				trace("- json protocol");
-				protfactory = new TJSONProtocolFactory();
-			default:
-				throw "Unhandled protocol";
-			}
+            // protocol
+            var protfactory : TProtocolFactory = null;
+            switch( args.protocol)
+            {
+            case binary:
+                trace("- binary protocol");
+                protfactory = new TBinaryProtocolFactory();
+            case json:
+                trace("- json protocol");
+                protfactory = new TJSONProtocolFactory();
+            default:
+                throw "Unhandled protocol";
+            }
 
-		
-			// Processor
-			var handler = new TestServerHandler();
-			var processor = new ThriftTestProcessor(handler);
 
-			// Simple Server
-			var server : TServer = null; 
-			switch( args.servertype)
-			{
-			case simple:
-				server = new TSimpleServer( processor, transport, transfactory, protfactory);
-			default:
-				throw "Unhandled server type";
-			}
-				
+            // Processor
+            var handler = new TestServerHandler();
+            var processor = new ThriftTestProcessor(handler);
 
-			/*
-			// Server event handler
-			if( args.serverEvents) {
-				var events = new TestServerEventHandler();
-				server.setEventHandler(serverEvents);
-				handler.server = serverEngine;
-			}
-			*/
+            // Simple Server
+            var server : TServer = null;
+            switch( args.servertype)
+            {
+            case simple:
+                server = new TSimpleServer( processor, transport, transfactory, protfactory);
+            default:
+                throw "Unhandled server type";
+            }
 
-			// Run it
-			server.Serve();
-			trace("done.");
 
-		}
-		catch (x : TException)
-		{
-			trace('$x');
-		}
-		catch (x : Dynamic)
-		{
-			trace('$x');
-		}
-	}
+            /*
+            // Server event handler
+            if( args.serverEvents) {
+                var events = new TestServerEventHandler();
+                server.setEventHandler(serverEvents);
+                handler.server = serverEngine;
+            }
+            */
+
+            // Run it
+            server.Serve();
+            trace("done.");
+
+        }
+        catch (x : TException)
+        {
+            trace('$x');
+        }
+        catch (x : Dynamic)
+        {
+            trace('$x');
+        }
+    }
 }
diff --git a/test/haxe/src/TestServerEventHandler.hx b/test/haxe/src/TestServerEventHandler.hx
index b52943a..d17567c 100644
--- a/test/haxe/src/TestServerEventHandler.hx
+++ b/test/haxe/src/TestServerEventHandler.hx
@@ -30,24 +30,24 @@
 
 class TestServerEventHandler : TServerEventHandler
 {
-	public int callCount = 0;
-	public void preServe()
-	{
-		callCount++;
-	}
-	public Object createContext(Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output)
-	{
-		callCount++;
-		return null;
-	}
-	public void deleteContext(Object serverContext, Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output)
-	{
-		callCount++;
-	}
-	public void processContext(Object serverContext, Thrift.Transport.TTransport transport)
-	{
-		callCount++;
-	}
+    public int callCount = 0;
+    public void preServe()
+    {
+        callCount++;
+    }
+    public Object createContext(Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output)
+    {
+        callCount++;
+        return null;
+    }
+    public void deleteContext(Object serverContext, Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output)
+    {
+        callCount++;
+    }
+    public void processContext(Object serverContext, Thrift.Transport.TTransport transport)
+    {
+        callCount++;
+    }
 }
 
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/test/haxe/src/TestServerHandler.hx b/test/haxe/src/TestServerHandler.hx
index e988adb..f067bde 100644
--- a/test/haxe/src/TestServerHandler.hx
+++ b/test/haxe/src/TestServerHandler.hx
@@ -43,428 +43,428 @@
     public function new() {
     }
 
-	/**
-	* Prints "testVoid()" and returns nothing.
-	*/
+    /**
+    * Prints "testVoid()" and returns nothing.
+    */
     public function testVoid():Void
     {
-    	trace("testVoid()");
+        trace("testVoid()");
     }
 
-	/**
-	* Prints 'testString("%s")' with thing as '%s'
-	* @param string thing - the string to print
-	* @return string - returns the string 'thing'
-	* 
-	* @param thing
-	*/
+    /**
+    * Prints 'testString("%s")' with thing as '%s'
+    * @param string thing - the string to print
+    * @return string - returns the string 'thing'
+    *
+    * @param thing
+    */
     public function testString(thing:String):String
     {
-    	trace("teststring(\"" + thing + "\")");
-    	return thing;
+        trace("teststring(\"" + thing + "\")");
+        return thing;
     }
 
-	/**
-	* Prints 'testByte("%d")' with thing as '%d'
-	* @param byte thing - the byte to print
-	* @return byte - returns the byte 'thing'
-	* 
-	* @param thing
-	*/
+    /**
+    * Prints 'testByte("%d")' with thing as '%d'
+    * @param byte thing - the byte to print
+    * @return byte - returns the byte 'thing'
+    *
+    * @param thing
+    */
     public function testByte(thing:haxe.Int32):haxe.Int32
     {
-    	trace("testByte(" + thing + ")");
-    	return thing;
+        trace("testByte(" + thing + ")");
+        return thing;
     }
 
-	/**
-	* Prints 'testI32("%d")' with thing as '%d'
-	* @param i32 thing - the i32 to print
-	* @return i32 - returns the i32 'thing'
-	* 
-	* @param thing
-	*/
+    /**
+    * Prints 'testI32("%d")' with thing as '%d'
+    * @param i32 thing - the i32 to print
+    * @return i32 - returns the i32 'thing'
+    *
+    * @param thing
+    */
     public function testI32(thing:haxe.Int32):haxe.Int32
     {
-    	trace("testI32(" + thing + ")");
-    	return thing;
+        trace("testI32(" + thing + ")");
+        return thing;
     }
 
-	/**
-	* Prints 'testI64("%d")' with thing as '%d'
-	* @param i64 thing - the i64 to print
-	* @return i64 - returns the i64 'thing'
-	* 
-	* @param thing
-	*/
+    /**
+    * Prints 'testI64("%d")' with thing as '%d'
+    * @param i64 thing - the i64 to print
+    * @return i64 - returns the i64 'thing'
+    *
+    * @param thing
+    */
     public function testI64(thing:haxe.Int64):haxe.Int64
     {
-    	trace("testI64(" + thing + ")");
-    	return thing;
+        trace("testI64(" + thing + ")");
+        return thing;
     }
 
-	/**
-	* Prints 'testDouble("%f")' with thing as '%f'
-	* @param double thing - the double to print
-	* @return double - returns the double 'thing'
-	* 
-	* @param thing
-	*/
+    /**
+    * Prints 'testDouble("%f")' with thing as '%f'
+    * @param double thing - the double to print
+    * @return double - returns the double 'thing'
+    *
+    * @param thing
+    */
     public function testDouble(thing:Float):Float
     {
-    	trace("testDouble(" + thing + ")");
-    	return thing;
+        trace("testDouble(" + thing + ")");
+        return thing;
     }
 
-	/**
-	* Prints 'testStruct("{%s}")' where thing has been formatted 
+    /**
+    * Prints 'testStruct("{%s}")' where thing has been formatted
     *  into a string of comma seperated values
-	* @param Xtruct thing - the Xtruct to print
-	* @return Xtruct - returns the Xtruct 'thing'
-	* 
-	* @param thing
-	*/
+    * @param Xtruct thing - the Xtruct to print
+    * @return Xtruct - returns the Xtruct 'thing'
+    *
+    * @param thing
+    */
     public function testStruct(thing:Xtruct):Xtruct
     {
-    	trace("testStruct({" + 
-                          "\"" + thing.string_thing + "\", " + 
-                          thing.byte_thing + ", " + 
-                          thing.i32_thing + ", " + 
+        trace("testStruct({" +
+                          "\"" + thing.string_thing + "\", " +
+                          thing.byte_thing + ", " +
+                          thing.i32_thing + ", " +
                           Int64.toStr(thing.i64_thing) + "})");
-    	return thing;
+        return thing;
     }
 
-	/**
-	* Prints 'testNest("{%s}")' where thing has been formatted 
+    /**
+    * Prints 'testNest("{%s}")' where thing has been formatted
     *  into a string of the nested struct
-	* @param Xtruct2 thing - the Xtruct2 to print
-	* @return Xtruct2 - returns the Xtruct2 'thing'
-	* 
-	* @param thing
-	*/
+    * @param Xtruct2 thing - the Xtruct2 to print
+    * @return Xtruct2 - returns the Xtruct2 'thing'
+    *
+    * @param thing
+    */
     public function testNest(nest:Xtruct2):Xtruct2
     {
-    	var thing:Xtruct = nest.struct_thing;
-    	trace("testNest({" + 
-                          nest.byte_thing + ", {" + 
-                          "\"" + thing.string_thing + "\", " + 
-                          thing.byte_thing + ", " + 
-                          thing.i32_thing + ", " + 
-                          Int64.toStr(thing.i64_thing) + "}, " + 
+        var thing:Xtruct = nest.struct_thing;
+        trace("testNest({" +
+                          nest.byte_thing + ", {" +
+                          "\"" + thing.string_thing + "\", " +
+                          thing.byte_thing + ", " +
+                          thing.i32_thing + ", " +
+                          Int64.toStr(thing.i64_thing) + "}, " +
                           nest.i32_thing + "})");
-    	return nest;
+        return nest;
     }
 
-	/**
-	* Prints 'testMap("{%s")' where thing has been formatted
+    /**
+    * Prints 'testMap("{%s")' where thing has been formatted
     *  into a string of  'key => value' pairs
-	*  seperated by commas and new lines
-	* @param map<i32,i32> thing - the map<i32,i32> to print
-	* @return map<i32,i32> - returns the map<i32,i32> 'thing'
-	* 
-	* @param thing
-	*/
+    *  seperated by commas and new lines
+    * @param map<i32,i32> thing - the map<i32,i32> to print
+    * @return map<i32,i32> - returns the map<i32,i32> 'thing'
+    *
+    * @param thing
+    */
     public function testMap(thing:IntMap<haxe.Int32>):IntMap<haxe.Int32>
     {
-    	trace("testMap({");
-    	var first:Bool = true;
-    	for (key in thing.keys()) {
-    		if (first) {
-    			first = false;
-    		} else {
-    			trace(", ");
-    		};
-    		trace(key + " => " + thing.get(key));
-    	};
-    	trace("})");
-    	return thing;
+        trace("testMap({");
+        var first:Bool = true;
+        for (key in thing.keys()) {
+            if (first) {
+                first = false;
+            } else {
+                trace(", ");
+            };
+            trace(key + " => " + thing.get(key));
+        };
+        trace("})");
+        return thing;
     }
 
-	/**
-	* Prints 'testStringMap("{%s}")' where thing has been formatted 
+    /**
+    * Prints 'testStringMap("{%s}")' where thing has been formatted
     *  into a string of  'key => value' pairs
-	*  seperated by commas and new lines
-	* @param map<string,string> thing - the map<string,string> to print
-	* @return map<string,string> - returns the map<string,string> 'thing'
-	* 
-	* @param thing
-	*/
+    *  seperated by commas and new lines
+    * @param map<string,string> thing - the map<string,string> to print
+    * @return map<string,string> - returns the map<string,string> 'thing'
+    *
+    * @param thing
+    */
     public function testStringMap(thing:StringMap<String>):StringMap<String>
     {
-    	trace("testStringMap({");
-    	var first:Bool = true;
-    	for (key in thing.keys()) {
-    		if (first) {
-    			first = false;
-    		} else {
-    			trace(", ");
-    		};
-    		trace(key + " => " + thing.get(key));
-    	};
-    	trace("})");
-    	return thing;
+        trace("testStringMap({");
+        var first:Bool = true;
+        for (key in thing.keys()) {
+            if (first) {
+                first = false;
+            } else {
+                trace(", ");
+            };
+            trace(key + " => " + thing.get(key));
+        };
+        trace("})");
+        return thing;
     }
 
-	/**
-	* Prints 'testSet("{%s}")' where thing has been formatted 
+    /**
+    * Prints 'testSet("{%s}")' where thing has been formatted
     *  into a string of  values
-	*  seperated by commas and new lines
-	* @param set<i32> thing - the set<i32> to print
-	* @return set<i32> - returns the set<i32> 'thing'
-	* 
-	* @param thing
-	*/
+    *  seperated by commas and new lines
+    * @param set<i32> thing - the set<i32> to print
+    * @return set<i32> - returns the set<i32> 'thing'
+    *
+    * @param thing
+    */
     public function testSet(thing:IntSet):IntSet
     {
-    	trace("testSet({");
-    	var first:Bool = true;
-    	for (elem in thing) {
-    		if (first) {
-    			first = false;
-    		} else {
-    			trace(", ");
-    		};
-    		trace(elem);
-    	};
-    	trace("})");
-    	return thing;
+        trace("testSet({");
+        var first:Bool = true;
+        for (elem in thing) {
+            if (first) {
+                first = false;
+            } else {
+                trace(", ");
+            };
+            trace(elem);
+        };
+        trace("})");
+        return thing;
     }
 
-	/**
-	* Prints 'testList("{%s}")' where thing has been formatted 
+    /**
+    * Prints 'testList("{%s}")' where thing has been formatted
     *  into a string of  values
-	*  seperated by commas and new lines
-	* @param list<i32> thing - the list<i32> to print
-	* @return list<i32> - returns the list<i32> 'thing'
-	* 
-	* @param thing
-	*/
+    *  seperated by commas and new lines
+    * @param list<i32> thing - the list<i32> to print
+    * @return list<i32> - returns the list<i32> 'thing'
+    *
+    * @param thing
+    */
     public function testList(thing:List<haxe.Int32>):List<haxe.Int32>
     {
-    	trace("testList({");
-    	var first:Bool = true;
-    	for (elem in thing) {
-    		if (first) {
-    			first = false;
-    		} else {
-    			trace(", ");
-    		};
-    		trace(elem);
-    	};
-    	trace("})");
-    	return thing;
+        trace("testList({");
+        var first:Bool = true;
+        for (elem in thing) {
+            if (first) {
+                first = false;
+            } else {
+                trace(", ");
+            };
+            trace(elem);
+        };
+        trace("})");
+        return thing;
     }
 
-	/**
-	* Prints 'testEnum("%d")' where thing has been formatted into it's numeric value
-	* @param Numberz thing - the Numberz to print
-	* @return Numberz - returns the Numberz 'thing'
-	* 
-	* @param thing
-	*/
+    /**
+    * Prints 'testEnum("%d")' where thing has been formatted into it's numeric value
+    * @param Numberz thing - the Numberz to print
+    * @return Numberz - returns the Numberz 'thing'
+    *
+    * @param thing
+    */
     public function testEnum(thing:Int):Int
     {
-    	trace("testEnum(" + thing + ")");
-    	return thing;
+        trace("testEnum(" + thing + ")");
+        return thing;
     }
 
-	/**
-	* Prints 'testTypedef("%d")' with thing as '%d'
-	* @param UserId thing - the UserId to print
-	* @return UserId - returns the UserId 'thing'
-	* 
-	* @param thing
-	*/
+    /**
+    * Prints 'testTypedef("%d")' with thing as '%d'
+    * @param UserId thing - the UserId to print
+    * @return UserId - returns the UserId 'thing'
+    *
+    * @param thing
+    */
     public function testTypedef(thing:haxe.Int64):haxe.Int64
     {
-    	trace("testTypedef(" + thing + ")");
-    	return thing;
+        trace("testTypedef(" + thing + ")");
+        return thing;
     }
 
-	/**
-	* Prints 'testMapMap("%d")' with hello as '%d'
-	* @param i32 hello - the i32 to print
-	* @return map<i32,map<i32,i32>> - returns a dictionary with these values:
-	*   {-4 => {-4 => -4, -3 => -3, -2 => -2, -1 => -1, }, 
-	*     4 => {1 => 1, 2 => 2, 3 => 3, 4 => 4, }, }
-	* 
-	* @param hello
-	*/
+    /**
+    * Prints 'testMapMap("%d")' with hello as '%d'
+    * @param i32 hello - the i32 to print
+    * @return map<i32,map<i32,i32>> - returns a dictionary with these values:
+    *   {-4 => {-4 => -4, -3 => -3, -2 => -2, -1 => -1, },
+    *     4 => {1 => 1, 2 => 2, 3 => 3, 4 => 4, }, }
+    *
+    * @param hello
+    */
     public function testMapMap(hello:haxe.Int32):IntMap<IntMap<haxe.Int32>>
     {
-    	trace("testMapMap(" + hello + ")");
-    	var mapmap = new IntMap<IntMap<Int>>();
-    	var pos = new IntMap<Int>();
-    	var neg = new IntMap<Int>();
-    	for (i in 1 ... 5) {
-    		pos.set(i, i);
-    		neg.set(-i, -i);
-    	};
-    	mapmap.set(4, pos);
-    	mapmap.set(-4, neg);
-    	return mapmap;
+        trace("testMapMap(" + hello + ")");
+        var mapmap = new IntMap<IntMap<Int>>();
+        var pos = new IntMap<Int>();
+        var neg = new IntMap<Int>();
+        for (i in 1 ... 5) {
+            pos.set(i, i);
+            neg.set(-i, -i);
+        };
+        mapmap.set(4, pos);
+        mapmap.set(-4, neg);
+        return mapmap;
     }
 
-	/**
-	* So you think you've got this all worked, out eh?
-	* 
-	* Creates a the returned map with these values and prints it out:
-	*   { 1 => { 2 => argument,
-	*            3 => argument,
-	*          },
-	*     2 => { 6 => <empty Insanity struct>, },
-	*   }
-	* @return map<UserId, map<Numberz,Insanity>> - a map with the above values
-	* 
-	* @param argument
-	*/
+    /**
+    * So you think you've got this all worked, out eh?
+    *
+    * Creates a the returned map with these values and prints it out:
+    *   { 1 => { 2 => argument,
+    *            3 => argument,
+    *          },
+    *     2 => { 6 => <empty Insanity struct>, },
+    *   }
+    * @return map<UserId, map<Numberz,Insanity>> - a map with the above values
+    *
+    * @param argument
+    */
     public function testInsanity(argument : Insanity) : Int64Map< IntMap< Insanity>>
     {
-    	trace("testInsanity()");
+        trace("testInsanity()");
 
-    	var hello = new Xtruct();
-    	hello.string_thing = "Hello2";
-    	hello.byte_thing = 2;
-    	hello.i32_thing = 2;
-    	hello.i64_thing = Int64.make(0, 2);
+        var hello = new Xtruct();
+        hello.string_thing = "Hello2";
+        hello.byte_thing = 2;
+        hello.i32_thing = 2;
+        hello.i64_thing = Int64.make(0, 2);
 
-    	var goodbye = new Xtruct();
-    	goodbye.string_thing = "Goodbye4";
-    	goodbye.byte_thing = 4;
-    	goodbye.i32_thing = 4;
-    	goodbye.i64_thing = Int64.make(0, 4);
+        var goodbye = new Xtruct();
+        goodbye.string_thing = "Goodbye4";
+        goodbye.byte_thing = 4;
+        goodbye.i32_thing = 4;
+        goodbye.i64_thing = Int64.make(0, 4);
 
-    	var crazy = new Insanity();
-		crazy.userMap = new IntMap< haxe.Int64>();
-    	crazy.userMap.set(Numberz.EIGHT, Int64.make(0,8));
-    	crazy.xtructs = new List<Xtruct>();
-    	crazy.xtructs.add(goodbye);
+        var crazy = new Insanity();
+        crazy.userMap = new IntMap< haxe.Int64>();
+        crazy.userMap.set(Numberz.EIGHT, Int64.make(0,8));
+        crazy.xtructs = new List<Xtruct>();
+        crazy.xtructs.add(goodbye);
 
-    	var looney = new Insanity();
-    	crazy.userMap.set(Numberz.FIVE, Int64.make(0,5));
-    	crazy.xtructs.add(hello);
+        var looney = new Insanity();
+        crazy.userMap.set(Numberz.FIVE, Int64.make(0,5));
+        crazy.xtructs.add(hello);
 
-    	var first_map = new IntMap< Insanity>();
-    	first_map.set(Numberz.TWO, crazy);
-    	first_map.set(Numberz.THREE, crazy);
+        var first_map = new IntMap< Insanity>();
+        first_map.set(Numberz.TWO, crazy);
+        first_map.set(Numberz.THREE, crazy);
 
-    	var second_map = new IntMap< Insanity>();
-    	second_map.set(Numberz.SIX, looney);
+        var second_map = new IntMap< Insanity>();
+        second_map.set(Numberz.SIX, looney);
 
-		var insane = new Int64Map< IntMap< Insanity>>();
-    	insane.set( Int64.make(0,1), first_map);
-    	insane.set( Int64.make(0,2), second_map);
+        var insane = new Int64Map< IntMap< Insanity>>();
+        insane.set( Int64.make(0,1), first_map);
+        insane.set( Int64.make(0,2), second_map);
 
-    	return insane;
+        return insane;
     }
 
-	/**
-	* Prints 'testMulti()'
-	* @param byte arg0 -
-	* @param i32 arg1 -
-	* @param i64 arg2 -
-	* @param map<i16, string> arg3 -
-	* @param Numberz arg4 -
-	* @param UserId arg5 -
-	* @return Xtruct - returns an Xtruct 
+    /**
+    * Prints 'testMulti()'
+    * @param byte arg0 -
+    * @param i32 arg1 -
+    * @param i64 arg2 -
+    * @param map<i16, string> arg3 -
+    * @param Numberz arg4 -
+    * @param UserId arg5 -
+    * @return Xtruct - returns an Xtruct
     *    with string_thing = "Hello2, byte_thing = arg0, i32_thing = arg1
-	*    and i64_thing = arg2
-	* 
-	* @param arg0
-	* @param arg1
-	* @param arg2
-	* @param arg3
-	* @param arg4
-	* @param arg5
-	*/
-    public function testMulti(arg0:haxe.Int32, arg1:haxe.Int32, arg2:haxe.Int64, 
+    *    and i64_thing = arg2
+    *
+    * @param arg0
+    * @param arg1
+    * @param arg2
+    * @param arg3
+    * @param arg4
+    * @param arg5
+    */
+    public function testMulti(arg0:haxe.Int32, arg1:haxe.Int32, arg2:haxe.Int64,
         arg3:IntMap<String>, arg4:Int, arg5:haxe.Int64):Xtruct
     {
-    	trace("testMulti()");
-    	var hello = new Xtruct();
-    	hello.string_thing = "Hello2";
-    	hello.byte_thing = arg0;
-    	hello.i32_thing = arg1;
-    	hello.i64_thing = arg2;
-    	return hello;
+        trace("testMulti()");
+        var hello = new Xtruct();
+        hello.string_thing = "Hello2";
+        hello.byte_thing = arg0;
+        hello.i32_thing = arg1;
+        hello.i64_thing = arg2;
+        return hello;
     }
 
-	/**
-	* Print 'testException(%s)' with arg as '%s'
-	* @param string arg - a string indication what type of exception to throw
-	* if arg == "Xception" throw Xception with errorCode = 1001 and message = arg
-	* elsen if arg == "TException" throw TException
-	* else do not throw anything
-	* 
-	* @param arg
-	*/
+    /**
+    * Print 'testException(%s)' with arg as '%s'
+    * @param string arg - a string indication what type of exception to throw
+    * if arg == "Xception" throw Xception with errorCode = 1001 and message = arg
+    * elsen if arg == "TException" throw TException
+    * else do not throw anything
+    *
+    * @param arg
+    */
     public function testException(arg:String):Void
     {
-    	trace("testException(" + arg + ")");
-    	if (arg == "Xception") {
-    		var x = new Xception();
-    		x.errorCode = 1001;
-    		x.message = arg;
-    		throw x;
-    	};
-    	if (arg == "TException") {
-    		throw new TException();
-    	};		
-    	return;
+        trace("testException(" + arg + ")");
+        if (arg == "Xception") {
+            var x = new Xception();
+            x.errorCode = 1001;
+            x.message = arg;
+            throw x;
+        };
+        if (arg == "TException") {
+            throw new TException();
+        };
+        return;
     }
 
-	/**
-	* Print 'testMultiException(%s, %s)' with arg0 as '%s' and arg1 as '%s'
-	* @param string arg - a string indication what type of exception to throw
-	* if arg0 == "Xception" 
-	* throw Xception with errorCode = 1001 and message = "This is an Xception"
-	* else if arg0 == "Xception2" 
-	* throw Xception2 with errorCode = 2002 and message = "This is an Xception2"
-	* else do not throw anything
-	* @return Xtruct - an Xtruct with string_thing = arg1
-	* 
-	* @param arg0
-	* @param arg1
-	*/
+    /**
+    * Print 'testMultiException(%s, %s)' with arg0 as '%s' and arg1 as '%s'
+    * @param string arg - a string indication what type of exception to throw
+    * if arg0 == "Xception"
+    * throw Xception with errorCode = 1001 and message = "This is an Xception"
+    * else if arg0 == "Xception2"
+    * throw Xception2 with errorCode = 2002 and message = "This is an Xception2"
+    * else do not throw anything
+    * @return Xtruct - an Xtruct with string_thing = arg1
+    *
+    * @param arg0
+    * @param arg1
+    */
     public function testMultiException(arg0:String, arg1:String):Xtruct
     {
-    	trace("testMultiException(" + arg0 + ", " + arg1 + ")");
-    	if (arg0 == "Xception") {
-    		var x = new Xception();
-    		x.errorCode = 1001;
-    		x.message = "This is an Xception";
-    		throw x;
-    	} else if (arg0 == "Xception2") {
-    		var x = new Xception2();
-    		x.errorCode = 2002;
-    		x.struct_thing = new Xtruct();
-    		x.struct_thing.string_thing = "This is an Xception2";
-    		throw x;
-    	};
-    	var result = new Xtruct();
-    	result.string_thing = arg1;
-    	return result;
+        trace("testMultiException(" + arg0 + ", " + arg1 + ")");
+        if (arg0 == "Xception") {
+            var x = new Xception();
+            x.errorCode = 1001;
+            x.message = "This is an Xception";
+            throw x;
+        } else if (arg0 == "Xception2") {
+            var x = new Xception2();
+            x.errorCode = 2002;
+            x.struct_thing = new Xtruct();
+            x.struct_thing.string_thing = "This is an Xception2";
+            throw x;
+        };
+        var result = new Xtruct();
+        result.string_thing = arg1;
+        return result;
     }
 
-	/**
-	* Print 'testOneway(%d): Sleeping...' with secondsToSleep as '%d'
-	* sleep 'secondsToSleep'
-	* Print 'testOneway(%d): done sleeping!' with secondsToSleep as '%d'
-	* @param i32 secondsToSleep - the number of seconds to sleep
-	* 
-	* @param secondsToSleep
-	*/
+    /**
+    * Print 'testOneway(%d): Sleeping...' with secondsToSleep as '%d'
+    * sleep 'secondsToSleep'
+    * Print 'testOneway(%d): done sleeping!' with secondsToSleep as '%d'
+    * @param i32 secondsToSleep - the number of seconds to sleep
+    *
+    * @param secondsToSleep
+    */
     public function testOneway(secondsToSleep:haxe.Int32):Void
     {
-    	trace("testOneway(" + secondsToSleep + "), sleeping...");
-    	Sys.sleep(secondsToSleep);
-    	trace("testOneway finished");
+        trace("testOneway(" + secondsToSleep + "), sleeping...");
+        Sys.sleep(secondsToSleep);
+        trace("testOneway finished");
     }
 
     public function testStop():Void
     {
-    	if (server != null) {
-    		server.Stop();
-    	};
+        if (server != null) {
+            server.Stop();
+        };
     }
 }
diff --git a/tutorial/haxe/src/CalculatorHandler.hx b/tutorial/haxe/src/CalculatorHandler.hx
index ee75edd..3376fb6 100644
--- a/tutorial/haxe/src/CalculatorHandler.hx
+++ b/tutorial/haxe/src/CalculatorHandler.hx
@@ -32,70 +32,70 @@
 
 
 class CalculatorHandler implements Calculator {
-	
-	private var log = new IntMap<SharedStruct>();
-	
-	public function new() {
-	}
 
-	public function ping() : Void {
-		trace("ping()");
-	}
+    private var log = new IntMap<SharedStruct>();
 
-	
-	public function add( num1 : haxe.Int32, num2 : haxe.Int32) : haxe.Int32 {
-		trace('add( $num1, $num2)');
-		return num1 + num2;
-	}
+    public function new() {
+    }
 
-	public function calculate( logid : haxe.Int32, work : Work) : haxe.Int32  {
-		trace('calculate( $logid, '+work.op+","+work.num1+","+work.num2+")");
-		
-		var val : haxe.Int32 = 0;
-		switch (work.op)
-		{
-			case Operation.ADD:
-				val = work.num1 + work.num2;
+    public function ping() : Void {
+        trace("ping()");
+    }
 
-			case Operation.SUBTRACT:
-				val = work.num1 - work.num2;
 
-			case Operation.MULTIPLY:
-				val = work.num1 * work.num2;
+    public function add( num1 : haxe.Int32, num2 : haxe.Int32) : haxe.Int32 {
+        trace('add( $num1, $num2)');
+        return num1 + num2;
+    }
 
-			case Operation.DIVIDE:
-				if (work.num2 == 0)
-				{
-					var io = new InvalidOperation();
-					io.what = work.op;
-					io.why = "Cannot divide by 0";
-					throw io;
-				}
-				val = Std.int( work.num1 / work.num2);
+    public function calculate( logid : haxe.Int32, work : Work) : haxe.Int32  {
+        trace('calculate( $logid, '+work.op+","+work.num1+","+work.num2+")");
 
-			default:
-				var io = new InvalidOperation();
-				io.what = work.op;
-				io.why = "Unknown operation";
-				throw io;
-		}
+        var val : haxe.Int32 = 0;
+        switch (work.op)
+        {
+            case Operation.ADD:
+                val = work.num1 + work.num2;
 
-		var entry = new SharedStruct();
-		entry.key = logid;
-		entry.value = '$val';
-		log.set(logid, entry);
+            case Operation.SUBTRACT:
+                val = work.num1 - work.num2;
 
-		return val;
-	}
+            case Operation.MULTIPLY:
+                val = work.num1 * work.num2;
 
-	public function getStruct( key : haxe.Int32) : SharedStruct {
-		trace('getStruct($key)');
-		return log.get(key);
-	}
+            case Operation.DIVIDE:
+                if (work.num2 == 0)
+                {
+                    var io = new InvalidOperation();
+                    io.what = work.op;
+                    io.why = "Cannot divide by 0";
+                    throw io;
+                }
+                val = Std.int( work.num1 / work.num2);
 
-	// oneway method,  no args
-	public function zip() : Void {
-		trace("zip()");
-	}
+            default:
+                var io = new InvalidOperation();
+                io.what = work.op;
+                io.why = "Unknown operation";
+                throw io;
+        }
+
+        var entry = new SharedStruct();
+        entry.key = logid;
+        entry.value = '$val';
+        log.set(logid, entry);
+
+        return val;
+    }
+
+    public function getStruct( key : haxe.Int32) : SharedStruct {
+        trace('getStruct($key)');
+        return log.get(key);
+    }
+
+    // oneway method,  no args
+    public function zip() : Void {
+        trace("zip()");
+    }
 
 }
diff --git a/tutorial/haxe/src/Main.hx b/tutorial/haxe/src/Main.hx
index 41d8945..d4ba054 100644
--- a/tutorial/haxe/src/Main.hx
+++ b/tutorial/haxe/src/Main.hx
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package;
 
 import org.apache.thrift.*;
@@ -30,296 +30,297 @@
 
 
 enum Prot {
-	binary;
-	json;
+    binary;
+    json;
 }
 
 enum Trns {
-	socket;
-	http;
+    socket;
+    http;
 }
 
 class Main {
-	
-	private static var server : Bool = false;
-	private static var framed : Bool = false;
-	private static var buffered : Bool = false;
-	private static var prot : Prot = binary;
-	private static var trns : Trns = socket;
-	
-	private static var targetHost : String = "localhost";
-	private static var targetPort : Int = 9090;
-	
-	static function main() {
-		#if ! (flash || js)
-		try {
-  			ParseArgs();
-		} catch (e : String) {
-			trace(e);
-			trace(GetHelp());
-			return;
-		}
-		#end
 
-		try {
-			if (server)
-				RunServer();
-			else 
-				RunClient();
-		} catch (e : String) {
-			trace(e);
-		}
+    private static var server : Bool = false;
+    private static var framed : Bool = false;
+    private static var buffered : Bool = false;
+    private static var prot : Prot = binary;
+    private static var trns : Trns = socket;
 
-		trace("Completed.");
+    private static var targetHost : String = "localhost";
+    private static var targetPort : Int = 9090;
+
+    static function main() {
+        #if ! (flash || js)
+        try {
+              ParseArgs();
+        } catch (e : String) {
+            trace(e);
+            trace(GetHelp());
+            return;
+        }
+        #end
+
+        try {
+            if (server)
+                RunServer();
+            else
+                RunClient();
+        } catch (e : String) {
+            trace(e);
+        }
+
+        trace("Completed.");
     }
 
-	
-	#if ! (flash || js)
-		
-	private static function GetHelp() : String {
-		return Sys.executablePath()+"  modus  trnsOption  transport  protocol\n"
-		+"Options:\n"
-		+"  modus:       client, server   (default: client)\n"
-		+"  trnsOption:  framed, buffered (default: none)\n"
-		+"  transport:   socket, http     (default: socket)\n"
-		+"  protocol:    binary, json     (default: binary)\n"
-		+"\n"
-		+"All arguments are optional.\n";
-	}
-	
 
-	private static function ParseArgs() : Void {
-		var step = 0;
-		for (arg in Sys.args()) {
-			
-			// server|client
-			switch(step) {
-			case 0:
-				++step;
-				if ( arg == "client") 
-					server = false;
-				else if ( arg == "server") 
-					server = true;
-				else
-					throw "First argument must be 'server' or 'client'";
-					
-			case 1:					
-				if ( arg == "framed") {
-					framed = true;
-				} else if ( arg == "buffered") {
-					buffered = true;
-				} else if ( arg == "socket") {
-					trns = socket;
-					++step;
-				} else if ( arg == "http") {
-					trns = http;
-					++step;
-				} else {
-					throw "Unknown transport "+arg;
-				}					
+    #if ! (flash || js)
 
-			case 2:					
-				if ( arg == "binary") {
-					prot = binary;
-					++step;
-				} else if ( arg == "json") {
-					prot = json;
-					++step;
-				} else {
-					throw "Unknown protocol "+arg;
-				}					
+    private static function GetHelp() : String {
+        return Sys.executablePath()+"  modus  trnsOption  transport  protocol\n"
+        +"Options:\n"
+        +"  modus:       client, server   (default: client)\n"
+        +"  trnsOption:  framed, buffered (default: none)\n"
+        +"  transport:   socket, http     (default: socket)\n"
+        +"  protocol:    binary, json     (default: binary)\n"
+        +"\n"
+        +"All arguments are optional.\n";
+    }
 
-			default:
-				throw "Unexpected argument "+arg;
-			}
 
-			if ( framed && buffered)
-			{
-				trace("WN: framed supersedes buffered");
-			}
+    private static function ParseArgs() : Void {
+        var step = 0;
+        for (arg in Sys.args()) {
 
-		}
-	}
+            // server|client
+            switch(step) {
+            case 0:
+                ++step;
+                if ( arg == "client")
+                    server = false;
+                else if ( arg == "server")
+                    server = true;
+                else
+                    throw "First argument must be 'server' or 'client'";
 
-	#end
-	
-	private static function ClientSetup() : Calculator {
-	 	trace("Client configuration:");
+            case 1:
+                if ( arg == "framed") {
+                    framed = true;
+                } else if ( arg == "buffered") {
+                    buffered = true;
+                } else if ( arg == "socket") {
+                    trns = socket;
+                    ++step;
+                } else if ( arg == "http") {
+                    trns = http;
+                    ++step;
+                } else {
+                    throw "Unknown transport "+arg;
+                }
 
-		// endpoint transport
-		var transport : TTransport;
-		switch(trns)
-		{
-		case socket:
-		 	trace('- socket transport $targetHost:$targetPort');
-			transport = new TSocket( targetHost, targetPort);
+            case 2:
+                if ( arg == "binary") {
+                    prot = binary;
+                    ++step;
+                } else if ( arg == "json") {
+                    prot = json;
+                    ++step;
+                } else {
+                    throw "Unknown protocol "+arg;
+                }
+
+            default:
+                throw "Unexpected argument "+arg;
+            }
+
+            if ( framed && buffered)
+            {
+                trace("WN: framed supersedes buffered");
+            }
+
+        }
+    }
+
+    #end
+
+    private static function ClientSetup() : Calculator {
+         trace("Client configuration:");
+
+        // endpoint transport
+        var transport : TTransport;
+        switch(trns)
+        {
+        case socket:
+             trace('- socket transport $targetHost:$targetPort');
+            transport = new TSocket( targetHost, targetPort);
         case http:
-		 	trace('- HTTP transport $targetHost');
-			transport = new THttpClient( targetHost);
-		default:
-			throw "Unhandled transport";
-		}
+             trace('- HTTP transport $targetHost');
+            transport = new THttpClient( targetHost);
+        default:
+            throw "Unhandled transport";
+        }
 
-		
-		// optinal layered transport
-		if ( framed) {
-		 	trace("- framed transport");
-			transport = new TFramedTransport(transport);
-		} else if ( buffered) {
-		 	trace("- buffered transport");
-			throw "TBufferedTransport not implemented yet";
-			//transport = new TBufferedTransport(transport);
-		}
 
-		
-		// protocol
-		var protocol : TProtocol;
-		switch(prot)
-		{
-		case binary:
-		 	trace("- binary protocol");
-		 	protocol = new TBinaryProtocol( transport);
+        // optinal layered transport
+        if ( framed) {
+             trace("- framed transport");
+            transport = new TFramedTransport(transport);
+        } else if ( buffered) {
+             trace("- buffered transport");
+            throw "TBufferedTransport not implemented yet";
+            //transport = new TBufferedTransport(transport);
+        }
+
+
+        // protocol
+        var protocol : TProtocol;
+        switch(prot)
+        {
+        case binary:
+             trace("- binary protocol");
+             protocol = new TBinaryProtocol( transport);
         case json:
-		 	trace("- JSON protocol");
-		 	protocol = new TJSONProtocol( transport);
-		default:
-			throw "Unhandled protocol";
-		}
-
-		
-		// put everything together
-		transport.open();	
-		return new CalculatorImpl(protocol,protocol);
-	}
-	
-	
-	private static function RunClient() : Void {
-		var client = ClientSetup();
-
-		try {
-		  	client.ping();
-			trace("ping() successful");
-		} catch(error : TException) { 
-			trace('ping() failed: $error'); 
-		} catch(error : Dynamic) { 
-			trace('ping() failed: $error'); 
-		}
-
-		try {
-			var sum = client.add( 1, 1); 
-			trace('1+1=$sum');
-		} catch(error : TException) { 
-			trace('add() failed: $error'); 
-		} catch(error : Dynamic) { 
-			trace('add() failed: $error'); 
-		}
+             trace("- JSON protocol");
+             protocol = new TJSONProtocol( transport);
+        default:
+            throw "Unhandled protocol";
+        }
 
 
-		var work = new tutorial.Work();
-		work.op = tutorial.Operation.DIVIDE;
-		work.num1 = 1;
-		work.num2 = 0;
-		try {
-			var quotient = client.calculate( 1, work); 
-			trace('Whoa we can divide by 0! Result = $quotient'); 
-		} catch(error : TException) { 
-			trace('calculate() failed: $error'); 
-		} catch(error : Dynamic) { 
-			trace('calculate() failed: $error'); 
-		}
-
-		work.op = tutorial.Operation.SUBTRACT;
-		work.num1 = 15;
-		work.num2 = 10;
-		try {
-			var diff = client.calculate( 1, work);
-			trace('15-10=$diff');
-		} catch(error : TException) { 
-			trace('calculate() failed: $error'); 
-		} catch(error : Dynamic) { 
-			trace('calculate() failed: $error'); 
-		}
+        // put everything together
+        transport.open();
+        return new CalculatorImpl(protocol,protocol);
+    }
 
 
-		try {
-			var log : SharedStruct = client.getStruct( 1);
-			var logval = log.value;
-			trace('Check log: $logval');
-		} catch(error : TException) { 
-			trace('getStruct() failed: $error'); 
-		} catch(error : Dynamic) { 
-			trace('getStruct() failed: $error'); 
-		}
-	}
-	
-	
-	private static function ServerSetup() : TServer {
-	 	trace("Server configuration:");
+    private static function RunClient() : Void {
+        var client = ClientSetup();
 
-		// endpoint transport
-		var transport : TServerTransport = null;
-		switch(trns)
-		{
-		case socket:
-			#if (flash || js)
-			throw 'current platform does not support socket servers';
-			#else
-		 	trace('- socket transport port $targetPort');
-			transport = new TServerSocket( targetPort);
-			#end
+        try {
+              client.ping();
+            trace("ping() successful");
+        } catch(error : TException) {
+            trace('ping() failed: $error');
+        } catch(error : Dynamic) {
+            trace('ping() failed: $error');
+        }
+
+        try {
+            var sum = client.add( 1, 1);
+            trace('1+1=$sum');
+        } catch(error : TException) {
+            trace('add() failed: $error');
+        } catch(error : Dynamic) {
+            trace('add() failed: $error');
+        }
+
+
+        var work = new tutorial.Work();
+        work.op = tutorial.Operation.DIVIDE;
+        work.num1 = 1;
+        work.num2 = 0;
+        try {
+            var quotient = client.calculate( 1, work);
+            trace('Whoa we can divide by 0! Result = $quotient');
+        } catch(error : TException) {
+            trace('calculate() failed: $error');
+        } catch(error : Dynamic) {
+            trace('calculate() failed: $error');
+        }
+
+        work.op = tutorial.Operation.SUBTRACT;
+        work.num1 = 15;
+        work.num2 = 10;
+        try {
+            var diff = client.calculate( 1, work);
+            trace('15-10=$diff');
+        } catch(error : TException) {
+            trace('calculate() failed: $error');
+        } catch(error : Dynamic) {
+            trace('calculate() failed: $error');
+        }
+
+
+        try {
+            var log : SharedStruct = client.getStruct( 1);
+            var logval = log.value;
+            trace('Check log: $logval');
+        } catch(error : TException) {
+            trace('getStruct() failed: $error');
+        } catch(error : Dynamic) {
+            trace('getStruct() failed: $error');
+        }
+    }
+
+
+    private static function ServerSetup() : TServer {
+         trace("Server configuration:");
+
+        // endpoint transport
+        var transport : TServerTransport = null;
+        switch(trns)
+        {
+        case socket:
+            #if (flash || js)
+            throw 'current platform does not support socket servers';
+            #else
+             trace('- socket transport port $targetPort');
+            transport = new TServerSocket( targetPort);
+            #end
         case http:
-			throw "HTTP server not implemented yet";
-		 	//trace("- http transport");
-		 	//transport = new THttpClient( targetHost);
-		default:
-			throw "Unhandled transport";
-		}
-		
-		// optional: layered transport
-		var transfactory : TTransportFactory = null;
-		if ( framed) {
-		 	trace("- framed transport");
-			transfactory = new TFramedTransportFactory();
-		} else if ( buffered) {
-		 	trace("- buffered transport");
-			throw "TBufferedTransport not implemented yet";
-			//transfactory = new TBufferedTransportFactory();
-		}
-		
-		// protocol
-		var protfactory : TProtocolFactory = null;
-		switch(prot)
-		{
-		case binary:
-		 	trace("- binary protocol");
-		 	protfactory = new TBinaryProtocolFactory();
-        case json:
-			trace("- JSON protocol");
-		 	protfactory = new TJSONProtocolFactory();
-		default:
-			throw "Unhandled protocol";
-		}
-		
-		var handler = new CalculatorHandler();
-		var processor = new CalculatorProcessor(handler);
-		var server = new TSimpleServer( processor, transport, transfactory, protfactory);
-		return server;
-	}
-	
-	
-	private static function RunServer() : Void {
-		try
-		{
-			var server = ServerSetup();
+            throw "HTTP server not implemented yet";
+             //trace("- http transport");
+             //transport = new THttpClient( targetHost);
+        default:
+            throw "Unhandled transport";
+        }
 
-			trace("\nStarting the server...");
-			server.Serve();
-		}
-		catch( e : Dynamic)
-		{
-			trace('RunServer() failed: $e');
-		}
-		trace("done.");
-	}
-	
+        // optional: layered transport
+        var transfactory : TTransportFactory = null;
+        if ( framed) {
+             trace("- framed transport");
+            transfactory = new TFramedTransportFactory();
+        } else if ( buffered) {
+             trace("- buffered transport");
+            throw "TBufferedTransport not implemented yet";
+            //transfactory = new TBufferedTransportFactory();
+        }
+
+        // protocol
+        var protfactory : TProtocolFactory = null;
+        switch(prot)
+        {
+        case binary:
+             trace("- binary protocol");
+             protfactory = new TBinaryProtocolFactory();
+        case json:
+            trace("- JSON protocol");
+             protfactory = new TJSONProtocolFactory();
+        default:
+            throw "Unhandled protocol";
+        }
+
+        var handler = new CalculatorHandler();
+        var processor = new CalculatorProcessor(handler);
+        var server = new TSimpleServer( processor, transport, transfactory, protfactory);
+        return server;
+    }
+
+
+    private static function RunServer() : Void {
+        try
+        {
+            var server = ServerSetup();
+
+            trace("\nStarting the server...");
+            server.Serve();
+        }
+        catch( e : Dynamic)
+        {
+            trace('RunServer() failed: $e');
+        }
+        trace("done.");
+    }
+
 }
+ 
\ No newline at end of file
