<%
Dim APISite,Onlyagnuse
APISite="http://api.56dr.com"'API接口地址

'-------------------------------------------------
'广州星外信息科技有限公司保留所有权利
'此代码的版权已在国家版权局登记
'有任何法律问题请联系网站律师
'http://7i24.com
'-------------------------------------------------


































































server.ScriptTimeout =240
Onlyagnuse=true'限制本系统只给代理用户使用
If Application("NetPaypercent")="" Then
If Left(APISite,7)<>"http://" Then
response.write "Freehost-AG-Function.asp中的API域名应该以http://开头"
response.end
End If
'连接主控网站
Application("NetPaypercent")=GETOP("/api/sendvar.asp","var=NetPaypercent")
If Not IsNumeric(Application("NetPaypercent")) Then
response.write "查询API出错:返回信息一:"&Application("NetPaypercent")
response.end
End if
If Application("NetPaypercent")="" Then
response.write "查询API出错:返回信息二:"&Application("NetPaypercent")
response.end
End If
'Application("usercanselectapi")=GETOP("/api/sendvar.asp","var=usercanselectapi")
'If Application("usercanselectapi")="True" Then
'Application("api1")=GETOP("/api/sendvar.asp","var=api1")
'Application("api2")=GETOP("/api/sendvar.asp","var=api2")
'Application("api3")=GETOP("/api/sendvar.asp","var=api3")
'Application("api4")=GETOP("/api/sendvar.asp","var=api4")
'Application("api5")=GETOP("/api/sendvar.asp","var=api5")
'Application("api6")=GETOP("/api/sendvar.asp","var=api6")
'End if
End If

If session("agentname")="" And Onlyagnuse Then
ret=GETOP("/api/sendvar.asp","var=agentname&agentname="&Trim(LCase(Application("agentname"))))
If ret="errorsetagentname" Then
response.write "代理名:"&Application("agentname")&"和当前运行在主控的上代理号不一致!"&ret
response.end
End If
If ret="thisagentnotexist" Then
response.write "不存在的代理名:"&Application("agentname")&"请您在Global.asa中先设置正确的代理号!"
response.end
End If
If ret="canuseapiisfalse" Then
response.write "管理员尚未授权这个代理有使用API的权限!代理名:"&Application("agentname")&""
response.end
End If
If ret="" Or Len(ret)<3 Then
response.write "查询API-AGN出错,无法连接主控站."
response.end
End if
session("agentname")=ret
End if

If Application("CPSite")="" Then
Application("CPSite")=GETOP("/api/sendvar.asp","var=CPSite")
If Len(Application("CPSite"))<3 Then
Application("CPSite")=""
response.write "主控网站的系统参数中没有设置独立面板域名,请先设置!"
response.end
End If
End If

'If Application("APISite")="" Then
'Application("APISite")=GETOP("/api/sendvar.asp","var=APISite")
'If Len(Application("APISite"))<3 Then
'Application("APISite")=""
'response.write "主控网站的系统参数中没有设置代理管理公用域名,请先设置!"
'response.End
'Else
'If LCase("http://"&Application("APISite"))<>APISite Then
'response.write "主控网站的系统参数中API代理内部调用域名("&Application("APISite")&")和当前的API域名("&APISite&")不一致,请先修改为一致的域名!"
'Application("APISite")=""
'response.End
'End if
'End If
'End if

Dim APIret

dim FreeHost_t1
dim FreeHost_t2
dim FreeHost_t3
dim FreeHost_t4

FreeHost_t1=20000
FreeHost_t2=20000
FreeHost_t3=30000
FreeHost_t4=240000

