diff --git a/tinyxml2.cpp b/tinyxml2.cpp
old mode 100644
new mode 100755
index 143d30a..72d421d
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -24,10 +24,10 @@
 #include "tinyxml2.h"
 
 #include <new>		// yes, this one new style header, is in the Android SDK.
-#ifdef ANDROID_NDK
-	#include <stddef.h>
+#   ifdef ANDROID_NDK
+#   include <stddef.h>
 #else
-	#include <cstddef>
+#   include <cstddef>
 #endif
 
 using namespace tinyxml2;
@@ -49,220 +49,218 @@
 
 
 #define DELETE_NODE( node )	{			\
-	if ( node ) {						\
-		MemPool* pool = node->memPool;	\
-		node->~XMLNode();				\
-		pool->Free( node );				\
-	}									\
-}
+        if ( node ) {						\
+            MemPool* pool = node->memPool;	\
+            node->~XMLNode();				\
+            pool->Free( node );				\
+        }									\
+    }
 #define DELETE_ATTRIBUTE( attrib ) {		\
-	if ( attrib ) {							\
-		MemPool* pool = attrib->memPool;	\
-		attrib->~XMLAttribute();			\
-		pool->Free( attrib );				\
-	}										\
-}
+        if ( attrib ) {							\
+            MemPool* pool = attrib->memPool;	\
+            attrib->~XMLAttribute();			\
+            pool->Free( attrib );				\
+        }										\
+    }
 
 struct Entity {
-	const char* pattern;
-	int length;
-	char value;
+    const char* pattern;
+    int length;
+    char value;
 };
 
 static const int NUM_ENTITIES = 5;
