diff --git a/fpdfsdk/src/javascript/util.cpp b/fpdfsdk/src/javascript/util.cpp
index c4f0309..4083ed5 100644
--- a/fpdfsdk/src/javascript/util.cpp
+++ b/fpdfsdk/src/javascript/util.cpp
@@ -22,13 +22,13 @@
 
 static v8::Isolate* GetIsolate(IFXJS_Context* cc)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
 
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	ASSERT(pRuntime != NULL);
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    ASSERT(pRuntime != NULL);
 
-	return pRuntime->GetIsolate();
+    return pRuntime->GetIsolate();
 }
 
 BEGIN_JS_STATIC_CONST(CJS_Util)
@@ -38,11 +38,11 @@
 END_JS_STATIC_PROP()
 
 BEGIN_JS_STATIC_METHOD(CJS_Util)
-	JS_STATIC_METHOD_ENTRY(printd)
-	JS_STATIC_METHOD_ENTRY(printf)
-	JS_STATIC_METHOD_ENTRY(printx)
-	JS_STATIC_METHOD_ENTRY(scand)
-	JS_STATIC_METHOD_ENTRY(byteToChar)
+    JS_STATIC_METHOD_ENTRY(printd)
+    JS_STATIC_METHOD_ENTRY(printf)
+    JS_STATIC_METHOD_ENTRY(printx)
+    JS_STATIC_METHOD_ENTRY(scand)
+    JS_STATIC_METHOD_ENTRY(byteToChar)
 END_JS_STATIC_METHOD()
 
 IMPLEMENT_JS_CLASS(CJS_Util,util)
@@ -58,549 +58,539 @@
 
 struct stru_TbConvert
 {
-	const FX_WCHAR* lpszJSMark;
-	const FX_WCHAR* lpszCppMark;
+    const FX_WCHAR* lpszJSMark;
+    const FX_WCHAR* lpszCppMark;
 };
 
 const stru_TbConvert fcTable[] = {
-	{ L"mmmm", L"%B" },
-	{ L"mmm", L"%b" },
-	{ L"mm",  L"%m" },
-	//"m"
-	{ L"dddd", L"%A" },
-	{ L"ddd", L"%a" },
-	{ L"dd",  L"%d" },
-	//"d",   "%w",
-	{ L"yyyy", L"%Y" },
-	{ L"yy",  L"%y" },
-	{ L"HH",  L"%H" },
-	//"H"
-	{ L"hh",  L"%I" },
-	//"h"
-	{ L"MM",  L"%M" },
-	//"M"
-	{ L"ss",  L"%S" },
-	//"s
-	{ L"TT",  L"%p" },
-	//"t"
+    { L"mmmm", L"%B" },
+    { L"mmm", L"%b" },
+    { L"mm",  L"%m" },
+    //"m"
+    { L"dddd", L"%A" },
+    { L"ddd", L"%a" },
+    { L"dd",  L"%d" },
+    //"d",   "%w",
+    { L"yyyy", L"%Y" },
+    { L"yy",  L"%y" },
+    { L"HH",  L"%H" },
+    //"H"
+    { L"hh",  L"%I" },
+    //"h"
+    { L"MM",  L"%M" },
+    //"M"
+    { L"ss",  L"%S" },
+    //"s
+    { L"TT",  L"%p" },
+    //"t"
 #if defined(_WIN32)
-	{ L"tt",  L"%p" },
-	{ L"h",  L"%#I" },
+    { L"tt",  L"%p" },
+    { L"h",  L"%#I" },
 #else
-	{ L"tt",  L"%P" },
-	{ L"h",  L"%l" },
+    { L"tt",  L"%P" },
+    { L"h",  L"%l" },
 #endif
 };
 