Function GETOP(tar,req)
Dim objXMLHTTP
Set objXMLHTTP = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
objXMLHTTP.Option(6)=0
objXMLHTTP.setTimeouts FreeHost_t1, FreeHost_t2, FreeHost_t3, FreeHost_t4
objXMLHTTP.open  "GET",APISite&tar&"?"&req, False
objXMLHTTP.setRequestHeader "FreeHostAPI","7i24.com"
objXMLHTTP.setRequestHeader "FreeHostAPIIP",Request.ServerVariables("REMOTE_ADDR")
objXMLHTTP.setRequestHeader "FreeHostAPISITE",Request.ServerVariables("SERVER_NAME")
If session("APIOPcookie")<>"" Then objXMLHTTP.setRequestHeader "COOKIE", session("APIOPcookie")
objXMLHTTP.send
	If InStr(objXMLHTTP.GetAllResponseHeaders,"Set-Cookie") Then
	If InStr(objXMLHTTP.getResponseHeader("Set-Cookie"),"SPSESSION") then
	session("APIOPcookie") = objXMLHTTP.getResponseHeader("Set-Cookie")
	session("APIOPcookie")=left(session("APIOPcookie"),instr(1,session("APIOPcookie"),";")-1)
	End if
	End If
    If objXMLHTTP.status=200 Then
		GETOP = bytes2BSTR(objXMLHTTP.responsebody)
    Else
		If InStr(LCase(objXMLHTTP.GetAllResponseHeaders),"location:") Then
'		If InStr(objXMLHTTP.GetResponseHeader("location"),"e.asp") Then
'		GETOP="url"&objXMLHTTP.GetResponseHeader("location")
		Response.Redirect objXMLHTTP.GetResponseHeader("location")
'		Else
'		GETOP="出现错误:HTTP状态:"&objXMLHTTP.status&" 头部:"&objXMLHTTP.GetAllResponseHeaders&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)
'		GETOP="API出现错误:HTTP状态:"&objXMLHTTP.status&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)
'		End If
		Else
		GETOP="API出现错误:HTTP状态:"&objXMLHTTP.status&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)
		End if
    End If
Set objXMLHTTP = Nothing
End Function

Function GETOPBYTE(tar,req)
Dim objXMLHTTP
Set objXMLHTTP = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
objXMLHTTP.Option(6)=0
objXMLHTTP.setTimeouts FreeHost_t1, FreeHost_t2, FreeHost_t3, FreeHost_t4
objXMLHTTP.open  "GET",APISite&tar&"?"&req, False
objXMLHTTP.setRequestHeader "FreeHostAPI","7i24.com"
objXMLHTTP.setRequestHeader "FreeHostAPIIP",Request.ServerVariables("REMOTE_ADDR")
objXMLHTTP.setRequestHeader "FreeHostAPISITE",Request.ServerVariables("SERVER_NAME")
If session("APIOPcookie")<>"" Then objXMLHTTP.setRequestHeader "COOKIE", session("APIOPcookie")
objXMLHTTP.send
	If InStr(objXMLHTTP.GetAllResponseHeaders,"Set-Cookie") Then
	session("APIOPcookie") = objXMLHTTP.getResponseHeader("Set-Cookie")
	session("APIOPcookie")=left(session("APIOPcookie"),instr(1,session("APIOPcookie"),";")-1)
	End If
    If objXMLHTTP.status=200 Then
'		GETOPBYTE = bytes2BSTR(objXMLHTTP.responsebody)
		GETOPBYTE = objXMLHTTP.responsebody
    Else
		If InStr(LCase(objXMLHTTP.GetAllResponseHeaders),"location:") Then
'		If InStr(objXMLHTTP.GetResponseHeader("location"),"e.asp") Then
'		GETOPBYTE="url"&objXMLHTTP.GetResponseHeader("location")
		Response.Redirect objXMLHTTP.GetResponseHeader("location")
'		Else
'		GETOPBYTE="出现错误:HTTP状态:"&objXMLHTTP.status&" 头部:"&objXMLHTTP.GetAllResponseHeaders&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)
'		GETOPBYTE="API出现错误:HTTP状态:"&objXMLHTTP.status&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)
'		End If
		Else
		GETOPBYTE="API出现错误:HTTP状态:"&objXMLHTTP.status&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)
		End if
    End If
Set objXMLHTTP = Nothing
End Function