-static const Entity entities[NUM_ENTITIES] =
-{
-	{ "quot", 4,	DOUBLE_QUOTE },
-	{ "amp", 3,		'&'  },
-	{ "apos", 4,	SINGLE_QUOTE },
-	{ "lt",	2, 		'<'	 },
-	{ "gt",	2,		'>'	 }
+static const Entity entities[NUM_ENTITIES] = {
+    { "quot", 4,	DOUBLE_QUOTE },
+    { "amp", 3,		'&'  },
+    { "apos", 4,	SINGLE_QUOTE },
+    { "lt",	2, 		'<'	 },
+    { "gt",	2,		'>'	 }
 };
 
 
 StrPair::~StrPair()
 {
-	Reset();
+    Reset();
 }
 
 
 void StrPair::Reset()
 {
-	if ( flags & NEEDS_DELETE ) {
-		delete [] start;
-	}
-	flags = 0;
-	start = 0;
-	end = 0;
+    if ( flags & NEEDS_DELETE ) {
+        delete [] start;
+    }
+    flags = 0;
+    start = 0;
+    end = 0;
 }
 
 
 void StrPair::SetStr( const char* str, int flags )
 {
-	Reset();
-	size_t len = strlen( str );
-	start = new char[ len+1 ];
-	memcpy( start, str, len+1 );
-	end = start + len;
-	this->flags = flags | NEEDS_DELETE;
+    Reset();
+    size_t len = strlen( str );
+    start = new char[ len+1 ];
+    memcpy( start, str, len+1 );
+    end = start + len;
+    this->flags = flags | NEEDS_DELETE;
 }
 
 
 char* StrPair::ParseText( char* p, const char* endTag, int strFlags )
 {
-	TIXMLASSERT( endTag && *endTag );
+    TIXMLASSERT( endTag && *endTag );
 
-	char* start = p;	// fixme: hides a member
-	char  endChar = *endTag;
-	size_t length = strlen( endTag );
+    char* start = p;	// fixme: hides a member
+    char  endChar = *endTag;
+    size_t length = strlen( endTag );
 
-	// Inner loop of text parsing.
-	while ( *p ) {
-		if ( *p == endChar && strncmp( p, endTag, length ) == 0 ) {
-			Set( start, p, strFlags );
-			return p + length;
-		}
-		++p;
-	}
-	return 0;
+    // Inner loop of text parsing.
+    while ( *p ) {
+        if ( *p == endChar && strncmp( p, endTag, length ) == 0 ) {
+            Set( start, p, strFlags );
+            return p + length;
+        }
+        ++p;
+    }
+    return 0;
 }
 
 
 char* StrPair::ParseName( char* p )
 {
-	char* start = p;
+    char* start = p;
 
-	if ( !start || !(*start) ) {
-		return 0;
-	}
+    if ( !start || !(*start) ) {
+        return 0;
+    }
 
-	while( *p && (
-			   XMLUtil::IsAlphaNum( (unsigned char) *p )
-			|| *p == '_'
-			|| *p == ':'
-			|| (*p == '-' && p>start )		// can be in a name, but not lead it.
-			|| (*p == '.' && p>start ) ))	// can be in a name, but not lead it.
-	{
-		++p;
-	}
+    while( *p && (
+                XMLUtil::IsAlphaNum( (unsigned char) *p )
+                || *p == '_'
+                || *p == ':'
+                || (*p == '-' && p>start )		// can be in a name, but not lead it.
+                || (*p == '.' && p>start ) )) {	// can be in a name, but not lead it.
+        ++p;
+    }
 
-	if ( p > start ) {
-		Set( start, p, 0 );
-		return p;
-	}
-	return 0;
+    if ( p > start ) {
+        Set( start, p, 0 );
+        return p;
+    }
+    return 0;
 }
 
 
 void StrPair::CollapseWhitespace()
 {
-	// Trim leading space.
-	start = XMLUtil::SkipWhiteSpace( start );
+    // Trim leading space.
+    start = XMLUtil::SkipWhiteSpace( start );
 
-	if ( start && *start ) {
-		char* p = start;	// the read pointer
-		char* q = start;	// the write pointer
+    if ( start && *start ) {
+        char* p = start;	// the read pointer
+        char* q = start;	// the write pointer
 
-		while( *p ) {
-			if ( XMLUtil::IsWhiteSpace( *p )) {
-				p = XMLUtil::SkipWhiteSpace( p );
-				if ( *p == 0 )
-					break;	// don't write to q; this trims the trailing space.
-				*q = ' ';
-				++q;
-			}
-			*q = *p;
-			++q;
-			++p;
-		}
-		*q = 0;
-	}
+        while( *p ) {
+            if ( XMLUtil::IsWhiteSpace( *p )) {
+                p = XMLUtil::SkipWhiteSpace( p );
+                if ( *p == 0 ) {
+                    break;    // don't write to q; this trims the trailing space.
+                }
+                *q = ' ';
+                ++q;
+            }
+            *q = *p;
+            ++q;
+            ++p;
+        }
+        *q = 0;
+    }
 }
 
 
 const char* StrPair::GetStr()
 {
-	if ( flags & NEEDS_FLUSH ) {
-		*end = 0;
-		flags ^= NEEDS_FLUSH;
+    if ( flags & NEEDS_FLUSH ) {
+        *end = 0;
+        flags ^= NEEDS_FLUSH;
 
-		if ( flags ) {
-			char* p = start;	// the read pointer
-			char* q = start;	// the write pointer
+        if ( flags ) {
+            char* p = start;	// the read pointer
+            char* q = start;	// the write pointer
 
-			while( p < end ) {
-				if ( (flags & NEEDS_NEWLINE_NORMALIZATION) && *p == CR ) {
-					// CR-LF pair becomes LF
-					// CR alone becomes LF
-					// LF-CR becomes LF
-					if ( *(p+1) == LF ) {
-						p += 2;
-					}
-					else {
-						++p;
-					}
-					*q++ = LF;
-				}
-				else if ( (flags & NEEDS_NEWLINE_NORMALIZATION) && *p == LF ) {
-					if ( *(p+1) == CR ) {
-						p += 2;
-					}
-					else {
-						++p;
-					}
-					*q++ = LF;
-				}
-				else if ( (flags & NEEDS_ENTITY_PROCESSING) && *p == '&' ) {
-					// Entities handled by tinyXML2:
-					// - special entities in the entity table [in/out]
-					// - numeric character reference [in]
-					//   &#20013; or &#x4e2d;
+            while( p < end ) {
+                if ( (flags & NEEDS_NEWLINE_NORMALIZATION) && *p == CR ) {
+                    // CR-LF pair becomes LF
+                    // CR alone becomes LF
+                    // LF-CR becomes LF
+                    if ( *(p+1) == LF ) {
+                        p += 2;
+                    }
+                    else {
+                        ++p;
+                    }
+                    *q++ = LF;
+                }
+                else if ( (flags & NEEDS_NEWLINE_NORMALIZATION) && *p == LF ) {
+                    if ( *(p+1) == CR ) {
+                        p += 2;
+                    }
+                    else {
+                        ++p;
+                    }
+                    *q++ = LF;
+                }
+                else if ( (flags & NEEDS_ENTITY_PROCESSING) && *p == '&' ) {
+                    // Entities handled by tinyXML2:
+                    // - special entities in the entity table [in/out]
+                    // - numeric character reference [in]
+                    //   &#20013; or &#x4e2d;
 
-					if ( *(p+1) == '#' ) {
-						char buf[10] = { 0 };
-						int len;
-						p = const_cast<char*>( XMLUtil::GetCharacterRef( p, buf, &len ) );
-						for( int i=0; i<len; ++i ) {
-							*q++ = buf[i];
-						}
-						TIXMLASSERT( q <= p );
-					}
-					else {
-						int i=0;
-						for(; i<NUM_ENTITIES; ++i ) {
-							if (    strncmp( p+1, entities[i].pattern, entities[i].length ) == 0
-								 && *(p+entities[i].length+1) == ';' )
-							{
-								// Found an entity convert;
-								*q = entities[i].value;
-								++q;
-								p += entities[i].length + 2;
-								break;
-							}
-						}
-						if ( i == NUM_ENTITIES ) {
-							// fixme: treat as error?
-							++p;
-							++q;
-						}
-					}
-				}
-				else {
-					*q = *p;
-					++p;
-					++q;
-				}
-			}
-			*q = 0;
-		}
-		// The loop below has plenty going on, and this
-		// is a less useful mode. Break it out.
-		if ( flags & COLLAPSE_WHITESPACE ) {
-			CollapseWhitespace();
-		}
-		flags = (flags & NEEDS_DELETE);
-	}
-	return start;
+                    if ( *(p+1) == '#' ) {
+                        char buf[10] = { 0 };
+                        int len;
+                        p = const_cast<char*>( XMLUtil::GetCharacterRef( p, buf, &len ) );
+                        for( int i=0; i<len; ++i ) {
+                            *q++ = buf[i];
+                        }
+                        TIXMLASSERT( q <= p );
+                    }
+                    else {
+                        int i=0;
+                        for(; i<NUM_ENTITIES; ++i ) {
+                            if (    strncmp( p+1, entities[i].pattern, entities[i].length ) == 0
+                                    && *(p+entities[i].length+1) == ';' ) {
+                                // Found an entity convert;
+                                *q = entities[i].value;
+                                ++q;
+                                p += entities[i].length + 2;
+                                break;
+                            }
+                        }
+                        if ( i == NUM_ENTITIES ) {
+                            // fixme: treat as error?
+                            ++p;
+                            ++q;
+                        }
+                    }
+                }
+                else {
+                    *q = *p;
+                    ++p;
+                    ++q;
+                }
+            }
+            *q = 0;
+        }
+        // The loop below has plenty going on, and this
+        // is a less useful mode. Break it out.
+        if ( flags & COLLAPSE_WHITESPACE ) {
+            CollapseWhitespace();
+        }
+        flags = (flags & NEEDS_DELETE);
+    }
+    return start;
 }
 
 
@@ -272,429 +270,447 @@
 
 const char* XMLUtil::ReadBOM( const char* p, bool* bom )
 {
-	*bom = false;
-	const unsigned char* pu = reinterpret_cast<const unsigned char*>(p);
-	// Check for BOM:
-	if (    *(pu+0) == TIXML_UTF_LEAD_0
-		 && *(pu+1) == TIXML_UTF_LEAD_1
-		 && *(pu+2) == TIXML_UTF_LEAD_2 )
-	{
-		*bom = true;
-		p += 3;
-	}
-	return p;
+    *bom = false;
+    const unsigned char* pu = reinterpret_cast<const unsigned char*>(p);
+    // Check for BOM:
+    if (    *(pu+0) == TIXML_UTF_LEAD_0
+            && *(pu+1) == TIXML_UTF_LEAD_1
+            && *(pu+2) == TIXML_UTF_LEAD_2 ) {
+        *bom = true;
+        p += 3;
+    }
+    return p;
 }
 
 
 void XMLUtil::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length )
 {
-	const unsigned long BYTE_MASK = 0xBF;
-	const unsigned long BYTE_MARK = 0x80;
-	const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
+    const unsigned long BYTE_MASK = 0xBF;
+    const unsigned long BYTE_MARK = 0x80;
+    const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
 
-	if (input < 0x80)
-		*length = 1;
-	else if ( input < 0x800 )
-		*length = 2;
-	else if ( input < 0x10000 )
-		*length = 3;
-	else if ( input < 0x200000 )
-		*length = 4;
-	else
-		{ *length = 0; return; }	// This code won't covert this correctly anyway.
+    if (input < 0x80) {
+        *length = 1;
+    }
+    else if ( input < 0x800 ) {
+        *length = 2;
+    }
+    else if ( input < 0x10000 ) {
+        *length = 3;
+    }
+    else if ( input < 0x200000 ) {
+        *length = 4;
+    }
+    else {
+        *length = 0;    // This code won't covert this correctly anyway.
+        return;
+    }
 
-	output += *length;
+    output += *length;
 
-	// Scary scary fall throughs.
-	switch (*length)
-	{
-		case 4:
-			--output;
-			*output = (char)((input | BYTE_MARK) & BYTE_MASK);
-			input >>= 6;
-		case 3:
-			--output;
-			*output = (char)((input | BYTE_MARK) & BYTE_MASK);
-			input >>= 6;
-		case 2:
-			--output;
-			*output = (char)((input | BYTE_MARK) & BYTE_MASK);
-			input >>= 6;
-		case 1:
-			--output;
-			*output = (char)(input | FIRST_BYTE_MARK[*length]);
-	}
+    // Scary scary fall throughs.
+    switch (*length) {
+        case 4:
+            --output;
+            *output = (char)((input | BYTE_MARK) & BYTE_MASK);
+            input >>= 6;
+        case 3:
+            --output;
+            *output = (char)((input | BYTE_MARK) & BYTE_MASK);
+            input >>= 6;
+        case 2:
+            --output;
+            *output = (char)((input | BYTE_MARK) & BYTE_MASK);
+            input >>= 6;
+        case 1:
+            --output;
+            *output = (char)(input | FIRST_BYTE_MARK[*length]);
+    }
 }
 
 
 const char* XMLUtil::GetCharacterRef( const char* p, char* value, int* length )
 {
-	// Presume an entity, and pull it out.
-	*length = 0;
+    // Presume an entity, and pull it out.
+    *length = 0;
 
-	if ( *(p+1) == '#' && *(p+2) )
-	{
-		unsigned long ucs = 0;
-		ptrdiff_t delta = 0;
-		unsigned mult = 1;
+    if ( *(p+1) == '#' && *(p+2) ) {
+        unsigned long ucs = 0;
+        ptrdiff_t delta = 0;
+        unsigned mult = 1;
 
-		if ( *(p+2) == 'x' )
-		{
-			// Hexadecimal.
-			if ( !*(p+3) ) return 0;
+        if ( *(p+2) == 'x' ) {
+            // Hexadecimal.
+            if ( !*(p+3) ) {
+                return 0;
+            }
 
-			const char* q = p+3;
-			q = strchr( q, ';' );
+            const char* q = p+3;
+            q = strchr( q, ';' );
 
-			if ( !q || !*q ) return 0;
+            if ( !q || !*q ) {
+                return 0;
+            }
 
-			delta = q-p;
-			--q;
+            delta = q-p;
+            --q;
 
-			while ( *q != 'x' )
-			{
-				if ( *q >= '0' && *q <= '9' )
-					ucs += mult * (*q - '0');
-				else if ( *q >= 'a' && *q <= 'f' )
-					ucs += mult * (*q - 'a' + 10);
-				else if ( *q >= 'A' && *q <= 'F' )
-					ucs += mult * (*q - 'A' + 10 );
-				else
-					return 0;
-				mult *= 16;
-				--q;
-			}
-		}
-		else
-		{
-			// Decimal.
-			if ( !*(p+2) ) return 0;
+            while ( *q != 'x' ) {
+                if ( *q >= '0' && *q <= '9' ) {
+                    ucs += mult * (*q - '0');
+                }
+                else if ( *q >= 'a' && *q <= 'f' ) {
+                    ucs += mult * (*q - 'a' + 10);
+                }
+                else if ( *q >= 'A' && *q <= 'F' ) {
+                    ucs += mult * (*q - 'A' + 10 );
+                }
+                else {
+                    return 0;
+                }
+                mult *= 16;
+                --q;
+            }
+        }
+        else {
+            // Decimal.
+            if ( !*(p+2) ) {
+                return 0;
+            }
 
-			const char* q = p+2;
-			q = strchr( q, ';' );
+            const char* q = p+2;
+            q = strchr( q, ';' );
 
-			if ( !q || !*q ) return 0;
+            if ( !q || !*q ) {
+                return 0;
+            }
 
-			delta = q-p;
-			--q;
+            delta = q-p;
+            --q;
 
-			while ( *q != '#' )
-			{
-				if ( *q >= '0' && *q <= '9' )
-					ucs += mult * (*q - '0');
-				else
-					return 0;
-				mult *= 10;
-				--q;
-			}
-		}
-		// convert the UCS to UTF-8
-		ConvertUTF32ToUTF8( ucs, value, length );
-		return p + delta + 1;
-	}
-	return p+1;
+            while ( *q != '#' ) {
+                if ( *q >= '0' && *q <= '9' ) {
+                    ucs += mult * (*q - '0');
+                }
+                else {
+                    return 0;
+                }
+                mult *= 10;
+                --q;
+            }
+        }
+        // convert the UCS to UTF-8
+        ConvertUTF32ToUTF8( ucs, value, length );
+        return p + delta + 1;
+    }
+    return p+1;
 }
 
 
 void XMLUtil::ToStr( int v, char* buffer, int bufferSize )
 {
-	TIXML_SNPRINTF( buffer, bufferSize, "%d", v );
+    TIXML_SNPRINTF( buffer, bufferSize, "%d", v );
 }
 
 
 void XMLUtil::ToStr( unsigned v, char* buffer, int bufferSize )
 {
-	TIXML_SNPRINTF( buffer, bufferSize, "%u", v );
+    TIXML_SNPRINTF( buffer, bufferSize, "%u", v );
 }
 
 
 void XMLUtil::ToStr( bool v, char* buffer, int bufferSize )
 {
-	TIXML_SNPRINTF( buffer, bufferSize, "%d", v ? 1 : 0 );
+    TIXML_SNPRINTF( buffer, bufferSize, "%d", v ? 1 : 0 );
 }
 
 
 void XMLUtil::ToStr( float v, char* buffer, int bufferSize )
 {
-	TIXML_SNPRINTF( buffer, bufferSize, "%g", v );
+    TIXML_SNPRINTF( buffer, bufferSize, "%g", v );
 }
 
 
 void XMLUtil::ToStr( double v, char* buffer, int bufferSize )
 {
-	TIXML_SNPRINTF( buffer, bufferSize, "%g", v );
+    TIXML_SNPRINTF( buffer, bufferSize, "%g", v );
 }
 
 
 bool XMLUtil::ToInt( const char* str, int* value )
 {
-	if ( TIXML_SSCANF( str, "%d", value ) == 1 )
-		return true;
-	return false;
+    if ( TIXML_SSCANF( str, "%d", value ) == 1 ) {
+        return true;
+    }
+    return false;
 }
 
 bool XMLUtil::ToUnsigned( const char* str, unsigned *value )
 {
-	if ( TIXML_SSCANF( str, "%u", value ) == 1 )
-		return true;
-	return false;
+    if ( TIXML_SSCANF( str, "%u", value ) == 1 ) {
+        return true;
+    }
+    return false;
 }
 
 bool XMLUtil::ToBool( const char* str, bool* value )
 {
-	int ival = 0;
-	if ( ToInt( str, &ival )) {
-		*value = (ival==0) ? false : true;
-		return true;
-	}
-	if ( StringEqual( str, "true" ) ) {
-		*value = true;
-		return true;
-	}
-	else if ( StringEqual( str, "false" ) ) {
-		*value = false;
-		return true;
-	}
-	return false;
+    int ival = 0;
+    if ( ToInt( str, &ival )) {
+        *value = (ival==0) ? false : true;
+        return true;
+    }
+    if ( StringEqual( str, "true" ) ) {
+        *value = true;
+        return true;
+    }
+    else if ( StringEqual( str, "false" ) ) {
+        *value = false;
+        return true;
+    }
+    return false;
 }
 
 
 bool XMLUtil::ToFloat( const char* str, float* value )
 {
-	if ( TIXML_SSCANF( str, "%f", value ) == 1 ) {
-		return true;
-	}
-	return false;
+    if ( TIXML_SSCANF( str, "%f", value ) == 1 ) {
+        return true;
+    }
+    return false;
 }
 
 bool XMLUtil::ToDouble( const char* str, double* value )
 {
-	if ( TIXML_SSCANF( str, "%lf", value ) == 1 ) {
-		return true;
-	}
-	return false;
+    if ( TIXML_SSCANF( str, "%lf", value ) == 1 ) {
+        return true;
+    }
+    return false;
 }
 
 
 char* XMLDocument::Identify( char* p, XMLNode** node )
 {
-	XMLNode* returnNode = 0;
-	char* start = p;
-	p = XMLUtil::SkipWhiteSpace( p );
-	if( !p || !*p )
-	{
-		return p;
-	}
+    XMLNode* returnNode = 0;
+    char* start = p;
+    p = XMLUtil::SkipWhiteSpace( p );
+    if( !p || !*p ) {
+        return p;
+    }
 
-	// What is this thing?
-	// - Elements start with a letter or underscore, but xml is reserved.
-	// - Comments: <!--
-	// - Decleration: <?
-	// - Everthing else is unknown to tinyxml.
-	//
+    // What is this thing?
+    // - Elements start with a letter or underscore, but xml is reserved.
+    // - Comments: <!--
+    // - Decleration: <?
+    // - Everthing else is unknown to tinyxml.
+    //
 
-	static const char* xmlHeader		= { "<?" };
-	static const char* commentHeader	= { "<!--" };
-	static const char* dtdHeader		= { "<!" };
-	static const char* cdataHeader		= { "<![CDATA[" };
-	static const char* elementHeader	= { "<" };	// and a header for everything else; check last.
+    static const char* xmlHeader		= { "<?" };
+    static const char* commentHeader	= { "<!--" };
+    static const char* dtdHeader		= { "<!" };
+    static const char* cdataHeader		= { "<![CDATA[" };
+    static const char* elementHeader	= { "<" };	// and a header for everything else; check last.
 
-	static const int xmlHeaderLen		= 2;
-	static const int commentHeaderLen	= 4;
-	static const int dtdHeaderLen		= 2;
-	static const int cdataHeaderLen		= 9;
-	static const int elementHeaderLen	= 1;
+    static const int xmlHeaderLen		= 2;
+    static const int commentHeaderLen	= 4;
+    static const int dtdHeaderLen		= 2;
+    static const int cdataHeaderLen		= 9;
+    static const int elementHeaderLen	= 1;
 
 #if defined(_MSC_VER)
 #pragma warning ( push )
 #pragma warning ( disable : 4127 )
 #endif
-	TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLUnknown ) );		// use same memory pool
-	TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLDeclaration ) );	// use same memory pool
+    TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLUnknown ) );		// use same memory pool
+    TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLDeclaration ) );	// use same memory pool
 #if defined(_MSC_VER)
 #pragma warning (pop)
 #endif