-#define UTIL_INT			0
-#define UTIL_DOUBLE			1
-#define UTIL_STRING			2
+#define UTIL_INT            0
+#define UTIL_DOUBLE         1
+#define UTIL_STRING         2
 
 int util::ParstDataType(std::wstring* sFormat)
 {
-        size_t i = 0;
-	bool bPercent = FALSE;
-	for (i=0; i<sFormat->length(); ++i)
-	{
-		wchar_t c = (*sFormat)[i];
-		if (c == L'%')
-		{
-			bPercent = true;
-			continue;
-		}
+    bool bPercent = FALSE;
+    for (size_t i = 0; i < sFormat->length(); ++i)
+    {
+        wchar_t c = (*sFormat)[i];
+        if (c == L'%')
+        {
+            bPercent = true;
+            continue;
+        }
 
-		if (bPercent)
-		{
-			if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || c == L'u' || c == L'x' || c == L'X')
-			{
-				return UTIL_INT;
-			}
-			else if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G')
-			{
-				return UTIL_DOUBLE;
-			}
-			else if (c == L's' || c == L'S')
-			{
-				// Map s to S since we always deal internally
-				// with wchar_t strings.
-				(*sFormat)[i] = L'S';
-				return UTIL_STRING;
-			}
-			else if (c == L'.' || c == L'+' || c == L'-' || c == L'#' || c == L' ' || CJS_PublicMethods::IsDigit(c))
-			{
-				continue;
-			}
-			else break;
-		}
-	}
+        if (bPercent)
+        {
+            if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || c == L'u' || c == L'x' || c == L'X')
+            {
+                return UTIL_INT;
+            }
+            if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G')
+            {
+                return UTIL_DOUBLE;
+            }
+            if (c == L's' || c == L'S')
+            {
+                // Map s to S since we always deal internally
+                // with wchar_t strings.
+                (*sFormat)[i] = L'S';
+                return UTIL_STRING;
+            }
+            if (c == L'.' || c == L'+' || c == L'-' || c == L'#' || c == L' ' || CJS_PublicMethods::IsDigit(c))
+            {
+                continue;
+            }
+            break;
+        }
+    }
 
-	return -1;
+    return -1;
 }
 
 FX_BOOL util::printf(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	int iSize = params.size();
-	if (iSize < 1)
-		return FALSE;
-	std::wstring c_ConvChar(params[0].ToCFXWideString().c_str());
-	std::vector<std::wstring> c_strConvers;
-	int iOffset = 0;
-	int iOffend = 0;
-	c_ConvChar.insert(c_ConvChar.begin(),L'S');
-	while(iOffset != -1)
-	{
-		iOffend = c_ConvChar.find(L"%",iOffset+1);
-		std::wstring strSub;
-		if (iOffend == -1)
-			strSub = c_ConvChar.substr(iOffset);
-		else
-			strSub = c_ConvChar.substr(iOffset ,iOffend - iOffset);
-		c_strConvers.push_back(strSub);
-		iOffset = iOffend ;
-	}
+    int iSize = params.size();
+    if (iSize < 1)
+        return FALSE;
+    std::wstring c_ConvChar(params[0].ToCFXWideString().c_str());
+    std::vector<std::wstring> c_strConvers;
+    int iOffset = 0;
+    int iOffend = 0;
+    c_ConvChar.insert(c_ConvChar.begin(),L'S');
+    while(iOffset != -1)
+    {
+        iOffend = c_ConvChar.find(L"%",iOffset+1);
+        std::wstring strSub;
+        if (iOffend == -1)
+            strSub = c_ConvChar.substr(iOffset);
+        else
+            strSub = c_ConvChar.substr(iOffset ,iOffend - iOffset);
+        c_strConvers.push_back(strSub);
+        iOffset = iOffend ;
+    }
 
-	std::wstring c_strResult;
+    std::wstring c_strResult;
 
-	//for(int iIndex = 1;iIndex < params.size();iIndex++)
-	std::wstring c_strFormat;
-	for(int iIndex = 0;iIndex < (int)c_strConvers.size();iIndex++)
-	{
-		c_strFormat = c_strConvers[iIndex];
-		if (iIndex == 0)
-		{
-			c_strResult = c_strFormat;
-			continue;
-		}
+    //for(int iIndex = 1;iIndex < params.size();iIndex++)
+    std::wstring c_strFormat;
+    for(int iIndex = 0;iIndex < (int)c_strConvers.size();iIndex++)
+    {
+        c_strFormat = c_strConvers[iIndex];
+        if (iIndex == 0)
+        {
+            c_strResult = c_strFormat;
+            continue;
+        }
 
 
-		CFX_WideString strSegment;
-		if (iIndex >= iSize) {
-			c_strResult += c_strFormat;
-			continue;
-		}
+        CFX_WideString strSegment;
+        if (iIndex >= iSize) {
+            c_strResult += c_strFormat;
+            continue;
+        }
 
-		switch (ParstDataType(&c_strFormat))
-		{
-			case UTIL_INT:
-				strSegment.Format(c_strFormat.c_str(), params[iIndex].ToInt());
-				break;
-			case UTIL_DOUBLE:
-				strSegment.Format(c_strFormat.c_str(), params[iIndex].ToDouble());
-				break;
-			case UTIL_STRING:
-				strSegment.Format(c_strFormat.c_str(), params[iIndex].ToCFXWideString().c_str());
-				break;
-			default:
-				strSegment.Format(L"%S", c_strFormat.c_str());
-				break;
-		}
-		c_strResult += strSegment.GetBuffer(strSegment.GetLength()+1);
-	}
+        switch (ParstDataType(&c_strFormat))
+        {
+            case UTIL_INT:
+                strSegment.Format(c_strFormat.c_str(), params[iIndex].ToInt());
+                break;
+            case UTIL_DOUBLE:
+                strSegment.Format(c_strFormat.c_str(), params[iIndex].ToDouble());
+                break;
+            case UTIL_STRING:
+                strSegment.Format(c_strFormat.c_str(), params[iIndex].ToCFXWideString().c_str());
+                break;
+            default:
+                strSegment.Format(L"%S", c_strFormat.c_str());
+                break;
+        }
+        c_strResult += strSegment.GetBuffer(strSegment.GetLength()+1);
+    }
 
-	c_strResult.erase(c_strResult.begin());
-	vRet = c_strResult.c_str();
-	return TRUE;
+    c_strResult.erase(c_strResult.begin());
+    vRet = c_strResult.c_str();
+    return TRUE;
 }
 
 FX_BOOL util::printd(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	v8::Isolate* isolate = GetIsolate(cc);
+    v8::Isolate* isolate = GetIsolate(cc);
 
-	int iSize = params.size();
-	if (iSize < 2)
-		return FALSE;
+    int iSize = params.size();
+    if (iSize < 2)
+        return FALSE;
 
-	CJS_Value p1(isolate);
-	p1 = params[0];
+    CJS_Value p1(isolate);
+    p1 = params[0];
 
-	CJS_Value p2 = params[1];
-	CJS_Date jsDate(isolate);
-	if (!p2.ConvertToDate(jsDate))
-	{
-		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1);
-		return FALSE;
-	}
+    CJS_Value p2 = params[1];
+    CJS_Date jsDate(isolate);
+    if (!p2.ConvertToDate(jsDate))
+    {
+        sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1);
+        return FALSE;
+    }
 