Function POSTOP(tar,PostBody)
Dim objXMLHTTP
Set objXMLHTTP = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
objXMLHTTP.Option(6)=0
objXMLHTTP.setTimeouts FreeHost_t1, FreeHost_t2, FreeHost_t3, FreeHost_t4
objXMLHTTP.open  "POST",APISite&tar, False
objXMLHTTP.setRequestHeader "Content-Type","application/x-www-form-urlencoded"
'objXMLHTTP.setRequestHeader "Content-Type",Request.ServerVariables( "CONTENT_TYPE")
objXMLHTTP.setRequestHeader "Content-Length",Len(PostBody)
objXMLHTTP.setRequestHeader "FreeHostAPI","7i24.com"
objXMLHTTP.setRequestHeader "FreeHostAPIIP",Request.ServerVariables("REMOTE_ADDR")
objXMLHTTP.setRequestHeader "FreeHostAPISITE",Request.ServerVariables("SERVER_NAME")
If session("APIOPcookie")<>"" Then objXMLHTTP.setRequestHeader "COOKIE", session("APIOPcookie")
objXMLHTTP.send PostBody


	If InStr(objXMLHTTP.GetAllResponseHeaders,"Set-Cookie") Then
	session("APIOPcookie") = objXMLHTTP.getResponseHeader("Set-Cookie")
	session("APIOPcookie")=left(session("APIOPcookie"),instr(1,session("APIOPcookie"),";")-1)
	End If
    If objXMLHTTP.status=200 Then
		POSTOP = bytes2BSTR(objXMLHTTP.responsebody)
    Else
		If InStr(LCase(objXMLHTTP.GetAllResponseHeaders),"location:") Then
			If tar="/user/userlogin.asp" And (objXMLHTTP.GetResponseHeader("location")="logininfo.asp" or objXMLHTTP.GetResponseHeader("location")="/user/checkmobi.asp"  or objXMLHTTP.GetResponseHeader("location")="/style/info/xindomainform.asp?" or objXMLHTTP.GetResponseHeader("location")="/beianuser/info.asp")  Then
			session("username")=LCase(Trim(Request.Form ("username")))
			session("password")=md5(Trim(Request.Form ("password")))
		    session("agentusername")=""
			session("admau")=""
			If objXMLHTTP.GetResponseHeader("location")="/user/checkmobi.asp" Then session("SMSAUusername")=session("username")
'			response.write tar&objXMLHTTP.GetResponseHeader("location")
'			response.End
			End If
			If tar="/agent/agentlogin.asp" And (objXMLHTTP.GetResponseHeader("location")="logininfo.asp" or objXMLHTTP.GetResponseHeader("location")="/user/checkmobi.asp" or objXMLHTTP.GetResponseHeader("location")="/style/info/xindomainform.asp?")  Then
			session("agentusername")=LCase(Trim(Request.Form ("username")))
			session("agentpasswordORI")=Trim(Request.Form ("password"))
			session("username")=""
			session("password")=""
			session("AgnRunasUser")=False
			If objXMLHTTP.GetResponseHeader("location")="/user/checkmobi.asp" Then session("SMSAUusername")=session("agentusername")
'			response.write tar&objXMLHTTP.GetResponseHeader("location")
'			response.End
			End if

'		If InStr(objXMLHTTP.GetResponseHeader("location"),"e.asp") Then
'		POSTOP="url"&objXMLHTTP.GetResponseHeader("location")
		Response.Redirect objXMLHTTP.GetResponseHeader("location")
'		Else
'		POSTOP="API出现错误:HTTP状态:"&objXMLHTTP.status&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)
'		End If
		Else
		POSTOP="API出现错误:HTTP状态:"&objXMLHTTP.status&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)
		End if	
    End If
		'POSTOP="出现错误:HTTP状态:"&objXMLHTTP.status&" 头部:"&objXMLHTTP.GetAllResponseHeaders&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)
Set objXMLHTTP = Nothing
End Function

Function Bytes2bStr(vin)
  Dim BytesStream,StringReturn
  Set BytesStream = Server.CreateObject("ADODB.Stream")
  BytesStream.Type = 2
  BytesStream.Open
  BytesStream.WriteText vin
  BytesStream.Position = 0
  BytesStream.Charset = "gb2312"
  BytesStream.Position = 2
  StringReturn =BytesStream.ReadText
  BytesStream.close
  Set BytesStream = Nothing
  Bytes2bStr = StringReturn