-	if ( XMLUtil::StringEqual( p, xmlHeader, xmlHeaderLen ) ) {
-		returnNode = new (commentPool.Alloc()) XMLDeclaration( this );
-		returnNode->memPool = &commentPool;
-		p += xmlHeaderLen;
-	}
-	else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) {
-		returnNode = new (commentPool.Alloc()) XMLComment( this );
-		returnNode->memPool = &commentPool;
-		p += commentHeaderLen;
-	}
-	else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) {
-		XMLText* text = new (textPool.Alloc()) XMLText( this );
-		returnNode = text;
-		returnNode->memPool = &textPool;
-		p += cdataHeaderLen;
-		text->SetCData( true );
-	}
-	else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) {
-		returnNode = new (commentPool.Alloc()) XMLUnknown( this );
-		returnNode->memPool = &commentPool;
-		p += dtdHeaderLen;
-	}
-	else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) {
-		returnNode = new (elementPool.Alloc()) XMLElement( this );
-		returnNode->memPool = &elementPool;
-		p += elementHeaderLen;
-	}
-	else {
-		returnNode = new (textPool.Alloc()) XMLText( this );
-		returnNode->memPool = &textPool;
-		p = start;	// Back it up, all the text counts.
-	}
+    if ( XMLUtil::StringEqual( p, xmlHeader, xmlHeaderLen ) ) {
+        returnNode = new (commentPool.Alloc()) XMLDeclaration( this );
+        returnNode->memPool = &commentPool;
+        p += xmlHeaderLen;
+    }
+    else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) {
+        returnNode = new (commentPool.Alloc()) XMLComment( this );
+        returnNode->memPool = &commentPool;
+        p += commentHeaderLen;
+    }
+    else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) {
+        XMLText* text = new (textPool.Alloc()) XMLText( this );
+        returnNode = text;
+        returnNode->memPool = &textPool;
+        p += cdataHeaderLen;
+        text->SetCData( true );
+    }
+    else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) {
+        returnNode = new (commentPool.Alloc()) XMLUnknown( this );
+        returnNode->memPool = &commentPool;
+        p += dtdHeaderLen;
+    }
+    else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) {
+        returnNode = new (elementPool.Alloc()) XMLElement( this );
+        returnNode->memPool = &elementPool;
+        p += elementHeaderLen;
+    }
+    else {
+        returnNode = new (textPool.Alloc()) XMLText( this );
+        returnNode->memPool = &textPool;
+        p = start;	// Back it up, all the text counts.
+    }
 
-	*node = returnNode;
-	return p;
+    *node = returnNode;
+    return p;
 }
 
 
 bool XMLDocument::Accept( XMLVisitor* visitor ) const
 {
-	if ( visitor->VisitEnter( *this ) )
-	{
-		for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() )
-		{
-			if ( !node->Accept( visitor ) )
-				break;
-		}
-	}
-	return visitor->VisitExit( *this );
+    if ( visitor->VisitEnter( *this ) ) {
+        for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) {
+            if ( !node->Accept( visitor ) ) {
+                break;
+            }
+        }
+    }
+    return visitor->VisitExit( *this );
 }
 
 
 // --------- XMLNode ----------- //
 
 XMLNode::XMLNode( XMLDocument* doc ) :
-	document( doc ),
-	parent( 0 ),
-	firstChild( 0 ), lastChild( 0 ),
-	prev( 0 ), next( 0 )
+    document( doc ),
+    parent( 0 ),
+    firstChild( 0 ), lastChild( 0 ),
+    prev( 0 ), next( 0 )
 {
 }
 
 
 XMLNode::~XMLNode()
 {
-	DeleteChildren();
-	if ( parent ) {
-		parent->Unlink( this );
-	}
+    DeleteChildren();
+    if ( parent ) {
+        parent->Unlink( this );
+    }
 }
 
 
 void XMLNode::SetValue( const char* str, bool staticMem )
 {
-	if ( staticMem )
-		value.SetInternedStr( str );
-	else
-		value.SetStr( str );
+    if ( staticMem ) {
+        value.SetInternedStr( str );
+    }
+    else {
+        value.SetStr( str );
+    }
 }
 
 
 void XMLNode::DeleteChildren()
 {
-	while( firstChild ) {
-		XMLNode* node = firstChild;
-		Unlink( node );
+    while( firstChild ) {
+        XMLNode* node = firstChild;
+        Unlink( node );
 
-		DELETE_NODE( node );
-	}
-	firstChild = lastChild = 0;
+        DELETE_NODE( node );
+    }
+    firstChild = lastChild = 0;
 }
 
 
 void XMLNode::Unlink( XMLNode* child )
 {
-	TIXMLASSERT( child->parent == this );
-	if ( child == firstChild )
-		firstChild = firstChild->next;
-	if ( child == lastChild )
-		lastChild = lastChild->prev;
+    TIXMLASSERT( child->parent == this );
+    if ( child == firstChild ) {
+        firstChild = firstChild->next;
+    }
+    if ( child == lastChild ) {
+        lastChild = lastChild->prev;
+    }
 
-	if ( child->prev ) {
-		child->prev->next = child->next;
-	}
-	if ( child->next ) {
-		child->next->prev = child->prev;
-	}
-	child->parent = 0;
+    if ( child->prev ) {
+        child->prev->next = child->next;
+    }
+    if ( child->next ) {
+        child->next->prev = child->prev;
+    }
+    child->parent = 0;
 }
 
 
 void XMLNode::DeleteChild( XMLNode* node )
 {
-	TIXMLASSERT( node->parent == this );
-	DELETE_NODE( node );
+    TIXMLASSERT( node->parent == this );
+    DELETE_NODE( node );
 }
 
 
 XMLNode* XMLNode::InsertEndChild( XMLNode* addThis )
 {
-	if ( lastChild ) {
-		TIXMLASSERT( firstChild );
-		TIXMLASSERT( lastChild->next == 0 );
-		lastChild->next = addThis;
-		addThis->prev = lastChild;
-		lastChild = addThis;
+    if ( lastChild ) {
+        TIXMLASSERT( firstChild );
+        TIXMLASSERT( lastChild->next == 0 );
+        lastChild->next = addThis;
+        addThis->prev = lastChild;
+        lastChild = addThis;
 
-		addThis->next = 0;
-	}
-	else {
-		TIXMLASSERT( firstChild == 0 );
-		firstChild = lastChild = addThis;
+        addThis->next = 0;
+    }
+    else {
+        TIXMLASSERT( firstChild == 0 );
+        firstChild = lastChild = addThis;
 
-		addThis->prev = 0;
-		addThis->next = 0;
-	}
-	addThis->parent = this;
-	return addThis;
+        addThis->prev = 0;
+        addThis->next = 0;
+    }
+    addThis->parent = this;
+    return addThis;
 }
 
 
 XMLNode* XMLNode::InsertFirstChild( XMLNode* addThis )
 {
-	if ( firstChild ) {
-		TIXMLASSERT( lastChild );
-		TIXMLASSERT( firstChild->prev == 0 );
+    if ( firstChild ) {
+        TIXMLASSERT( lastChild );
+        TIXMLASSERT( firstChild->prev == 0 );
 
-		firstChild->prev = addThis;
-		addThis->next = firstChild;
-		firstChild = addThis;
+        firstChild->prev = addThis;
+        addThis->next = firstChild;
+        firstChild = addThis;
 
-		addThis->prev = 0;
-	}
-	else {
-		TIXMLASSERT( lastChild == 0 );
-		firstChild = lastChild = addThis;
+        addThis->prev = 0;
+    }
+    else {
+        TIXMLASSERT( lastChild == 0 );
+        firstChild = lastChild = addThis;
 
-		addThis->prev = 0;
-		addThis->next = 0;
-	}
-	addThis->parent = this;
-	return addThis;
+        addThis->prev = 0;
+        addThis->next = 0;
+    }
+    addThis->parent = this;
+    return addThis;
 }
 
 
 XMLNode* XMLNode::InsertAfterChild( XMLNode* afterThis, XMLNode* addThis )
 {
-	TIXMLASSERT( afterThis->parent == this );
-	if ( afterThis->parent != this )
-		return 0;
+    TIXMLASSERT( afterThis->parent == this );
+    if ( afterThis->parent != this ) {
+        return 0;
+    }
 
-	if ( afterThis->next == 0 ) {
-		// The last node or the only node.
-		return InsertEndChild( addThis );
-	}
-	addThis->prev = afterThis;
-	addThis->next = afterThis->next;
-	afterThis->next->prev = addThis;
-	afterThis->next = addThis;
-	addThis->parent = this;
-	return addThis;
+    if ( afterThis->next == 0 ) {
+        // The last node or the only node.
+        return InsertEndChild( addThis );
+    }
+    addThis->prev = afterThis;
+    addThis->next = afterThis->next;
+    afterThis->next->prev = addThis;
+    afterThis->next = addThis;
+    addThis->parent = this;
+    return addThis;
 }
 
 