-	if (!jsDate.IsValidDate())
-	{
-		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2);
-		return FALSE;
-	}
+    if (!jsDate.IsValidDate())
+    {
+        sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2);
+        return FALSE;
+    }
 
-	if (p1.GetType() == VT_number)
-	{
-		int nFormat = p1.ToInt();
-		CFX_WideString swResult;
+    if (p1.GetType() == VT_number)
+    {
+        int nFormat = p1.ToInt();
+        CFX_WideString swResult;
 
-		switch (nFormat)
-		{
-		case 0:
-			swResult.Format(L"D:%04d%02d%02d%02d%02d%02d",
-				jsDate.GetYear(),
-				jsDate.GetMonth() + 1,
-				jsDate.GetDay(),
-				jsDate.GetHours(),
-				jsDate.GetMinutes(),
-				jsDate.GetSeconds());
-			break;
-		case 1:
-			swResult.Format(L"%04d.%02d.%02d %02d:%02d:%02d",
-				jsDate.GetYear(),
-				jsDate.GetMonth() + 1,
-				jsDate.GetDay(),
-				jsDate.GetHours(),
-				jsDate.GetMinutes(),
-				jsDate.GetSeconds());
-			break;
-		case 2:
-			swResult.Format(L"%04d/%02d/%02d %02d:%02d:%02d",
-				jsDate.GetYear(),
-				jsDate.GetMonth() + 1,
-				jsDate.GetDay(),
-				jsDate.GetHours(),
-				jsDate.GetMinutes(),
-				jsDate.GetSeconds());
-			break;
-		default:
-			return FALSE;
-		}
+        switch (nFormat)
+        {
+        case 0:
+            swResult.Format(L"D:%04d%02d%02d%02d%02d%02d",
+                jsDate.GetYear(),
+                jsDate.GetMonth() + 1,
+                jsDate.GetDay(),
+                jsDate.GetHours(),
+                jsDate.GetMinutes(),
+                jsDate.GetSeconds());
+            break;
+        case 1:
+            swResult.Format(L"%04d.%02d.%02d %02d:%02d:%02d",
+                jsDate.GetYear(),
+                jsDate.GetMonth() + 1,
+                jsDate.GetDay(),
+                jsDate.GetHours(),
+                jsDate.GetMinutes(),
+                jsDate.GetSeconds());
+            break;
+        case 2:
+            swResult.Format(L"%04d/%02d/%02d %02d:%02d:%02d",
+                jsDate.GetYear(),
+                jsDate.GetMonth() + 1,
+                jsDate.GetDay(),
+                jsDate.GetHours(),
+                jsDate.GetMinutes(),
+                jsDate.GetSeconds());
+            break;
+        default:
+            return FALSE;
+        }
 
-		vRet = swResult.c_str();
-		return TRUE;
-	}
-	else if (p1.GetType() == VT_string)
-	{
-		std::basic_string<wchar_t> cFormat = p1.ToCFXWideString().c_str();
+        vRet = swResult.c_str();
+        return TRUE;
+    }
+    if (p1.GetType() == VT_string)
+    {
+        std::basic_string<wchar_t> cFormat = p1.ToCFXWideString().c_str();
 
-		bool bXFAPicture = false;
-		if (iSize > 2)
-		{
-			bXFAPicture = params[2].ToBool();
-		}
+        bool bXFAPicture = false;
+        if (iSize > 2)
+        {
+            bXFAPicture = params[2].ToBool();
+        }
 
-		if (bXFAPicture)
-		{
-			return FALSE; //currently, it doesn't support XFAPicture.
-		}
+        if (bXFAPicture)
+        {
+            return FALSE; //currently, it doesn't support XFAPicture.
+        }
 
         int iIndex;
-		for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
-		{
-			int iStart = 0;
-			int iEnd;
-			while((iEnd = cFormat.find(fcTable[iIndex].lpszJSMark, iStart)) != -1)
-			{
-				cFormat.replace(iEnd, FXSYS_wcslen(fcTable[iIndex].lpszJSMark), fcTable[iIndex].lpszCppMark);
-				iStart = iEnd;
-			}
-		}
+        for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
+        {
+            int iStart = 0;
+            int iEnd;
+            while((iEnd = cFormat.find(fcTable[iIndex].lpszJSMark, iStart)) != -1)
+            {
+                cFormat.replace(iEnd, FXSYS_wcslen(fcTable[iIndex].lpszJSMark), fcTable[iIndex].lpszCppMark);
+                iStart = iEnd;
+            }
+        }
 
-		int iYear,iMonth,iDay,iHour,iMin,iSec;
-		iYear = jsDate.GetYear();
-		iMonth = jsDate.GetMonth();
-		iDay = jsDate.GetDay();
-		iHour = jsDate.GetHours();
-		iMin = jsDate.GetMinutes();
-		iSec = jsDate.GetSeconds();
+        int iYear,iMonth,iDay,iHour,iMin,iSec;
+        iYear = jsDate.GetYear();
+        iMonth = jsDate.GetMonth();
+        iDay = jsDate.GetDay();
+        iHour = jsDate.GetHours();
+        iMin = jsDate.GetMinutes();
+        iSec = jsDate.GetSeconds();
 
-		struct tm time = {};
-		time.tm_year = iYear-1900;
-		time.tm_mon = iMonth;
-		time.tm_mday = iDay;
-		time.tm_hour = iHour;
-		time.tm_min = iMin;
-		time.tm_sec = iSec;
-		//COleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec);
-		//CString strFormat = cppTm.Format(cFormat.c_str());
+        struct tm time = {};
+        time.tm_year = iYear-1900;
+        time.tm_mon = iMonth;
+        time.tm_mday = iDay;
+        time.tm_hour = iHour;
+        time.tm_min = iMin;
+        time.tm_sec = iSec;
 
-		struct stru_TbConvertAd
-		{
-			const FX_WCHAR* lpszJSMark;
-			int     iValue;
-		};
+        struct stru_TbConvertAd
+        {
+            const FX_WCHAR* lpszJSMark;
+            int     iValue;
+        };
 
-		stru_TbConvertAd cTableAd[] ={
-			{ L"m", iMonth+1 },
-			{ L"d", iDay },
-			{ L"H", iHour },
-			{ L"h", iHour>12?iHour-12:iHour },
-			{ L"M", iMin },
-			{ L"s", iSec },
-		};
+        stru_TbConvertAd cTableAd[] ={
+            { L"m", iMonth+1 },
+            { L"d", iDay },
+            { L"H", iHour },
+            { L"h", iHour>12?iHour-12:iHour },
+            { L"M", iMin },
+            { L"s", iSec },
+        };
 
-		//cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);
-		for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
-		{
-			wchar_t tszValue[10];
-			//_itot(cTableAd[iIndex].iValue,tszValue,10);
-			CFX_WideString sValue;
-			sValue.Format(L"%d",cTableAd[iIndex].iValue);
-			memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),
+        for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
+        {
+            wchar_t tszValue[10];
+            CFX_WideString sValue;
+            sValue.Format(L"%d",cTableAd[iIndex].iValue);
+            memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),
                                (sValue.GetLength()+1)*sizeof(wchar_t));
 
-			//strFormat.Replace(cTableAd[iIndex].lpszJSMark,"%d");
-			//strFormat.Format(strFormat,cTableAd[iIndex].iValue);
-			int iStart = 0;
-			int iEnd;
-			while((iEnd = cFormat.find(cTableAd[iIndex].lpszJSMark, iStart)) != -1)
-			{
-				if (iEnd > 0)
-				{
-					if (cFormat[iEnd-1] == L'%')
-					{
-						iStart = iEnd+1;
-						continue;
-					}
-				}
-				cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[iIndex].lpszJSMark), tszValue);
-				iStart = iEnd;
-			}
-		}
+            int iStart = 0;
+            int iEnd;
+            while((iEnd = cFormat.find(cTableAd[iIndex].lpszJSMark, iStart)) != -1)
+            {
+                if (iEnd > 0)
+                {
+                    if (cFormat[iEnd-1] == L'%')
+                    {
+                        iStart = iEnd+1;
+                        continue;
+                    }
+                }
+                cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[iIndex].lpszJSMark), tszValue);
+                iStart = iEnd;
+            }
+        }
 