End Function


Function RegExpTest(patrn, strng)
  Dim regEx
  Set regEx = New RegExp
  regEx.Pattern = patrn
  regEx.IgnoreCase = False
  RegExpTest = regEx.Test(strng)
End Function 



Function   BinaryToString(biData,Size)     
    Const   adLongVarChar   =   201   
    Set   RS   =   CreateObject("ADODB.Recordset")   
    RS.Fields.Append   "mBinary",   adLongVarChar,   Size   
    RS.Open   
    RS.AddNew   
      RS("mBinary").AppendChunk(biData)   
    RS.Update   
    BinaryToString   =   RS("mBinary").Value   
    RS.Close   
  End   Function 

Function POSTOPX(tar,PostBody)
Dim objXMLHTTP
Set objXMLHTTP = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
objXMLHTTP.Option(6)=0
objXMLHTTP.setTimeouts FreeHost_t1, FreeHost_t2, FreeHost_t3, FreeHost_t4
objXMLHTTP.open  "POST",APISite&tar, False
objXMLHTTP.setRequestHeader "Content-Type",Request.ServerVariables( "CONTENT_TYPE")
objXMLHTTP.setRequestHeader "Content-Length",Request.ServerVariables( "HTTP_Content-Length")
objXMLHTTP.setRequestHeader "FreeHostAPI","7i24.com"
objXMLHTTP.setRequestHeader "FreeHostAPIIP",Request.ServerVariables("REMOTE_ADDR")
objXMLHTTP.setRequestHeader "FreeHostAPISITE",Request.ServerVariables("SERVER_NAME")
If session("APIOPcookie")<>"" Then objXMLHTTP.setRequestHeader "COOKIE", session("APIOPcookie")
objXMLHTTP.send PostBody


	If InStr(objXMLHTTP.GetAllResponseHeaders,"Set-Cookie") Then
	session("APIOPcookie") = objXMLHTTP.getResponseHeader("Set-Cookie")
	session("APIOPcookie")=left(session("APIOPcookie"),instr(1,session("APIOPcookie"),";")-1)
	End If
    If objXMLHTTP.status=200 Then
		POSTOPX = bytes2BSTR(objXMLHTTP.responsebody)
    Else
		If InStr(LCase(objXMLHTTP.GetAllResponseHeaders),"location:") Then
			If tar="/user/userlogin.asp" And (objXMLHTTP.GetResponseHeader("location")="logininfo.asp" or objXMLHTTP.GetResponseHeader("location")="/style/info/xindomainform.asp?")  Then
			session("username")=LCase(Trim(Request.Form ("username")))
			session("password")=md5(Trim(Request.Form ("password")))
		    session("agentusername")=""
			session("admau")=""
'			response.write tar&objXMLHTTP.GetResponseHeader("location")
'			response.End
			End If
			If tar="/agent/agentlogin.asp" And (objXMLHTTP.GetResponseHeader("location")="logininfo.asp" or objXMLHTTP.GetResponseHeader("location")="/style/info/xindomainform.asp?")  Then
			session("agentusername")=LCase(Trim(Request.Form ("username")))
			session("agentpasswordORI")=Trim(Request.Form ("password"))
			session("username")=""
			session("password")=""
			session("AgnRunasUser")=False
'			response.write tar&objXMLHTTP.GetResponseHeader("location")
'			response.End
			End if

'		If InStr(objXMLHTTP.GetResponseHeader("location"),"e.asp") Then
'		POSTOP="url"&objXMLHTTP.GetResponseHeader("location")
		Response.Redirect objXMLHTTP.GetResponseHeader("location")