@@ -702,183 +718,182 @@
 
 const XMLElement* XMLNode::FirstChildElement( const char* value ) const
 {
-	for( XMLNode* node=firstChild; node; node=node->next ) {
-		XMLElement* element = node->ToElement();
-		if ( element ) {
-			if ( !value || XMLUtil::StringEqual( element->Name(), value ) ) {
-				return element;
-			}
-		}
-	}
-	return 0;
+    for( XMLNode* node=firstChild; node; node=node->next ) {
+        XMLElement* element = node->ToElement();
+        if ( element ) {
+            if ( !value || XMLUtil::StringEqual( element->Name(), value ) ) {
+                return element;
+            }
+        }
+    }
+    return 0;
 }
 
 
 const XMLElement* XMLNode::LastChildElement( const char* value ) const
 {
-	for( XMLNode* node=lastChild; node; node=node->prev ) {
-		XMLElement* element = node->ToElement();
-		if ( element ) {
-			if ( !value || XMLUtil::StringEqual( element->Name(), value ) ) {
-				return element;
-			}
-		}
-	}
-	return 0;
+    for( XMLNode* node=lastChild; node; node=node->prev ) {
+        XMLElement* element = node->ToElement();
+        if ( element ) {
+            if ( !value || XMLUtil::StringEqual( element->Name(), value ) ) {
+                return element;
+            }
+        }
+    }
+    return 0;
 }
 
 
 const XMLElement* XMLNode::NextSiblingElement( const char* value ) const
 {
-	for( XMLNode* element=this->next; element; element = element->next ) {
-		if (    element->ToElement()
-			 && (!value || XMLUtil::StringEqual( value, element->Value() )))
-		{
-			return element->ToElement();
-		}
-	}
-	return 0;
+    for( XMLNode* element=this->next; element; element = element->next ) {
+        if (    element->ToElement()
+                && (!value || XMLUtil::StringEqual( value, element->Value() ))) {
+            return element->ToElement();
+        }
+    }
+    return 0;
 }
 
 
 const XMLElement* XMLNode::PreviousSiblingElement( const char* value ) const
 {
-	for( XMLNode* element=this->prev; element; element = element->prev ) {
-		if (    element->ToElement()
-			 && (!value || XMLUtil::StringEqual( value, element->Value() )))
-		{
-			return element->ToElement();
-		}
-	}
-	return 0;
+    for( XMLNode* element=this->prev; element; element = element->prev ) {
+        if (    element->ToElement()
+                && (!value || XMLUtil::StringEqual( value, element->Value() ))) {
+            return element->ToElement();
+        }
+    }
+    return 0;
 }
 
 
 char* XMLNode::ParseDeep( char* p, StrPair* parentEnd )
 {
-	// This is a recursive method, but thinking about it "at the current level"
-	// it is a pretty simple flat list:
-	//		<foo/>
-	//		<!-- comment -->
-	//
-	// With a special case:
-	//		<foo>
-	//		</foo>
-	//		<!-- comment -->
-	//
-	// Where the closing element (/foo) *must* be the next thing after the opening
-	// element, and the names must match. BUT the tricky bit is that the closing
-	// element will be read by the child.
-	//
-	// 'endTag' is the end tag for this node, it is returned by a call to a child.
-	// 'parentEnd' is the end tag for the parent, which is filled in and returned.
+    // This is a recursive method, but thinking about it "at the current level"
+    // it is a pretty simple flat list:
+    //		<foo/>
+    //		<!-- comment -->
+    //
+    // With a special case:
+    //		<foo>
+    //		</foo>
+    //		<!-- comment -->
+    //
+    // Where the closing element (/foo) *must* be the next thing after the opening
+    // element, and the names must match. BUT the tricky bit is that the closing
+    // element will be read by the child.
+    //
+    // 'endTag' is the end tag for this node, it is returned by a call to a child.
+    // 'parentEnd' is the end tag for the parent, which is filled in and returned.
 
-	while( p && *p ) {
-		XMLNode* node = 0;
+    while( p && *p ) {
+        XMLNode* node = 0;
 
-		p = document->Identify( p, &node );
-		if ( p == 0 || node == 0 ) {
-			break;
-		}
+        p = document->Identify( p, &node );
+        if ( p == 0 || node == 0 ) {
+            break;
+        }
 
-		StrPair endTag;
-		p = node->ParseDeep( p, &endTag );
-		if ( !p ) {
-			DELETE_NODE( node );
-			node = 0;
-			if ( !document->Error() ) {
-				document->SetError( XML_ERROR_PARSING, 0, 0 );
-			}
-			break;
-		}
+        StrPair endTag;
+        p = node->ParseDeep( p, &endTag );
+        if ( !p ) {
+            DELETE_NODE( node );
+            node = 0;
+            if ( !document->Error() ) {
+                document->SetError( XML_ERROR_PARSING, 0, 0 );
+            }
+            break;
+        }
 
-		// We read the end tag. Return it to the parent.
-		if ( node->ToElement() && node->ToElement()->ClosingType() == XMLElement::CLOSING ) {
-			if ( parentEnd ) {
-				*parentEnd = static_cast<XMLElement*>(node)->value;
-			}
-			DELETE_NODE( node );
-			return p;
-		}
+        // We read the end tag. Return it to the parent.
+        if ( node->ToElement() && node->ToElement()->ClosingType() == XMLElement::CLOSING ) {
+            if ( parentEnd ) {
+                *parentEnd = static_cast<XMLElement*>(node)->value;
+            }
+            DELETE_NODE( node );
+            return p;
+        }
 
-		// Handle an end tag returned to this level.
-		// And handle a bunch of annoying errors.
-		XMLElement* ele = node->ToElement();
-		if ( ele ) {
-			if ( endTag.Empty() && ele->ClosingType() == XMLElement::OPEN ) {
-				document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
-				p = 0;
-			}
-			else if ( !endTag.Empty() && ele->ClosingType() != XMLElement::OPEN ) {
-				document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
-				p = 0;
-			}
-			else if ( !endTag.Empty() ) {
-				if ( !XMLUtil::StringEqual( endTag.GetStr(), node->Value() )) {
-					document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
-					p = 0;
-				}
-			}
-		}
-		if ( p == 0 ) {
-			DELETE_NODE( node );
-			node = 0;
-		}
-		if ( node ) {
-			this->InsertEndChild( node );
-		}
-	}
-	return 0;
+        // Handle an end tag returned to this level.
+        // And handle a bunch of annoying errors.
+        XMLElement* ele = node->ToElement();
+        if ( ele ) {
+            if ( endTag.Empty() && ele->ClosingType() == XMLElement::OPEN ) {
+                document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
+                p = 0;
+            }
+            else if ( !endTag.Empty() && ele->ClosingType() != XMLElement::OPEN ) {
+                document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
+                p = 0;
+            }
+            else if ( !endTag.Empty() ) {
+                if ( !XMLUtil::StringEqual( endTag.GetStr(), node->Value() )) {
+                    document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
+                    p = 0;
+                }
+            }
+        }
+        if ( p == 0 ) {
+            DELETE_NODE( node );
+            node = 0;
+        }
+        if ( node ) {
+            this->InsertEndChild( node );
+        }
+    }
+    return 0;
 }
 
 // --------- XMLText ---------- //
 char* XMLText::ParseDeep( char* p, StrPair* )
 {
-	const char* start = p;
-	if ( this->CData() ) {
-		p = value.ParseText( p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
-		if ( !p ) {
-			document->SetError( XML_ERROR_PARSING_CDATA, start, 0 );
-		}
-		return p;
-	}
-	else {
-		int flags = document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES;
-		if ( document->WhitespaceMode() == COLLAPSE_WHITESPACE )
-			flags |= StrPair::COLLAPSE_WHITESPACE;
+    const char* start = p;
+    if ( this->CData() ) {
+        p = value.ParseText( p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
+        if ( !p ) {
+            document->SetError( XML_ERROR_PARSING_CDATA, start, 0 );
+        }
+        return p;
+    }
+    else {
+        int flags = document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES;
+        if ( document->WhitespaceMode() == COLLAPSE_WHITESPACE ) {
+            flags |= StrPair::COLLAPSE_WHITESPACE;
+        }
 
-		p = value.ParseText( p, "<", flags );
-		if ( !p ) {
-			document->SetError( XML_ERROR_PARSING_TEXT, start, 0 );
-		}
-		if ( p && *p ) {
-			return p-1;
-		}
-	}
-	return 0;
+        p = value.ParseText( p, "<", flags );
+        if ( !p ) {
+            document->SetError( XML_ERROR_PARSING_TEXT, start, 0 );
+        }
+        if ( p && *p ) {
+            return p-1;
+        }
+    }
+    return 0;
 }
 
 
 XMLNode* XMLText::ShallowClone( XMLDocument* doc ) const
 {
-	if ( !doc ) {
-		doc = document;
-	}
-	XMLText* text = doc->NewText( Value() );	// fixme: this will always allocate memory. Intern?
-	text->SetCData( this->CData() );
-	return text;
+    if ( !doc ) {
+        doc = document;
+    }
+    XMLText* text = doc->NewText( Value() );	// fixme: this will always allocate memory. Intern?
+    text->SetCData( this->CData() );
+    return text;
 }
 
 
 bool XMLText::ShallowEqual( const XMLNode* compare ) const
 {
-	return ( compare->ToText() && XMLUtil::StringEqual( compare->ToText()->Value(), Value() ));
+    return ( compare->ToText() && XMLUtil::StringEqual( compare->ToText()->Value(), Value() ));
 }
 
 
 bool XMLText::Accept( XMLVisitor* visitor ) const
 {
-	return visitor->Visit( *this );
+    return visitor->Visit( *this );
 }
 
 
@@ -891,41 +906,41 @@
 
 XMLComment::~XMLComment()
 {
-	//printf( "~XMLComment\n" );
+    //printf( "~XMLComment\n" );
 }
 
 
 char* XMLComment::ParseDeep( char* p, StrPair* )
 {
-	// Comment parses as text.
-	const char* start = p;
-	p = value.ParseText( p, "-->", StrPair::COMMENT );
-	if ( p == 0 ) {
-		document->SetError( XML_ERROR_PARSING_COMMENT, start, 0 );
-	}
-	return p;
+    // Comment parses as text.
+    const char* start = p;
+    p = value.ParseText( p, "-->", StrPair::COMMENT );
+    if ( p == 0 ) {
+        document->SetError( XML_ERROR_PARSING_COMMENT, start, 0 );
+    }
+    return p;
 }
 
 
 XMLNode* XMLComment::ShallowClone( XMLDocument* doc ) const
 {
-	if ( !doc ) {
-		doc = document;
-	}
-	XMLComment* comment = doc->NewComment( Value() );	// fixme: this will always allocate memory. Intern?
-	return comment;
+    if ( !doc ) {
+        doc = document;
+    }
+    XMLComment* comment = doc->NewComment( Value() );	// fixme: this will always allocate memory. Intern?
+    return comment;
 }
 
 
 bool XMLComment::ShallowEqual( const XMLNode* compare ) const
 {
-	return ( compare->ToComment() && XMLUtil::StringEqual( compare->ToComment()->Value(), Value() ));
+    return ( compare->ToComment() && XMLUtil::StringEqual( compare->ToComment()->Value(), Value() ));
 }
 
 
 bool XMLComment::Accept( XMLVisitor* visitor ) const
 {
-	return visitor->Visit( *this );
+    return visitor->Visit( *this );
 }
 
 
@@ -938,42 +953,42 @@
 
 XMLDeclaration::~XMLDeclaration()
 {
-	//printf( "~XMLDeclaration\n" );
+    //printf( "~XMLDeclaration\n" );
 }
 
 
 char* XMLDeclaration::ParseDeep( char* p, StrPair* )
 {
-	// Declaration parses as text.
-	const char* start = p;
-	p = value.ParseText( p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
-	if ( p == 0 ) {
-		document->SetError( XML_ERROR_PARSING_DECLARATION, start, 0 );
-	}
-	return p;
+    // Declaration parses as text.
+    const char* start = p;
+    p = value.ParseText( p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
+    if ( p == 0 ) {
+        document->SetError( XML_ERROR_PARSING_DECLARATION, start, 0 );
+    }
+    return p;
 }
 
 
 XMLNode* XMLDeclaration::ShallowClone( XMLDocument* doc ) const
 {
-	if ( !doc ) {
-		doc = document;
-	}
-	XMLDeclaration* dec = doc->NewDeclaration( Value() );	// fixme: this will always allocate memory. Intern?
-	return dec;
+    if ( !doc ) {
+        doc = document;
+    }
+    XMLDeclaration* dec = doc->NewDeclaration( Value() );	// fixme: this will always allocate memory. Intern?
+    return dec;
 }
 
 
 bool XMLDeclaration::ShallowEqual( const XMLNode* compare ) const
 {
-	return ( compare->ToDeclaration() && XMLUtil::StringEqual( compare->ToDeclaration()->Value(), Value() ));
+    return ( compare->ToDeclaration() && XMLUtil::StringEqual( compare->ToDeclaration()->Value(), Value() ));
 }
 
 
 
 bool XMLDeclaration::Accept( XMLVisitor* visitor ) const
 {
-	return visitor->Visit( *this );
+    return visitor->Visit( *this );
 }
 
 // --------- XMLUnknown ---------- //
@@ -990,377 +1005,390 @@
 
 char* XMLUnknown::ParseDeep( char* p, StrPair* )
 {
-	// Unknown parses as text.
-	const char* start = p;
+    // Unknown parses as text.
+    const char* start = p;
 
-	p = value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION );
-	if ( !p ) {
-		document->SetError( XML_ERROR_PARSING_UNKNOWN, start, 0 );
-	}
-	return p;
+    p = value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION );
+    if ( !p ) {
+        document->SetError( XML_ERROR_PARSING_UNKNOWN, start, 0 );
+    }
+    return p;
 }
 
 
 XMLNode* XMLUnknown::ShallowClone( XMLDocument* doc ) const
 {
-	if ( !doc ) {
-		doc = document;
-	}
-	XMLUnknown* text = doc->NewUnknown( Value() );	// fixme: this will always allocate memory. Intern?
-	return text;
+    if ( !doc ) {
+        doc = document;
+    }
+    XMLUnknown* text = doc->NewUnknown( Value() );	// fixme: this will always allocate memory. Intern?
+    return text;
 }
 
 
 bool XMLUnknown::ShallowEqual( const XMLNode* compare ) const
 {
-	return ( compare->ToUnknown() && XMLUtil::StringEqual( compare->ToUnknown()->Value(), Value() ));
+    return ( compare->ToUnknown() && XMLUtil::StringEqual( compare->ToUnknown()->Value(), Value() ));
 }
 
 
 bool XMLUnknown::Accept( XMLVisitor* visitor ) const
 {
-	return visitor->Visit( *this );
+    return visitor->Visit( *this );
 }
 
 // --------- XMLAttribute ---------- //
 char* XMLAttribute::ParseDeep( char* p, bool processEntities )
 {
-	// Parse using the name rules: bug fix, was using ParseText before
-	p = name.ParseName( p );
-	if ( !p || !*p ) return 0;
+    // Parse using the name rules: bug fix, was using ParseText before
+    p = name.ParseName( p );
+    if ( !p || !*p ) {
+        return 0;
+    }
 
-	// Skip white space before =
-	p = XMLUtil::SkipWhiteSpace( p );
-	if ( !p || *p != '=' ) return 0;
+    // Skip white space before =
+    p = XMLUtil::SkipWhiteSpace( p );
+    if ( !p || *p != '=' ) {
+        return 0;
+    }
 
-	++p;	// move up to opening quote
-	p = XMLUtil::SkipWhiteSpace( p );
-	if ( *p != '\"' && *p != '\'' ) return 0;
+    ++p;	// move up to opening quote
+    p = XMLUtil::SkipWhiteSpace( p );
+    if ( *p != '\"' && *p != '\'' ) {
+        return 0;
+    }
 
-	char endTag[2] = { *p, 0 };
-	++p;	// move past opening quote
+    char endTag[2] = { *p, 0 };
+    ++p;	// move past opening quote
 
-	p = value.ParseText( p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES );
-	return p;
+    p = value.ParseText( p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES );
+    return p;
 }
 
 
 void XMLAttribute::SetName( const char* n )
 {
-	name.SetStr( n );
+    name.SetStr( n );
 }
 
 
 int XMLAttribute::QueryIntValue( int* value ) const
 {
-	if ( XMLUtil::ToInt( Value(), value ))
-		return XML_NO_ERROR;
-	return XML_WRONG_ATTRIBUTE_TYPE;
+    if ( XMLUtil::ToInt( Value(), value )) {
+        return XML_NO_ERROR;
+    }
+    return XML_WRONG_ATTRIBUTE_TYPE;
 }
 
 
 int XMLAttribute::QueryUnsignedValue( unsigned int* value ) const
 {
-	if ( XMLUtil::ToUnsigned( Value(), value ))
-		return XML_NO_ERROR;
-	return XML_WRONG_ATTRIBUTE_TYPE;
+    if ( XMLUtil::ToUnsigned( Value(), value )) {
+        return XML_NO_ERROR;
+    }
+    return XML_WRONG_ATTRIBUTE_TYPE;
 }
 
 
 int XMLAttribute::QueryBoolValue( bool* value ) const
 {
-	if ( XMLUtil::ToBool( Value(), value )) {
-		return XML_NO_ERROR;
-	}
-	return XML_WRONG_ATTRIBUTE_TYPE;
+    if ( XMLUtil::ToBool( Value(), value )) {
+        return XML_NO_ERROR;
+    }
+    return XML_WRONG_ATTRIBUTE_TYPE;
 }
 
 
 int XMLAttribute::QueryFloatValue( float* value ) const
 {
-	if ( XMLUtil::ToFloat( Value(), value ))
-		return XML_NO_ERROR;
-	return XML_WRONG_ATTRIBUTE_TYPE;
+    if ( XMLUtil::ToFloat( Value(), value )) {
+        return XML_NO_ERROR;
+    }
+    return XML_WRONG_ATTRIBUTE_TYPE;
 }
 
 
 int XMLAttribute::QueryDoubleValue( double* value ) const
 {
-	if ( XMLUtil::ToDouble( Value(), value ))
-		return XML_NO_ERROR;
-	return XML_WRONG_ATTRIBUTE_TYPE;
+    if ( XMLUtil::ToDouble( Value(), value )) {
+        return XML_NO_ERROR;
+    }
+    return XML_WRONG_ATTRIBUTE_TYPE;
 }
 
 
 void XMLAttribute::SetAttribute( const char* v )
 {
-	value.SetStr( v );
+    value.SetStr( v );
 }
 
 
 void XMLAttribute::SetAttribute( int v )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( v, buf, BUF_SIZE );
-	value.SetStr( buf );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( v, buf, BUF_SIZE );
+    value.SetStr( buf );
 }
 
 
 void XMLAttribute::SetAttribute( unsigned v )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( v, buf, BUF_SIZE );
-	value.SetStr( buf );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( v, buf, BUF_SIZE );
+    value.SetStr( buf );
 }
 
 
 void XMLAttribute::SetAttribute( bool v )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( v, buf, BUF_SIZE );