-		CFX_WideString strFormat;
-//		strFormat.Format(L"%d,%d,%d,%d,%d,%d",iYear, iMonth, iDay, iHour, iMin, iSec);
-//		CString strFormat = cppTm.Format(cFormat.c_str());
-		wchar_t buf[64] = {};
-		strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
-		cFormat = buf;
-		vRet = cFormat.c_str();
-		//rtRet = strFormat.GetBuffer(strFormat.GetLength()+1);
-		return TRUE;
-	}
-	return FALSE;
+        CFX_WideString strFormat;
+        wchar_t buf[64] = {};
+        strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
+        cFormat = buf;
+        vRet = cFormat.c_str();
+        return TRUE;
+    }
+    return FALSE;
 }
 
 void util::printd(const std::wstring &cFormat2, CJS_Date jsDate, bool bXFAPicture, std::wstring &cPurpose)
 {
-	std::wstring cFormat = cFormat2;
+    std::wstring cFormat = cFormat2;
 
-	if (bXFAPicture)
-	{
-		return ; //currently, it doesn't support XFAPicture.
-	}
+    if (bXFAPicture)
+    {
+        return ; //currently, it doesn't support XFAPicture.
+    }
 
     int iIndex;
-	for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
-	{
-		int iStart = 0;
-		int iEnd;
-		while((iEnd = cFormat.find(fcTable[iIndex].lpszJSMark, iStart)) != -1)
-		{
-			cFormat.replace(iEnd,FXSYS_wcslen(fcTable[iIndex].lpszJSMark), fcTable[iIndex].lpszCppMark);
-			iStart = iEnd;
-		}
-	}
+    for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
+    {
+        int iStart = 0;
+        int iEnd;
+        while((iEnd = cFormat.find(fcTable[iIndex].lpszJSMark, iStart)) != -1)
+        {
+            cFormat.replace(iEnd,FXSYS_wcslen(fcTable[iIndex].lpszJSMark), fcTable[iIndex].lpszCppMark);
+            iStart = iEnd;
+        }
+    }
 
-	int iYear,iMonth,iDay,iHour,iMin,iSec;
-	iYear = jsDate.GetYear();
-	iMonth = jsDate.GetMonth();
-	iDay = jsDate.GetDay();
-	iHour = jsDate.GetHours();
-	iMin = jsDate.GetMinutes();
-	iSec = jsDate.GetSeconds();
+    int iYear,iMonth,iDay,iHour,iMin,iSec;
+    iYear = jsDate.GetYear();
+    iMonth = jsDate.GetMonth();
+    iDay = jsDate.GetDay();
+    iHour = jsDate.GetHours();
+    iMin = jsDate.GetMinutes();
+    iSec = jsDate.GetSeconds();
 
-	struct tm time = {};
-	time.tm_year = iYear-1900;
-	time.tm_mon = iMonth;
-	time.tm_mday = iDay;
-	time.tm_hour = iHour;
-	time.tm_min = iMin;
-	time.tm_sec = iSec;
-//	COleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec);
-	//CString strFormat = cppTm.Format(cFormat.c_str());
+    struct tm time = {};
+    time.tm_year = iYear-1900;
+    time.tm_mon = iMonth;
+    time.tm_mday = iDay;
+    time.tm_hour = iHour;
+    time.tm_min = iMin;
+    time.tm_sec = iSec;
+//  COleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec);
+    //CString strFormat = cppTm.Format(cFormat.c_str());
 
-	struct stru_TbConvertAd
-	{
-		const FX_WCHAR* lpszJSMark;
-		int     iValue;
-	};
+    struct stru_TbConvertAd
+    {
+        const FX_WCHAR* lpszJSMark;
+        int     iValue;
+    };
 
-	stru_TbConvertAd cTableAd[] ={
-		{ L"m", iMonth+1 },
-		{ L"d", iDay },
-		{ L"H", iHour },
-		{ L"h", iHour>12?iHour-12:iHour },
-		{ L"M", iMin },
-		{ L"s", iSec },
-	};
+    stru_TbConvertAd cTableAd[] ={
+        { L"m", iMonth+1 },
+        { L"d", iDay },
+        { L"H", iHour },
+        { L"h", iHour>12?iHour-12:iHour },
+        { L"M", iMin },
+        { L"s", iSec },
+    };
 
-	//cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);
-	for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
-	{
-		wchar_t tszValue[10];
-		//_itot(cTableAd[iIndex].iValue,tszValue,10);
-		CFX_WideString sValue;
-		sValue.Format(L"%d",cTableAd[iIndex].iValue);
-		memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),sValue.GetLength()*sizeof(wchar_t));
+    //cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);
+    for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
+    {
+        wchar_t tszValue[10];
+        //_itot(cTableAd[iIndex].iValue,tszValue,10);
+        CFX_WideString sValue;
+        sValue.Format(L"%d",cTableAd[iIndex].iValue);
+        memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),sValue.GetLength()*sizeof(wchar_t));
 
 
-		//strFormat.Replace(cTableAd[iIndex].lpszJSMark,"%d");
-		//strFormat.Format(strFormat,cTableAd[iIndex].iValue);
-		int iStart = 0;
-		int iEnd;
-		while((iEnd = cFormat.find(cTableAd[iIndex].lpszJSMark, iStart)) != -1)
-		{
-			if (iEnd > 0)
-			{
-				if (cFormat[iEnd-1] == L'%')
-				{
-					iStart = iEnd+1;
-					continue;
-				}
-			}
-			cFormat.replace(iEnd,FXSYS_wcslen(cTableAd[iIndex].lpszJSMark),tszValue);
-			iStart = iEnd;
-		}
-	}
+        //strFormat.Replace(cTableAd[iIndex].lpszJSMark,"%d");
+        //strFormat.Format(strFormat,cTableAd[iIndex].iValue);
+        int iStart = 0;
+        int iEnd;
+        while((iEnd = cFormat.find(cTableAd[iIndex].lpszJSMark, iStart)) != -1)
+        {
+            if (iEnd > 0)
+            {
+                if (cFormat[iEnd-1] == L'%')
+                {
+                    iStart = iEnd+1;
+                    continue;
+                }
+            }
+            cFormat.replace(iEnd,FXSYS_wcslen(cTableAd[iIndex].lpszJSMark),tszValue);
+            iStart = iEnd;
+        }
+    }
 