'		Else
'		POSTOP="API出现错误:HTTP状态:"&objXMLHTTP.status&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)
'		End If
		Else
		POSTOPX="API出现错误:HTTP状态:"&objXMLHTTP.status&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)&"<br>"&Request.ServerVariables( "CONTENT_TYPE")&"<br>"&Request.ServerVariables( "HTTP_Content-Length")
		End if	
    End If
		'POSTOP="出现错误:HTTP状态:"&objXMLHTTP.status&" 头部:"&objXMLHTTP.GetAllResponseHeaders&" 信息:"&bytes2BSTR(objXMLHTTP.responsebody)
Set objXMLHTTP = Nothing
End Function


Private Const BITS_TO_A_BYTE = 8
Private Const BYTES_TO_A_WORD = 4
Private Const BITS_TO_A_WORD = 32
Private m_lOnBits(30)
Private m_l2Power(30)
    m_lOnBits(0) = CLng(1)
    m_lOnBits(1) = CLng(3)
    m_lOnBits(2) = CLng(7)
    m_lOnBits(3) = CLng(15)
    m_lOnBits(4) = CLng(31)
    m_lOnBits(5) = CLng(63)
    m_lOnBits(6) = CLng(127)
    m_lOnBits(7) = CLng(255)
    m_lOnBits(8) = CLng(511)
    m_lOnBits(9) = CLng(1023)
    m_lOnBits(10) = CLng(2047)
    m_lOnBits(11) = CLng(4095)
    m_lOnBits(12) = CLng(8191)
    m_lOnBits(13) = CLng(16383)
    m_lOnBits(14) = CLng(32767)
    m_lOnBits(15) = CLng(65535)
    m_lOnBits(16) = CLng(131071)
    m_lOnBits(17) = CLng(262143)
    m_lOnBits(18) = CLng(524287)
    m_lOnBits(19) = CLng(1048575)
    m_lOnBits(20) = CLng(2097151)
    m_lOnBits(21) = CLng(4194303)
    m_lOnBits(22) = CLng(8388607)
    m_lOnBits(23) = CLng(16777215)
    m_lOnBits(24) = CLng(33554431)
    m_lOnBits(25) = CLng(67108863)
    m_lOnBits(26) = CLng(134217727)
    m_lOnBits(27) = CLng(268435455)
    m_lOnBits(28) = CLng(536870911)
    m_lOnBits(29) = CLng(1073741823)
    m_lOnBits(30) = CLng(2147483647)
    
    m_l2Power(0) = CLng(1)
    m_l2Power(1) = CLng(2)
    m_l2Power(2) = CLng(4)
    m_l2Power(3) = CLng(8)
    m_l2Power(4) = CLng(16)
    m_l2Power(5) = CLng(32)
    m_l2Power(6) = CLng(64)
    m_l2Power(7) = CLng(128)
    m_l2Power(8) = CLng(256)
    m_l2Power(9) = CLng(512)
    m_l2Power(10) = CLng(1024)
    m_l2Power(11) = CLng(2048)
    m_l2Power(12) = CLng(4096)
    m_l2Power(13) = CLng(8192)
    m_l2Power(14) = CLng(16384)
    m_l2Power(15) = CLng(32768)
    m_l2Power(16) = CLng(65536)
    m_l2Power(17) = CLng(131072)
    m_l2Power(18) = CLng(262144)
    m_l2Power(19) = CLng(524288)
    m_l2Power(20) = CLng(1048576)
    m_l2Power(21) = CLng(2097152)
    m_l2Power(22) = CLng(4194304)
    m_l2Power(23) = CLng(8388608)
    m_l2Power(24) = CLng(16777216)
    m_l2Power(25) = CLng(33554432)
    m_l2Power(26) = CLng(67108864)
    m_l2Power(27) = CLng(134217728)
    m_l2Power(28) = CLng(268435456)
    m_l2Power(29) = CLng(536870912)
    m_l2Power(30) = CLng(1073741824)

	'CHS MD5算法开始  --------------------------------------
	Private Function LShift(lValue, iShiftBits)
		If iShiftBits = 0 Then
			LShift = lValue
			Exit Function
		ElseIf iShiftBits = 31 Then
			If lValue And 1 Then
				LShift = &H80000000
			Else
				LShift = 0
			End If
			Exit Function
		ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
			Err.Raise 6
		End If
	
		If (lValue And m_l2Power(31 - iShiftBits)) Then
			LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000
		Else
			LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))
		End If
	End Function

	Private Function str2bin(varstr) 
		str2bin="" 
		 For i=1 To Len(varstr) 
			 varchar=mid(varstr,i,1) 
			 varasc = Asc(varchar) 
			 If varasc<0 Then 
				varasc = varasc + 65535 
			 End If 
			 If varasc>255 Then 
				varlow = Left(Hex(Asc(varchar)),2) 
				varhigh = right(Hex(Asc(varchar)),2) 
				str2bin = str2bin & chrB("&H" & varlow) & chrB("&H" & varhigh) 
			 Else 
				str2bin = str2bin & chrB(AscB(varchar)) 
			 End If 
		 Next 
	End Function 

	Private Function RShift(lValue, iShiftBits)
		If iShiftBits = 0 Then
			RShift = lValue
			Exit Function
		ElseIf iShiftBits = 31 Then
			If lValue And &H80000000 Then
				RShift = 1
			Else
				RShift = 0
			End If
			Exit Function
		ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
			Err.Raise 6
		End If
	
		RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits)
	
		If (lValue And &H80000000) Then
			RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1)))
		End If
	End Function
	
	Private Function RotateLeft(lValue, iShiftBits)
		RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits))
	End Function
	
	Private Function AddUnsigned(lX, lY)
		Dim lX4
		Dim lY4
		Dim lX8
		Dim lY8
		Dim lResult
	
		lX8 = lX And &H80000000
		lY8 = lY And &H80000000
		lX4 = lX And &H40000000
		lY4 = lY And &H40000000
		
		lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF)
	
		If lX4 And lY4 Then
			lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
		ElseIf lX4 Or lY4 Then
			If lResult And &H40000000 Then
				lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
			Else
				lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
			End If
		Else
			lResult = lResult Xor lX8 Xor lY8
		End If
	
		AddUnsigned = lResult
	End Function
	
	Private Function md5_F(x, y, z)
		md5_F = (x And y) Or ((Not x) And z)
	End Function
	
	Private Function md5_G(x, y, z)
		md5_G = (x And z) Or (y And (Not z))
	End Function
	
	Private Function md5_H(x, y, z)
		md5_H = (x Xor y Xor z)
	End Function
	
	Private Function md5_I(x, y, z)
		md5_I = (y Xor (x Or (Not z)))
	End Function
	
	Private Sub md5_FF(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End Sub
	
	Private Sub md5_GG(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End Sub
	
	Private Sub md5_HH(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End Sub
	
	Private Sub md5_II(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End Sub
	
	Private Function ConvertToWordArray(sMessage)
		Dim lMessageLength
		Dim lNumberOfWords
		Dim lWordArray()
		Dim lBytePosition
		Dim lByteCount
		Dim lWordCount
		
		Const MODULUS_BITS = 512
		Const CONGRUENT_BITS = 448
		
		lMessageLength = LenB(sMessage)
		
		lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD)
		ReDim lWordArray(lNumberOfWords - 1)
		
		lBytePosition = 0
		lByteCount = 0
		Do Until lByteCount >= lMessageLength
			lWordCount = lByteCount \ BYTES_TO_A_WORD
			lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
			lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(AscB(MidB(sMessage, lByteCount + 1, 1)), lBytePosition)
			lByteCount = lByteCount + 1
		Loop
	
		lWordCount = lByteCount \ BYTES_TO_A_WORD
		lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
		
		lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition)
		
		lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
		lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)
	
		ConvertToWordArray = lWordArray
	End Function
	
	Private Function WordToHex(lValue)
		Dim lByte
		Dim lCount
		
		For lCount = 0 To 3
			lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1)
			WordToHex = WordToHex & Right("0" & Hex(lByte), 2)
		Next
	End Function
	
	Public Function MD5(sMessage)
		m_lOnBits(0) = CLng(1)
		m_lOnBits(1) = CLng(3)
		m_lOnBits(2) = CLng(7)
		m_lOnBits(3) = CLng(15)
		m_lOnBits(4) = CLng(31)
		m_lOnBits(5) = CLng(63)
		m_lOnBits(6) = CLng(127)
		m_lOnBits(7) = CLng(255)
		m_lOnBits(8) = CLng(511)
		m_lOnBits(9) = CLng(1023)
		m_lOnBits(10) = CLng(2047)
		m_lOnBits(11) = CLng(4095)
		m_lOnBits(12) = CLng(8191)
		m_lOnBits(13) = CLng(16383)
		m_lOnBits(14) = CLng(32767)
		m_lOnBits(15) = CLng(65535)
		m_lOnBits(16) = CLng(131071)
		m_lOnBits(17) = CLng(262143)
		m_lOnBits(18) = CLng(524287)
		m_lOnBits(19) = CLng(1048575)
		m_lOnBits(20) = CLng(2097151)
		m_lOnBits(21) = CLng(4194303)
		m_lOnBits(22) = CLng(8388607)
		m_lOnBits(23) = CLng(16777215)
		m_lOnBits(24) = CLng(33554431)
		m_lOnBits(25) = CLng(67108863)
		m_lOnBits(26) = CLng(134217727)
		m_lOnBits(27) = CLng(268435455)
		m_lOnBits(28) = CLng(536870911)
		m_lOnBits(29) = CLng(1073741823)
		m_lOnBits(30) = CLng(2147483647)
		
		m_l2Power(0) = CLng(1)
		m_l2Power(1) = CLng(2)
		m_l2Power(2) = CLng(4)
		m_l2Power(3) = CLng(8)
		m_l2Power(4) = CLng(16)
		m_l2Power(5) = CLng(32)
		m_l2Power(6) = CLng(64)
		m_l2Power(7) = CLng(128)
		m_l2Power(8) = CLng(256)
		m_l2Power(9) = CLng(512)
		m_l2Power(10) = CLng(1024)
		m_l2Power(11) = CLng(2048)
		m_l2Power(12) = CLng(4096)
		m_l2Power(13) = CLng(8192)
		m_l2Power(14) = CLng(16384)
		m_l2Power(15) = CLng(32768)
		m_l2Power(16) = CLng(65536)
		m_l2Power(17) = CLng(131072)
		m_l2Power(18) = CLng(262144)
		m_l2Power(19) = CLng(524288)
		m_l2Power(20) = CLng(1048576)
		m_l2Power(21) = CLng(2097152)
		m_l2Power(22) = CLng(4194304)
		m_l2Power(23) = CLng(8388608)
		m_l2Power(24) = CLng(16777216)
		m_l2Power(25) = CLng(33554432)
		m_l2Power(26) = CLng(67108864)
		m_l2Power(27) = CLng(134217728)
		m_l2Power(28) = CLng(268435456)
		m_l2Power(29) = CLng(536870912)
		m_l2Power(30) = CLng(1073741824)
		
		
		Dim x
		Dim k
		Dim AA
		Dim BB
		Dim CC
		Dim DD
		Dim a
		Dim b
		Dim c
		Dim d
		
		Const S11 = 7
		Const S12 = 12
		Const S13 = 17
		Const S14 = 22
		Const S21 = 5
		Const S22 = 9
		Const S23 = 14
		Const S24 = 20
		Const S31 = 4
		Const S32 = 11
		Const S33 = 16
		Const S34 = 23
		Const S41 = 6
		Const S42 = 10
		Const S43 = 15
		Const S44 = 21
		
		x = ConvertToWordArray(str2bin(sMessage))
		
		a = &H67452301
		b = &HEFCDAB89
		c = &H98BADCFE
		d = &H10325476
		
		For k = 0 To UBound(x) Step 16
			AA = a
			BB = b
			CC = c
			DD = d
			
			md5_FF a, b, c, d, x(k + 0), S11, &HD76AA478
			md5_FF d, a, b, c, x(k + 1), S12, &HE8C7B756
			md5_FF c, d, a, b, x(k + 2), S13, &H242070DB
			md5_FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE
			md5_FF a, b, c, d, x(k + 4), S11, &HF57C0FAF
			md5_FF d, a, b, c, x(k + 5), S12, &H4787C62A
			md5_FF c, d, a, b, x(k + 6), S13, &HA8304613
			md5_FF b, c, d, a, x(k + 7), S14, &HFD469501
			md5_FF a, b, c, d, x(k + 8), S11, &H698098D8
			md5_FF d, a, b, c, x(k + 9), S12, &H8B44F7AF
			md5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1
			md5_FF b, c, d, a, x(k + 11), S14, &H895CD7BE
			md5_FF a, b, c, d, x(k + 12), S11, &H6B901122
			md5_FF d, a, b, c, x(k + 13), S12, &HFD987193
			md5_FF c, d, a, b, x(k + 14), S13, &HA679438E
			md5_FF b, c, d, a, x(k + 15), S14, &H49B40821
			
			md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562
			md5_GG d, a, b, c, x(k + 6), S22, &HC040B340
			md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51
			md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA
			md5_GG a, b, c, d, x(k + 5), S21, &HD62F105D
			md5_GG d, a, b, c, x(k + 10), S22, &H2441453
			md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681
			md5_GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8
			md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6
			md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6
			md5_GG c, d, a, b, x(k + 3), S23, &HF4D50D87
			md5_GG b, c, d, a, x(k + 8), S24, &H455A14ED
			md5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905
			md5_GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8
			md5_GG c, d, a, b, x(k + 7), S23, &H676F02D9
			md5_GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A
			
			md5_HH a, b, c, d, x(k + 5), S31, &HFFFA3942
			md5_HH d, a, b, c, x(k + 8), S32, &H8771F681
			md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122
			md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380C
			md5_HH a, b, c, d, x(k + 1), S31, &HA4BEEA44
			md5_HH d, a, b, c, x(k + 4), S32, &H4BDECFA9
			md5_HH c, d, a, b, x(k + 7), S33, &HF6BB4B60
			md5_HH b, c, d, a, x(k + 10), S34, &HBEBFBC70
			md5_HH a, b, c, d, x(k + 13), S31, &H289B7EC6
			md5_HH d, a, b, c, x(k + 0), S32, &HEAA127FA
			md5_HH c, d, a, b, x(k + 3), S33, &HD4EF3085
			md5_HH b, c, d, a, x(k + 6), S34, &H4881D05
			md5_HH a, b, c, d, x(k + 9), S31, &HD9D4D039
			md5_HH d, a, b, c, x(k + 12), S32, &HE6DB99E5
			md5_HH c, d, a, b, x(k + 15), S33, &H1FA27CF8
			md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665
			
			md5_II a, b, c, d, x(k + 0), S41, &HF4292244
			md5_II d, a, b, c, x(k + 7), S42, &H432AFF97
			md5_II c, d, a, b, x(k + 14), S43, &HAB9423A7
			md5_II b, c, d, a, x(k + 5), S44, &HFC93A039
			md5_II a, b, c, d, x(k + 12), S41, &H655B59C3
			md5_II d, a, b, c, x(k + 3), S42, &H8F0CCC92
			md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47D
			md5_II b, c, d, a, x(k + 1), S44, &H85845DD1
			md5_II a, b, c, d, x(k + 8), S41, &H6FA87E4F
			md5_II d, a, b, c, x(k + 15), S42, &HFE2CE6E0
			md5_II c, d, a, b, x(k + 6), S43, &HA3014314
			md5_II b, c, d, a, x(k + 13), S44, &H4E0811A1
			md5_II a, b, c, d, x(k + 4), S41, &HF7537E82
			md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235
			md5_II c, d, a, b, x(k + 2), S43, &H2AD7D2BB
			md5_II b, c, d, a, x(k + 9), S44, &HEB86D391
			
			a = AddUnsigned(a, AA)
			b = AddUnsigned(b, BB)
			c = AddUnsigned(c, CC)
			d = AddUnsigned(d, DD)
		Next
		
		MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
	End Function
%>