-	value.SetStr( buf );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( v, buf, BUF_SIZE );
+    value.SetStr( buf );
 }
 
 void XMLAttribute::SetAttribute( double v )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( v, buf, BUF_SIZE );
-	value.SetStr( buf );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( v, buf, BUF_SIZE );
+    value.SetStr( buf );
 }
 
 void XMLAttribute::SetAttribute( float v )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( v, buf, BUF_SIZE );
-	value.SetStr( buf );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( v, buf, BUF_SIZE );
+    value.SetStr( buf );
 }
 
 
 // --------- XMLElement ---------- //
 XMLElement::XMLElement( XMLDocument* doc ) : XMLNode( doc ),
-	closingType( 0 ),
-	rootAttribute( 0 )
+    closingType( 0 ),
+    rootAttribute( 0 )
 {
 }
 
 
 XMLElement::~XMLElement()
 {
-	while( rootAttribute ) {
-		XMLAttribute* next = rootAttribute->next;
-		DELETE_ATTRIBUTE( rootAttribute );
-		rootAttribute = next;
-	}
+    while( rootAttribute ) {
+        XMLAttribute* next = rootAttribute->next;
+        DELETE_ATTRIBUTE( rootAttribute );
+        rootAttribute = next;
+    }
 }
 
 
 XMLAttribute* XMLElement::FindAttribute( const char* name )
 {
-	XMLAttribute* a = 0;
-	for( a=rootAttribute; a; a = a->next ) {
-		if ( XMLUtil::StringEqual( a->Name(), name ) )
-			return a;
-	}
-	return 0;
+    XMLAttribute* a = 0;
+    for( a=rootAttribute; a; a = a->next ) {
+        if ( XMLUtil::StringEqual( a->Name(), name ) ) {
+            return a;
+        }
+    }
+    return 0;
 }
 
 
 const XMLAttribute* XMLElement::FindAttribute( const char* name ) const
 {
-	XMLAttribute* a = 0;
-	for( a=rootAttribute; a; a = a->next ) {
-		if ( XMLUtil::StringEqual( a->Name(), name ) )
-			return a;
-	}
-	return 0;
+    XMLAttribute* a = 0;
+    for( a=rootAttribute; a; a = a->next ) {
+        if ( XMLUtil::StringEqual( a->Name(), name ) ) {
+            return a;
+        }
+    }
+    return 0;
 }
 
 
 const char* XMLElement::Attribute( const char* name, const char* value ) const
 {
-	const XMLAttribute* a = FindAttribute( name );
-	if ( !a )
-		return 0;
-	if ( !value || XMLUtil::StringEqual( a->Value(), value ))
-		return a->Value();
-	return 0;
+    const XMLAttribute* a = FindAttribute( name );
+    if ( !a ) {
+        return 0;
+    }
+    if ( !value || XMLUtil::StringEqual( a->Value(), value )) {
+        return a->Value();
+    }
+    return 0;
 }
 
 
 const char* XMLElement::GetText() const
 {
-	if ( FirstChild() && FirstChild()->ToText() ) {
-		return FirstChild()->ToText()->Value();
-	}
-	return 0;
+    if ( FirstChild() && FirstChild()->ToText() ) {
+        return FirstChild()->ToText()->Value();
+    }
+    return 0;
 }
 
 
 int XMLElement::QueryIntText( int* _value ) const
 {
-	if ( FirstChild() && FirstChild()->ToText() ) {
-		const char* t = FirstChild()->ToText()->Value();
-		if ( XMLUtil::ToInt( t, _value ) ) {
-			return XML_SUCCESS;
-		}
-		return XML_CAN_NOT_CONVERT_TEXT;
-	}
-	return XML_NO_TEXT_NODE;
+    if ( FirstChild() && FirstChild()->ToText() ) {
+        const char* t = FirstChild()->ToText()->Value();
+        if ( XMLUtil::ToInt( t, _value ) ) {
+            return XML_SUCCESS;
+        }
+        return XML_CAN_NOT_CONVERT_TEXT;
+    }
+    return XML_NO_TEXT_NODE;
 }
 
 
 int XMLElement::QueryUnsignedText( unsigned* _value ) const
 {
-	if ( FirstChild() && FirstChild()->ToText() ) {
-		const char* t = FirstChild()->ToText()->Value();
-		if ( XMLUtil::ToUnsigned( t, _value ) ) {
-			return XML_SUCCESS;
-		}
-		return XML_CAN_NOT_CONVERT_TEXT;
-	}
-	return XML_NO_TEXT_NODE;
+    if ( FirstChild() && FirstChild()->ToText() ) {
+        const char* t = FirstChild()->ToText()->Value();
+        if ( XMLUtil::ToUnsigned( t, _value ) ) {
+            return XML_SUCCESS;
+        }
+        return XML_CAN_NOT_CONVERT_TEXT;
+    }
+    return XML_NO_TEXT_NODE;
 }
 
 
 int XMLElement::QueryBoolText( bool* _value ) const
 {
-	if ( FirstChild() && FirstChild()->ToText() ) {
-		const char* t = FirstChild()->ToText()->Value();
-		if ( XMLUtil::ToBool( t, _value ) ) {
-			return XML_SUCCESS;
-		}
-		return XML_CAN_NOT_CONVERT_TEXT;
-	}
-	return XML_NO_TEXT_NODE;
+    if ( FirstChild() && FirstChild()->ToText() ) {
+        const char* t = FirstChild()->ToText()->Value();
+        if ( XMLUtil::ToBool( t, _value ) ) {
+            return XML_SUCCESS;
+        }
+        return XML_CAN_NOT_CONVERT_TEXT;
+    }
+    return XML_NO_TEXT_NODE;
 }
 
 
 int XMLElement::QueryDoubleText( double* _value ) const
 {
-	if ( FirstChild() && FirstChild()->ToText() ) {
-		const char* t = FirstChild()->ToText()->Value();
-		if ( XMLUtil::ToDouble( t, _value ) ) {
-			return XML_SUCCESS;
-		}
-		return XML_CAN_NOT_CONVERT_TEXT;
-	}
-	return XML_NO_TEXT_NODE;
+    if ( FirstChild() && FirstChild()->ToText() ) {
+        const char* t = FirstChild()->ToText()->Value();
+        if ( XMLUtil::ToDouble( t, _value ) ) {
+            return XML_SUCCESS;
+        }
+        return XML_CAN_NOT_CONVERT_TEXT;
+    }
+    return XML_NO_TEXT_NODE;
 }
 
 
 int XMLElement::QueryFloatText( float* _value ) const
 {
-	if ( FirstChild() && FirstChild()->ToText() ) {
-		const char* t = FirstChild()->ToText()->Value();
-		if ( XMLUtil::ToFloat( t, _value ) ) {
-			return XML_SUCCESS;
-		}
-		return XML_CAN_NOT_CONVERT_TEXT;
-	}
-	return XML_NO_TEXT_NODE;
+    if ( FirstChild() && FirstChild()->ToText() ) {
+        const char* t = FirstChild()->ToText()->Value();
+        if ( XMLUtil::ToFloat( t, _value ) ) {
+            return XML_SUCCESS;
+        }
+        return XML_CAN_NOT_CONVERT_TEXT;
+    }
+    return XML_NO_TEXT_NODE;
 }
 
 
 
 XMLAttribute* XMLElement::FindOrCreateAttribute( const char* name )
 {
-	XMLAttribute* last = 0;
-	XMLAttribute* attrib = 0;
-	for( attrib = rootAttribute;
-		 attrib;
-		 last = attrib, attrib = attrib->next )
-	{
-		if ( XMLUtil::StringEqual( attrib->Name(), name ) ) {
-			break;
-		}
-	}
-	if ( !attrib ) {
-		attrib = new (document->attributePool.Alloc() ) XMLAttribute();
-		attrib->memPool = &document->attributePool;
-		if ( last ) {
-			last->next = attrib;
-		}
-		else {
-			rootAttribute = attrib;
-		}
-		attrib->SetName( name );
-	}
-	return attrib;
+    XMLAttribute* last = 0;
+    XMLAttribute* attrib = 0;
+    for( attrib = rootAttribute;
+            attrib;
+            last = attrib, attrib = attrib->next ) {
+        if ( XMLUtil::StringEqual( attrib->Name(), name ) ) {
+            break;
+        }
+    }
+    if ( !attrib ) {
+        attrib = new (document->attributePool.Alloc() ) XMLAttribute();
+        attrib->memPool = &document->attributePool;
+        if ( last ) {
+            last->next = attrib;
+        }
+        else {
+            rootAttribute = attrib;
+        }
+        attrib->SetName( name );
+    }
+    return attrib;
 }
 
 
 void XMLElement::DeleteAttribute( const char* name )
 {
-	XMLAttribute* prev = 0;
-	for( XMLAttribute* a=rootAttribute; a; a=a->next ) {
-		if ( XMLUtil::StringEqual( name, a->Name() ) ) {
-			if ( prev ) {
-				prev->next = a->next;
-			}
-			else {
-				rootAttribute = a->next;
-			}
-			DELETE_ATTRIBUTE( a );
-			break;
-		}
-		prev = a;
-	}
+    XMLAttribute* prev = 0;
+    for( XMLAttribute* a=rootAttribute; a; a=a->next ) {
+        if ( XMLUtil::StringEqual( name, a->Name() ) ) {
+            if ( prev ) {
+                prev->next = a->next;
+            }
+            else {
+                rootAttribute = a->next;
+            }
+            DELETE_ATTRIBUTE( a );
+            break;
+        }
+        prev = a;
+    }
 }
 
 
 char* XMLElement::ParseAttributes( char* p )
 {
-	const char* start = p;
-	XMLAttribute* prevAttribute = 0;
+    const char* start = p;
+    XMLAttribute* prevAttribute = 0;
 
-	// Read the attributes.
-	while( p ) {
-		p = XMLUtil::SkipWhiteSpace( p );
-		if ( !p || !(*p) ) {
-			document->SetError( XML_ERROR_PARSING_ELEMENT, start, Name() );
-			return 0;
-		}
+    // Read the attributes.
+    while( p ) {
+        p = XMLUtil::SkipWhiteSpace( p );
+        if ( !p || !(*p) ) {
+            document->SetError( XML_ERROR_PARSING_ELEMENT, start, Name() );
+            return 0;
+        }
 
-		// attribute.
-		if ( XMLUtil::IsAlpha( *p ) ) {
-			XMLAttribute* attrib = new (document->attributePool.Alloc() ) XMLAttribute();
-			attrib->memPool = &document->attributePool;
+        // attribute.
+        if ( XMLUtil::IsAlpha( *p ) ) {
+            XMLAttribute* attrib = new (document->attributePool.Alloc() ) XMLAttribute();
+            attrib->memPool = &document->attributePool;
 
-			p = attrib->ParseDeep( p, document->ProcessEntities() );
-			if ( !p || Attribute( attrib->Name() ) ) {
-				DELETE_ATTRIBUTE( attrib );
-				document->SetError( XML_ERROR_PARSING_ATTRIBUTE, start, p );
-				return 0;
-			}
-			// There is a minor bug here: if the attribute in the source xml
-			// document is duplicated, it will not be detected and the
-			// attribute will be doubly added. However, tracking the 'prevAttribute'
-			// avoids re-scanning the attribute list. Preferring performance for
-			// now, may reconsider in the future.
-			if ( prevAttribute ) {
-				prevAttribute->next = attrib;
-			}
-			else {
-				rootAttribute = attrib;
-			}
-			prevAttribute = attrib;
-		}
-		// end of the tag
-		else if ( *p == '/' && *(p+1) == '>' ) {
-			closingType = CLOSED;
-			return p+2;	// done; sealed element.
-		}
-		// end of the tag
-		else if ( *p == '>' ) {
-			++p;
-			break;
-		}
-		else {
-			document->SetError( XML_ERROR_PARSING_ELEMENT, start, p );
-			return 0;
-		}
-	}
-	return p;
+            p = attrib->ParseDeep( p, document->ProcessEntities() );
+            if ( !p || Attribute( attrib->Name() ) ) {
+                DELETE_ATTRIBUTE( attrib );
+                document->SetError( XML_ERROR_PARSING_ATTRIBUTE, start, p );
+                return 0;
+            }
+            // There is a minor bug here: if the attribute in the source xml
+            // document is duplicated, it will not be detected and the
+            // attribute will be doubly added. However, tracking the 'prevAttribute'
+            // avoids re-scanning the attribute list. Preferring performance for
+            // now, may reconsider in the future.
+            if ( prevAttribute ) {
+                prevAttribute->next = attrib;
+            }
+            else {
+                rootAttribute = attrib;
+            }
+            prevAttribute = attrib;
+        }
+        // end of the tag
+        else if ( *p == '/' && *(p+1) == '>' ) {
+            closingType = CLOSED;
+            return p+2;	// done; sealed element.
+        }
+        // end of the tag
+        else if ( *p == '>' ) {
+            ++p;
+            break;
+        }
+        else {
+            document->SetError( XML_ERROR_PARSING_ELEMENT, start, p );
+            return 0;
+        }
+    }
+    return p;
 }
 
 