-	CFX_WideString strFormat;
-	wchar_t buf[64] = {};
-	strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
-	cFormat = buf;
-	cPurpose = cFormat;
+    CFX_WideString strFormat;
+    wchar_t buf[64] = {};
+    strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
+    cFormat = buf;
+    cPurpose = cFormat;
 }
 
 FX_BOOL util::printx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	int iSize = params.size();
-	if (iSize<2)
-		return FALSE;
-	CFX_WideString sFormat = params[0].ToCFXWideString();
-	CFX_WideString sSource = params[1].ToCFXWideString();
-	std::string cFormat = CFX_ByteString::FromUnicode(sFormat).c_str();
-	std::string cSource = CFX_ByteString::FromUnicode(sSource).c_str();
-	std::string cDest;
-	printx(cFormat,cSource,cDest);
-	vRet = cDest.c_str();
-	return TRUE;
+    int iSize = params.size();
+    if (iSize<2)
+        return FALSE;
+    CFX_WideString sFormat = params[0].ToCFXWideString();
+    CFX_WideString sSource = params[1].ToCFXWideString();
+    std::string cFormat = CFX_ByteString::FromUnicode(sFormat).c_str();
+    std::string cSource = CFX_ByteString::FromUnicode(sSource).c_str();
+    std::string cDest;
+    printx(cFormat,cSource,cDest);
+    vRet = cDest.c_str();
+    return TRUE;
 }
 
 void util::printx(const std::string &cFormat,const std::string &cSource2,std::string &cPurpose)
 {
-	std::string cSource(cSource2);
-	if (!cPurpose.empty())
-		//cPurpose.clear();
-		cPurpose.erase();
-	int itSource = 0;
-	int iSize = cSource.size();
-	for(int iIndex = 0; iIndex < (int)cFormat.size() && itSource<iSize; iIndex++)
-	{
-		char letter = cFormat[iIndex];
-		switch(letter)
-		{
-		case '?':
-			//cPurpose.push_back(cSource[itSource]);
-			cPurpose += cSource[itSource];
-			itSource++;
-			break;
-		case 'X':
-			{
-				while(itSource < iSize)
-				{
-					if ((cSource[itSource]>='0'&&cSource[itSource]<='9') || (cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))
-					{
-						//cPurpose.push_back(cSource[itSource]);
-						cPurpose += cSource[itSource];
-						itSource++;
-						break;
-					}
-					itSource++;
-				}
-				break;
-			}
-			break;
-		case 'A':
-			{
-				while(itSource < iSize)
-				{
-					if ((cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))
-					{
-						//cPurpose.push_back(cSource[itSource]);
-						cPurpose += cSource[itSource];
-						itSource++;
-						break;
-					}
-					itSource++;
-				}
-				break;
-			}
-			break;
-		case '9':
-			{
-				while(itSource < iSize)
-				{
-					if (cSource[itSource]>='0'&&cSource[itSource]<='9')
-					{
-						//cPurpose.push_back(cSource[itSource]);
-						cPurpose += cSource[itSource];
-						itSource++;
-						break;
-					}
-					itSource++;
-				}
-				break;
-			}
-		case '*':
-			{
-				cPurpose.append(cSource,itSource,iSize-itSource);
-				itSource = iSize-1;
-				break;
-			}
-		case '\\':
-			break;
-		case '>':
-			{
-				for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
-				{
-					*it = toupper(*it);
-				}
-				break;
-			}
-		case '<':
-			{
-				for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
-				{
-					*it = tolower(*it);
-				}
-				break;
-			}
-		case '=':
-			break;
-		default:
-			//cPurpose.push_back(letter);
-			cPurpose += letter;
-			break;
-		}
-	}
+    std::string cSource(cSource2);
+    if (!cPurpose.empty())
+        //cPurpose.clear();
+        cPurpose.erase();
+    int itSource = 0;
+    int iSize = cSource.size();
+    for(int iIndex = 0; iIndex < (int)cFormat.size() && itSource<iSize; iIndex++)
+    {
+        char letter = cFormat[iIndex];
+        switch(letter)
+        {
+        case '?':
+            //cPurpose.push_back(cSource[itSource]);
+            cPurpose += cSource[itSource];
+            itSource++;
+            break;
+        case 'X':
+            {
+                while(itSource < iSize)
+                {
+                    if ((cSource[itSource]>='0'&&cSource[itSource]<='9') || (cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))
+                    {
+                        //cPurpose.push_back(cSource[itSource]);
+                        cPurpose += cSource[itSource];
+                        itSource++;
+                        break;
+                    }
+                    itSource++;
+                }
+                break;
+            }
+            break;
+        case 'A':
+            {
+                while(itSource < iSize)
+                {
+                    if ((cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))
+                    {
+                        //cPurpose.push_back(cSource[itSource]);
+                        cPurpose += cSource[itSource];
+                        itSource++;
+                        break;
+                    }
+                    itSource++;
+                }
+                break;
+            }
+            break;
+        case '9':
+            {
+                while(itSource < iSize)
+                {
+                    if (cSource[itSource]>='0'&&cSource[itSource]<='9')
+                    {
+                        //cPurpose.push_back(cSource[itSource]);
+                        cPurpose += cSource[itSource];
+                        itSource++;
+                        break;
+                    }
+                    itSource++;
+                }
+                break;
+            }
+        case '*':
+            {
+                cPurpose.append(cSource,itSource,iSize-itSource);
+                itSource = iSize-1;
+                break;
+            }
+        case '\\':
+            break;
+        case '>':
+            {
+                for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
+                {
+                    *it = toupper(*it);
+                }
+                break;
+            }
+        case '<':
+            {
+                for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
+                {
+                    *it = tolower(*it);
+                }
+                break;
+            }
+        case '=':
+            break;
+        default:
+            //cPurpose.push_back(letter);
+            cPurpose += letter;
+            break;
+        }
+    }
 }
 
 FX_BOOL util::scand(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	v8::Isolate* isolate = GetIsolate(cc);
-	int iSize = params.size();
-	if (iSize < 2)
-		return FALSE;
+    v8::Isolate* isolate = GetIsolate(cc);
+    int iSize = params.size();
+    if (iSize < 2)
+        return FALSE;
 
-	CFX_WideString sFormat = params[0].ToCFXWideString();
-	CFX_WideString sDate = params[1].ToCFXWideString();
-	double dDate = JS_GetDateTime();
-	if (sDate.GetLength() > 0)
-	{
-		FX_BOOL bWrongFormat = FALSE;
-		dDate = CJS_PublicMethods::MakeRegularDate(sDate,sFormat,bWrongFormat);
-	}
+    CFX_WideString sFormat = params[0].ToCFXWideString();
+    CFX_WideString sDate = params[1].ToCFXWideString();
+    double dDate = JS_GetDateTime();
+    if (sDate.GetLength() > 0)
+    {
+        FX_BOOL bWrongFormat = FALSE;
+        dDate = CJS_PublicMethods::MakeRegularDate(sDate,sFormat,bWrongFormat);
+    }
 
-	if (!JS_PortIsNan(dDate))
-	{
-		CJS_Date date(isolate,dDate);
-		vRet = date;
-	}
-	else
-	{
-		vRet.SetNull();
-	}
+    if (!JS_PortIsNan(dDate))
+    {
+        CJS_Date date(isolate,dDate);
+        vRet = date;
+    }
+    else
+    {
+        vRet.SetNull();
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 int64_t FX_atoi64(const char *nptr)
@@ -625,21 +615,18 @@
             c = (int)(unsigned char)*nptr++;    /* get next char */
         }
 
-        if (sign == '-')
-            return -total;
-        else
-            return total;   /* return result, negated if necessary */
+        return sign == '-' ? -total : total;
 }
 
 FX_BOOL util::byteToChar(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	int iSize = params.size();
-	if (iSize == 0)
-		return FALSE;
-	int nByte = params[0].ToInt();
-	unsigned char cByte = (unsigned char)nByte;
-	CFX_WideString csValue;
-	csValue.Format(L"%c", cByte);
-	vRet = csValue.c_str();
-	return TRUE;
+    int iSize = params.size();
+    if (iSize == 0)
+        return FALSE;
+    int nByte = params[0].ToInt();
+    unsigned char cByte = (unsigned char)nByte;
+    CFX_WideString csValue;
+    csValue.Format(L"%c", cByte);
+    vRet = csValue.c_str();
+    return TRUE;
 }