@@ -1370,346 +1398,351 @@
 //
 char* XMLElement::ParseDeep( char* p, StrPair* strPair )
 {
-	// Read the element name.
-	p = XMLUtil::SkipWhiteSpace( p );
-	if ( !p ) return 0;
+    // Read the element name.
+    p = XMLUtil::SkipWhiteSpace( p );
+    if ( !p ) {
+        return 0;
+    }
 
-	// The closing element is the </element> form. It is
-	// parsed just like a regular element then deleted from
-	// the DOM.
-	if ( *p == '/' ) {
-		closingType = CLOSING;
-		++p;
-	}
+    // The closing element is the </element> form. It is
+    // parsed just like a regular element then deleted from
+    // the DOM.
+    if ( *p == '/' ) {
+        closingType = CLOSING;
+        ++p;
+    }
 
-	p = value.ParseName( p );
-	if ( value.Empty() ) return 0;
+    p = value.ParseName( p );
+    if ( value.Empty() ) {
+        return 0;
+    }
 
-	p = ParseAttributes( p );
-	if ( !p || !*p || closingType )
-		return p;
+    p = ParseAttributes( p );
+    if ( !p || !*p || closingType ) {
+        return p;
+    }
 
-	p = XMLNode::ParseDeep( p, strPair );
-	return p;
+    p = XMLNode::ParseDeep( p, strPair );
+    return p;
 }
 
 
 
 XMLNode* XMLElement::ShallowClone( XMLDocument* doc ) const
 {
-	if ( !doc ) {
-		doc = document;
-	}
-	XMLElement* element = doc->NewElement( Value() );					// fixme: this will always allocate memory. Intern?
-	for( const XMLAttribute* a=FirstAttribute(); a; a=a->Next() ) {
-		element->SetAttribute( a->Name(), a->Value() );					// fixme: this will always allocate memory. Intern?
-	}
-	return element;
+    if ( !doc ) {
+        doc = document;
+    }
+    XMLElement* element = doc->NewElement( Value() );					// fixme: this will always allocate memory. Intern?
+    for( const XMLAttribute* a=FirstAttribute(); a; a=a->Next() ) {
+        element->SetAttribute( a->Name(), a->Value() );					// fixme: this will always allocate memory. Intern?
+    }
+    return element;
 }
 
 
 bool XMLElement::ShallowEqual( const XMLNode* compare ) const
 {
-	const XMLElement* other = compare->ToElement();
-	if ( other && XMLUtil::StringEqual( other->Value(), Value() )) {
+    const XMLElement* other = compare->ToElement();
+    if ( other && XMLUtil::StringEqual( other->Value(), Value() )) {
 
-		const XMLAttribute* a=FirstAttribute();
-		const XMLAttribute* b=other->FirstAttribute();
+        const XMLAttribute* a=FirstAttribute();
+        const XMLAttribute* b=other->FirstAttribute();
 
-		while ( a && b ) {
-			if ( !XMLUtil::StringEqual( a->Value(), b->Value() ) ) {
-				return false;
-			}
-			a = a->Next();
-			b = b->Next();
-		}
-		if ( a || b ) {
-			// different count
-			return false;
-		}
-		return true;
-	}
-	return false;
+        while ( a && b ) {
+            if ( !XMLUtil::StringEqual( a->Value(), b->Value() ) ) {
+                return false;
+            }
+            a = a->Next();
+            b = b->Next();
+        }
+        if ( a || b ) {
+            // different count
+            return false;
+        }
+        return true;
+    }
+    return false;
 }
 
 
 bool XMLElement::Accept( XMLVisitor* visitor ) const
 {
-	if ( visitor->VisitEnter( *this, rootAttribute ) )
-	{
-		for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() )
-		{
-			if ( !node->Accept( visitor ) )
-				break;
-		}
-	}
-	return visitor->VisitExit( *this );
+    if ( visitor->VisitEnter( *this, rootAttribute ) ) {
+        for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) {
+            if ( !node->Accept( visitor ) ) {
+                break;
+            }
+        }
+    }
+    return visitor->VisitExit( *this );
 }
 
 
 // --------- XMLDocument ----------- //
 XMLDocument::XMLDocument( bool _processEntities, Whitespace _whitespace ) :
-	XMLNode( 0 ),
-	writeBOM( false ),
-	processEntities( _processEntities ),
-	errorID( 0 ),
-	whitespace( _whitespace ),
-	errorStr1( 0 ),
-	errorStr2( 0 ),
-	charBuffer( 0 )
+    XMLNode( 0 ),
+    writeBOM( false ),
+    processEntities( _processEntities ),
+    errorID( 0 ),
+    whitespace( _whitespace ),
+    errorStr1( 0 ),
+    errorStr2( 0 ),
+    charBuffer( 0 )
 {
-	document = this;	// avoid warning about 'this' in initializer list
+    document = this;	// avoid warning about 'this' in initializer list
 }
 
 
 XMLDocument::~XMLDocument()
 {
-	DeleteChildren();
-	delete [] charBuffer;
+    DeleteChildren();
+    delete [] charBuffer;
 
 #if 0
-	textPool.Trace( "text" );
-	elementPool.Trace( "element" );
-	commentPool.Trace( "comment" );
-	attributePool.Trace( "attribute" );
+    textPool.Trace( "text" );
+    elementPool.Trace( "element" );
+    commentPool.Trace( "comment" );
+    attributePool.Trace( "attribute" );
 #endif
 
-	TIXMLASSERT( textPool.CurrentAllocs() == 0 );
-	TIXMLASSERT( elementPool.CurrentAllocs() == 0 );
-	TIXMLASSERT( commentPool.CurrentAllocs() == 0 );
-	TIXMLASSERT( attributePool.CurrentAllocs() == 0 );
+    TIXMLASSERT( textPool.CurrentAllocs() == 0 );
+    TIXMLASSERT( elementPool.CurrentAllocs() == 0 );
+    TIXMLASSERT( commentPool.CurrentAllocs() == 0 );
+    TIXMLASSERT( attributePool.CurrentAllocs() == 0 );
 }
 
 
 void XMLDocument::InitDocument()
 {
-	errorID = XML_NO_ERROR;
-	errorStr1 = 0;
-	errorStr2 = 0;
+    errorID = XML_NO_ERROR;
+    errorStr1 = 0;
+    errorStr2 = 0;
 
-	delete [] charBuffer;
-	charBuffer = 0;
+    delete [] charBuffer;
+    charBuffer = 0;
 
 }
 
 
 XMLElement* XMLDocument::NewElement( const char* name )
 {
-	XMLElement* ele = new (elementPool.Alloc()) XMLElement( this );
-	ele->memPool = &elementPool;
-	ele->SetName( name );
-	return ele;
+    XMLElement* ele = new (elementPool.Alloc()) XMLElement( this );
+    ele->memPool = &elementPool;
+    ele->SetName( name );
+    return ele;
 }
 
 
 XMLComment* XMLDocument::NewComment( const char* str )
 {
-	XMLComment* comment = new (commentPool.Alloc()) XMLComment( this );
-	comment->memPool = &commentPool;
-	comment->SetValue( str );
-	return comment;
+    XMLComment* comment = new (commentPool.Alloc()) XMLComment( this );
+    comment->memPool = &commentPool;
+    comment->SetValue( str );
+    return comment;
 }
 
 
 XMLText* XMLDocument::NewText( const char* str )
 {
-	XMLText* text = new (textPool.Alloc()) XMLText( this );
-	text->memPool = &textPool;
-	text->SetValue( str );
-	return text;
+    XMLText* text = new (textPool.Alloc()) XMLText( this );
+    text->memPool = &textPool;
+    text->SetValue( str );
+    return text;
 }
 
 
 XMLDeclaration* XMLDocument::NewDeclaration( const char* str )
 {
-	XMLDeclaration* dec = new (commentPool.Alloc()) XMLDeclaration( this );
-	dec->memPool = &commentPool;
-	dec->SetValue( str ? str : "xml version=\"1.0\" encoding=\"UTF-8\"" );
-	return dec;
+    XMLDeclaration* dec = new (commentPool.Alloc()) XMLDeclaration( this );
+    dec->memPool = &commentPool;
+    dec->SetValue( str ? str : "xml version=\"1.0\" encoding=\"UTF-8\"" );
+    return dec;
 }
 
 
 XMLUnknown* XMLDocument::NewUnknown( const char* str )
 {
-	XMLUnknown* unk = new (commentPool.Alloc()) XMLUnknown( this );
-	unk->memPool = &commentPool;
-	unk->SetValue( str );
-	return unk;
+    XMLUnknown* unk = new (commentPool.Alloc()) XMLUnknown( this );
+    unk->memPool = &commentPool;
+    unk->SetValue( str );
+    return unk;
 }
 
 
 int XMLDocument::LoadFile( const char* filename )
 {
-	DeleteChildren();
-	InitDocument();
-	FILE* fp = 0;
+    DeleteChildren();
+    InitDocument();
+    FILE* fp = 0;
 
-	#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
-		errno_t err = fopen_s(&fp, filename, "rb" );
-		if ( !fp || err) {
-	#else
-		fp = fopen( filename, "rb" );
-		if ( !fp) {
-	#endif
-		SetError( XML_ERROR_FILE_NOT_FOUND, filename, 0 );
-		return errorID;
-	}
-	LoadFile( fp );
-	fclose( fp );
-	return errorID;
+#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
+    errno_t err = fopen_s(&fp, filename, "rb" );
+    if ( !fp || err) {
+#else
+    fp = fopen( filename, "rb" );
+    if ( !fp) {
+#endif
+        SetError( XML_ERROR_FILE_NOT_FOUND, filename, 0 );
+        return errorID;
+    }
+    LoadFile( fp );
+    fclose( fp );
+    return errorID;
 }
 
 
 int XMLDocument::LoadFile( FILE* fp )
 {
-	DeleteChildren();
-	InitDocument();
+    DeleteChildren();
+    InitDocument();
 
-	fseek( fp, 0, SEEK_END );
-	size_t size = ftell( fp );
-	fseek( fp, 0, SEEK_SET );
+    fseek( fp, 0, SEEK_END );
+    size_t size = ftell( fp );
+    fseek( fp, 0, SEEK_SET );
 
-	if ( size == 0 ) {
-		return errorID;
-	}
+    if ( size == 0 ) {
+        return errorID;
+    }
 
-	charBuffer = new char[size+1];
-	size_t read = fread( charBuffer, 1, size, fp );
-	if ( read != size ) {
-		SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 );
-		return errorID;
-	}
+    charBuffer = new char[size+1];
+    size_t read = fread( charBuffer, 1, size, fp );
+    if ( read != size ) {
+        SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 );
+        return errorID;
+    }
 
-	charBuffer[size] = 0;
+    charBuffer[size] = 0;
 
-	const char* p = charBuffer;
-	p = XMLUtil::SkipWhiteSpace( p );
-	p = XMLUtil::ReadBOM( p, &writeBOM );
-	if ( !p || !*p ) {
-		SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
-		return errorID;
-	}
+    const char* p = charBuffer;
+    p = XMLUtil::SkipWhiteSpace( p );
+    p = XMLUtil::ReadBOM( p, &writeBOM );
+    if ( !p || !*p ) {
+        SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
+        return errorID;
+    }
 
-	ParseDeep( charBuffer + (p-charBuffer), 0 );
-	return errorID;
+    ParseDeep( charBuffer + (p-charBuffer), 0 );
+    return errorID;
 }
 
 
 int XMLDocument::SaveFile( const char* filename, bool compact )
 {
-	FILE* fp = 0;
-	#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
-		errno_t err = fopen_s(&fp, filename, "w" );
-		if ( !fp || err) {
-	#else
-		fp = fopen( filename, "w" );
-		if ( !fp) {
-	#endif
-		SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, filename, 0 );
-		return errorID;
-	}
-	SaveFile(fp, compact);
-	fclose( fp );
-	return errorID;
+    FILE* fp = 0;
+#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
+    errno_t err = fopen_s(&fp, filename, "w" );
+    if ( !fp || err) {
+#else
+    fp = fopen( filename, "w" );
+    if ( !fp) {
+#endif
+        SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, filename, 0 );
+        return errorID;
+    }
+    SaveFile(fp, compact);
+    fclose( fp );
+    return errorID;
 }
 
 
 int XMLDocument::SaveFile( FILE* fp, bool compact )
 {
-	XMLPrinter stream( fp, compact );
-	Print( &stream );
-	return errorID;
+    XMLPrinter stream( fp, compact );
+    Print( &stream );
+    return errorID;
 }
 
 
 int XMLDocument::Parse( const char* p, size_t len )
 {
-	DeleteChildren();
-	InitDocument();
+    DeleteChildren();
+    InitDocument();
 
-	if ( !p || !*p ) {
-		SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
-		return errorID;
-	}
-	if ( len == (size_t)(-1) ) {
-		len = strlen( p );
-	}
-	charBuffer = new char[ len+1 ];
-	memcpy( charBuffer, p, len );
-	charBuffer[len] = 0;
+    if ( !p || !*p ) {
+        SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
+        return errorID;
+    }
+    if ( len == (size_t)(-1) ) {
+        len = strlen( p );
+    }
+    charBuffer = new char[ len+1 ];
+    memcpy( charBuffer, p, len );
+    charBuffer[len] = 0;
 
-	p = XMLUtil::SkipWhiteSpace( p );
-	p = XMLUtil::ReadBOM( p, &writeBOM );
-	if ( !p || !*p ) {
-		SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
-		return errorID;
-	}
+    p = XMLUtil::SkipWhiteSpace( p );
+    p = XMLUtil::ReadBOM( p, &writeBOM );
+    if ( !p || !*p ) {
+        SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
+        return errorID;
+    }
 
-	ParseDeep( charBuffer, 0 );
-	return errorID;
+    ParseDeep( charBuffer, 0 );
+    return errorID;
 }
 
 
 void XMLDocument::Print( XMLPrinter* streamer )
 {
-	XMLPrinter stdStreamer( stdout );
-	if ( !streamer )
-		streamer = &stdStreamer;
-	Accept( streamer );
+    XMLPrinter stdStreamer( stdout );
+    if ( !streamer ) {
+        streamer = &stdStreamer;
+    }
+    Accept( streamer );
 }
 
 
 void XMLDocument::SetError( int error, const char* str1, const char* str2 )
 {
-	errorID = error;
-	errorStr1 = str1;
-	errorStr2 = str2;
+    errorID = error;
+    errorStr1 = str1;
+    errorStr2 = str2;
 }
 
 
 void XMLDocument::PrintError() const
 {
-	if ( errorID ) {
-		static const int LEN = 20;
-		char buf1[LEN] = { 0 };
-		char buf2[LEN] = { 0 };
+    if ( errorID ) {
+        static const int LEN = 20;
+        char buf1[LEN] = { 0 };
+        char buf2[LEN] = { 0 };
 
-		if ( errorStr1 ) {
-			TIXML_SNPRINTF( buf1, LEN, "%s", errorStr1 );
-		}
-		if ( errorStr2 ) {
-			TIXML_SNPRINTF( buf2, LEN, "%s", errorStr2 );
-		}
+        if ( errorStr1 ) {
+            TIXML_SNPRINTF( buf1, LEN, "%s", errorStr1 );
+        }
+        if ( errorStr2 ) {
+            TIXML_SNPRINTF( buf2, LEN, "%s", errorStr2 );
+        }
 
-		printf( "XMLDocument error id=%d str1=%s str2=%s\n",
-			    errorID, buf1, buf2 );
-	}
+        printf( "XMLDocument error id=%d str1=%s str2=%s\n",
+                errorID, buf1, buf2 );
+    }
 }
 
 
 XMLPrinter::XMLPrinter( FILE* file, bool compact ) :
-	elementJustOpened( false ),
-	firstElement( true ),
-	fp( file ),
-	depth( 0 ),
-	textDepth( -1 ),
-	processEntities( true ),
-	compactMode( compact )
+    elementJustOpened( false ),
+    firstElement( true ),
+    fp( file ),
+    depth( 0 ),
+    textDepth( -1 ),
+    processEntities( true ),
+    compactMode( compact )
 {
-	for( int i=0; i<ENTITY_RANGE; ++i ) {
-		entityFlag[i] = false;
-		restrictedEntityFlag[i] = false;
-	}
-	for( int i=0; i<NUM_ENTITIES; ++i ) {
-		TIXMLASSERT( entities[i].value < ENTITY_RANGE );
-		if ( entities[i].value < ENTITY_RANGE ) {
-			entityFlag[ (int)entities[i].value ] = true;
-		}
-	}
-	restrictedEntityFlag[(int)'&'] = true;
-	restrictedEntityFlag[(int)'<'] = true;
-	restrictedEntityFlag[(int)'>'] = true;	// not required, but consistency is nice
-	buffer.Push( 0 );
+    for( int i=0; i<ENTITY_RANGE; ++i ) {
+        entityFlag[i] = false;
+        restrictedEntityFlag[i] = false;
+    }
+    for( int i=0; i<NUM_ENTITIES; ++i ) {
+        TIXMLASSERT( entities[i].value < ENTITY_RANGE );
+        if ( entities[i].value < ENTITY_RANGE ) {
+            entityFlag[ (int)entities[i].value ] = true;
+        }
+    }
+    restrictedEntityFlag[(int)'&'] = true;
+    restrictedEntityFlag[(int)'<'] = true;
+    restrictedEntityFlag[(int)'>'] = true;	// not required, but consistency is nice
+    buffer.Push( 0 );
 }
 
 
@@ -1718,335 +1751,337 @@
     va_list     va;
     va_start( va, format );
 
-	if ( fp ) {
-		vfprintf( fp, format, va );
-	}
-	else {
-		// This seems brutally complex. Haven't figured out a better
-		// way on windows.
-		#ifdef _MSC_VER
-			int len = -1;
-			int expand = 1000;
-			while ( len < 0 ) {
-				len = vsnprintf_s( accumulator.Mem(), accumulator.Capacity(), _TRUNCATE, format, va );
-				if ( len < 0 ) {
-					expand *= 3/2;
-					accumulator.PushArr( expand );
-				}
-			}
-			char* p = buffer.PushArr( len ) - 1;
-			memcpy( p, accumulator.Mem(), len+1 );
-		#else
-			int len = vsnprintf( 0, 0, format, va );
-			// Close out and re-start the va-args
-			va_end( va );
-			va_start( va, format );
-			char* p = buffer.PushArr( len ) - 1;
-			vsnprintf( p, len+1, format, va );
-		#endif
-	}
+    if ( fp ) {
+        vfprintf( fp, format, va );
+    }
+    else {
+        // This seems brutally complex. Haven't figured out a better
+        // way on windows.
+#ifdef _MSC_VER
+        int len = -1;
+        int expand = 1000;
+        while ( len < 0 ) {
+            len = vsnprintf_s( accumulator.Mem(), accumulator.Capacity(), _TRUNCATE, format, va );
+            if ( len < 0 ) {
+                expand *= 3/2;
+                accumulator.PushArr( expand );
+            }
+        }
+        char* p = buffer.PushArr( len ) - 1;
+        memcpy( p, accumulator.Mem(), len+1 );
+#else
+        int len = vsnprintf( 0, 0, format, va );
+        // Close out and re-start the va-args
+        va_end( va );
+        va_start( va, format );
+        char* p = buffer.PushArr( len ) - 1;
+        vsnprintf( p, len+1, format, va );
+#endif
+    }
     va_end( va );
 }
 
 
 void XMLPrinter::PrintSpace( int depth )
 {
-	for( int i=0; i<depth; ++i ) {
-		Print( "    " );
-	}
+    for( int i=0; i<depth; ++i ) {
+        Print( "    " );
+    }
 }
 
 
 void XMLPrinter::PrintString( const char* p, bool restricted )
 {
-	// Look for runs of bytes between entities to print.
-	const char* q = p;
-	const bool* flag = restricted ? restrictedEntityFlag : entityFlag;
+    // Look for runs of bytes between entities to print.
+    const char* q = p;
+    const bool* flag = restricted ? restrictedEntityFlag : entityFlag;
 
-	if ( processEntities ) {
-		while ( *q ) {
-			// Remember, char is sometimes signed. (How many times has that bitten me?)
-			if ( *q > 0 && *q < ENTITY_RANGE ) {
-				// Check for entities. If one is found, flush
-				// the stream up until the entity, write the
-				// entity, and keep looking.
-				if ( flag[(unsigned)(*q)] ) {
-					while ( p < q ) {
-						Print( "%c", *p );
-						++p;
-					}
-					for( int i=0; i<NUM_ENTITIES; ++i ) {
-						if ( entities[i].value == *q ) {
-							Print( "&%s;", entities[i].pattern );
-							break;
-						}
-					}
-					++p;
-				}
-			}
-			++q;
-		}
-	}
-	// Flush the remaining string. This will be the entire
-	// string if an entity wasn't found.
-	if ( !processEntities || (q-p > 0) ) {
-		Print( "%s", p );
-	}
+    if ( processEntities ) {
+        while ( *q ) {
+            // Remember, char is sometimes signed. (How many times has that bitten me?)
+            if ( *q > 0 && *q < ENTITY_RANGE ) {
+                // Check for entities. If one is found, flush
+                // the stream up until the entity, write the
+                // entity, and keep looking.
+                if ( flag[(unsigned)(*q)] ) {
+                    while ( p < q ) {
+                        Print( "%c", *p );
+                        ++p;
+                    }
+                    for( int i=0; i<NUM_ENTITIES; ++i ) {
+                        if ( entities[i].value == *q ) {
+                            Print( "&%s;", entities[i].pattern );
+                            break;
+                        }
+                    }
+                    ++p;
+                }
+            }
+            ++q;
+        }
+    }
+    // Flush the remaining string. This will be the entire
+    // string if an entity wasn't found.
+    if ( !processEntities || (q-p > 0) ) {
+        Print( "%s", p );
+    }
 }
 
 
 void XMLPrinter::PushHeader( bool writeBOM, bool writeDec )
 {
-	static const unsigned char bom[] = { TIXML_UTF_LEAD_0, TIXML_UTF_LEAD_1, TIXML_UTF_LEAD_2, 0 };
-	if ( writeBOM ) {
-		Print( "%s", bom );
-	}
-	if ( writeDec ) {
-		PushDeclaration( "xml version=\"1.0\"" );
-	}
+    static const unsigned char bom[] = { TIXML_UTF_LEAD_0, TIXML_UTF_LEAD_1, TIXML_UTF_LEAD_2, 0 };
+    if ( writeBOM ) {
+        Print( "%s", bom );
+    }
+    if ( writeDec ) {
+        PushDeclaration( "xml version=\"1.0\"" );
+    }
 }
 
 
 void XMLPrinter::OpenElement( const char* name )
 {
-	if ( elementJustOpened ) {
-		SealElement();
-	}
-	stack.Push( name );
+    if ( elementJustOpened ) {
+        SealElement();
+    }
+    stack.Push( name );
 
-	if ( textDepth < 0 && !firstElement && !compactMode ) {
-		Print( "\n" );
-		PrintSpace( depth );
-	}
+    if ( textDepth < 0 && !firstElement && !compactMode ) {
+        Print( "\n" );
+        PrintSpace( depth );
+    }
 
-	Print( "<%s", name );
-	elementJustOpened = true;
-	firstElement = false;
-	++depth;
+    Print( "<%s", name );
+    elementJustOpened = true;
+    firstElement = false;
+    ++depth;
 }
 
 
 void XMLPrinter::PushAttribute( const char* name, const char* value )
 {
-	TIXMLASSERT( elementJustOpened );
-	Print( " %s=\"", name );
-	PrintString( value, false );
-	Print( "\"" );
+    TIXMLASSERT( elementJustOpened );
+    Print( " %s=\"", name );
+    PrintString( value, false );
+    Print( "\"" );
 }
 
 
 void XMLPrinter::PushAttribute( const char* name, int v )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( v, buf, BUF_SIZE );
-	PushAttribute( name, buf );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( v, buf, BUF_SIZE );
+    PushAttribute( name, buf );
 }
 
 
 void XMLPrinter::PushAttribute( const char* name, unsigned v )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( v, buf, BUF_SIZE );
-	PushAttribute( name, buf );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( v, buf, BUF_SIZE );
+    PushAttribute( name, buf );
 }
 
 
 void XMLPrinter::PushAttribute( const char* name, bool v )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( v, buf, BUF_SIZE );
-	PushAttribute( name, buf );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( v, buf, BUF_SIZE );
+    PushAttribute( name, buf );
 }
 
 
 void XMLPrinter::PushAttribute( const char* name, double v )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( v, buf, BUF_SIZE );
-	PushAttribute( name, buf );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( v, buf, BUF_SIZE );
+    PushAttribute( name, buf );
 }
 
 
 void XMLPrinter::CloseElement()
 {
-	--depth;
-	const char* name = stack.Pop();
+    --depth;
+    const char* name = stack.Pop();
 
-	if ( elementJustOpened ) {
-		Print( "/>" );
-	}
-	else {
-		if ( textDepth < 0 && !compactMode) {
-			Print( "\n" );
-			PrintSpace( depth );
-		}
-		Print( "</%s>", name );
-	}
+    if ( elementJustOpened ) {
+        Print( "/>" );
+    }
+    else {
+        if ( textDepth < 0 && !compactMode) {
+            Print( "\n" );
+            PrintSpace( depth );
+        }
+        Print( "</%s>", name );
+    }
 
-	if ( textDepth == depth )
-		textDepth = -1;
-	if ( depth == 0 && !compactMode)
-		Print( "\n" );
-	elementJustOpened = false;
+    if ( textDepth == depth ) {
+        textDepth = -1;
+    }
+    if ( depth == 0 && !compactMode) {
+        Print( "\n" );
+    }
+    elementJustOpened = false;
 }
 
 
 void XMLPrinter::SealElement()
 {
-	elementJustOpened = false;
-	Print( ">" );
+    elementJustOpened = false;
+    Print( ">" );
 }
 
 
 void XMLPrinter::PushText( const char* text, bool cdata )
 {
-	textDepth = depth-1;
+    textDepth = depth-1;
 
-	if ( elementJustOpened ) {
-		SealElement();
-	}
-	if ( cdata ) {
-		Print( "<![CDATA[" );
-		Print( "%s", text );
-		Print( "]]>" );
-	}
-	else {
-		PrintString( text, true );
-	}
+    if ( elementJustOpened ) {
+        SealElement();
+    }
+    if ( cdata ) {
+        Print( "<![CDATA[" );
+        Print( "%s", text );
+        Print( "]]>" );
+    }
+    else {
+        PrintString( text, true );
+    }
 }
 
 void XMLPrinter::PushText( int value )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( value, buf, BUF_SIZE );
-	PushText( buf, false );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( value, buf, BUF_SIZE );
+    PushText( buf, false );
 }
 
 
 void XMLPrinter::PushText( unsigned value )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( value, buf, BUF_SIZE );
-	PushText( buf, false );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( value, buf, BUF_SIZE );
+    PushText( buf, false );
 }
 
 
 void XMLPrinter::PushText( bool value )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( value, buf, BUF_SIZE );
-	PushText( buf, false );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( value, buf, BUF_SIZE );
+    PushText( buf, false );
 }
 
 
 void XMLPrinter::PushText( float value )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( value, buf, BUF_SIZE );
-	PushText( buf, false );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( value, buf, BUF_SIZE );
+    PushText( buf, false );
 }
 
 
 void XMLPrinter::PushText( double value )
 {
-	char buf[BUF_SIZE];
-	XMLUtil::ToStr( value, buf, BUF_SIZE );
-	PushText( buf, false );
+    char buf[BUF_SIZE];
+    XMLUtil::ToStr( value, buf, BUF_SIZE );
+    PushText( buf, false );
 }
 
 
 void XMLPrinter::PushComment( const char* comment )
 {
-	if ( elementJustOpened ) {
-		SealElement();
-	}
-	if ( textDepth < 0 && !firstElement && !compactMode) {
-		Print( "\n" );
-		PrintSpace( depth );
-	}
-	firstElement = false;
-	Print( "<!--%s-->", comment );
+    if ( elementJustOpened ) {
+        SealElement();
+    }
+    if ( textDepth < 0 && !firstElement && !compactMode) {
+        Print( "\n" );
+        PrintSpace( depth );
+    }
+    firstElement = false;
+    Print( "<!--%s-->", comment );
 }
 
 
 void XMLPrinter::PushDeclaration( const char* value )
 {
-	if ( elementJustOpened ) {
-		SealElement();
-	}
-	if ( textDepth < 0 && !firstElement && !compactMode) {
-		Print( "\n" );
-		PrintSpace( depth );
-	}
-	firstElement = false;
-	Print( "<?%s?>", value );
+    if ( elementJustOpened ) {
+        SealElement();
+    }
+    if ( textDepth < 0 && !firstElement && !compactMode) {
+        Print( "\n" );
+        PrintSpace( depth );
+    }
+    firstElement = false;
+    Print( "<?%s?>", value );
 }
 
 
 void XMLPrinter::PushUnknown( const char* value )
 {
-	if ( elementJustOpened ) {
-		SealElement();
-	}
-	if ( textDepth < 0 && !firstElement && !compactMode) {
-		Print( "\n" );
-		PrintSpace( depth );
-	}
-	firstElement = false;
-	Print( "<!%s>", value );
+    if ( elementJustOpened ) {
+        SealElement();
+    }
+    if ( textDepth < 0 && !firstElement && !compactMode) {
+        Print( "\n" );
+        PrintSpace( depth );
+    }
+    firstElement = false;
+    Print( "<!%s>", value );
 }
 
 
 bool XMLPrinter::VisitEnter( const XMLDocument& doc )
 {
-	processEntities = doc.ProcessEntities();
-	if ( doc.HasBOM() ) {
-		PushHeader( true, false );
-	}
-	return true;
+    processEntities = doc.ProcessEntities();
+    if ( doc.HasBOM() ) {
+        PushHeader( true, false );
+    }
+    return true;
 }
 
 
 bool XMLPrinter::VisitEnter( const XMLElement& element, const XMLAttribute* attribute )
 {
-	OpenElement( element.Name() );
-	while ( attribute ) {
-		PushAttribute( attribute->Name(), attribute->Value() );
-		attribute = attribute->Next();
-	}
-	return true;
+    OpenElement( element.Name() );
+    while ( attribute ) {
+        PushAttribute( attribute->Name(), attribute->Value() );
+        attribute = attribute->Next();
+    }
+    return true;
 }
 
 
 bool XMLPrinter::VisitExit( const XMLElement& )
 {
-	CloseElement();
-	return true;
+    CloseElement();
+    return true;
 }
 
 
 bool XMLPrinter::Visit( const XMLText& text )
 {
-	PushText( text.Value(), text.CData() );
-	return true;
+    PushText( text.Value(), text.CData() );
+    return true;
 }
 
 
 bool XMLPrinter::Visit( const XMLComment& comment )
 {
-	PushComment( comment.Value() );
-	return true;
+    PushComment( comment.Value() );
+    return true;
 }
 
 bool XMLPrinter::Visit( const XMLDeclaration& declaration )
 {
-	PushDeclaration( declaration.Value() );
-	return true;
+    PushDeclaration( declaration.Value() );
+    return true;
 }
 
 
 bool XMLPrinter::Visit( const XMLUnknown& unknown )
 {
-	PushUnknown( unknown.Value() );
-	return true;
+    PushUnknown( unknown.Value() );
+    return true;
 }
