ASP 的Base64加密 與ASP MD5加密

來源:互聯網
上載者:User

 

<%'Base64加減密Dim Base64CharsBase64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"' Functions for encoding string to Base64Public Function base64_encode(byVal strIn)    Dim c1, c2, c3, w1, w2, w3, w4, n, strOut    For n = 1 To Len(strIn) Step 3        c1 = Asc(Mid(strIn, n, 1))        c2 = Asc(Mid(strIn, n + 1, 1) + Chr(0))        c3 = Asc(Mid(strIn, n + 2, 1) + Chr(0))        w1 = Int(c1 / 4) : w2 = (c1 And 3) * 16 + Int(c2 / 16)        If Len(strIn) >= n + 1 Then             w3 = (c2 And 15) * 4 + Int(c3 / 64)         Else             w3 = -1        End If        If Len(strIn) >= n + 2 Then             w4 = c3 And 63         Else             w4 = -1        End If        strOut = strOut + mimeencode(w1) + mimeencode(w2) + _                  mimeencode(w3) + mimeencode(w4)    Next    base64_encode = strOutEnd FunctionPrivate Function mimeencode(byVal intIn)    If intIn >= 0 Then         mimeencode = Mid(Base64Chars, intIn + 1, 1)     Else         mimeencode = ""    End IfEnd Function    ' Function to decode string from Base64Public Function base64_decode(byVal strIn)    Dim w1, w2, w3, w4, n, strOut    For n = 1 To Len(strIn) Step 4        w1 = mimedecode(Mid(strIn, n, 1))        w2 = mimedecode(Mid(strIn, n + 1, 1))        w3 = mimedecode(Mid(strIn, n + 2, 1))        w4 = mimedecode(Mid(strIn, n + 3, 1))        If w2 >= 0 Then _            strOut = strOut + _                Chr(((w1 * 4 + Int(w2 / 16)) And 255))        If w3 >= 0 Then _            strOut = strOut + _                Chr(((w2 * 16 + Int(w3 / 4)) And 255))        If w4 >= 0 Then _            strOut = strOut + _                Chr(((w3 * 64 + w4) And 255))    Next    base64_decode = strOutEnd FunctionPrivate Function mimedecode(byVal strIn)    If Len(strIn) = 0 Then         mimedecode = -1 : Exit Function    Else        mimedecode = InStr(Base64Chars, strIn) - 1    End IfEnd Function%><%'MD5 加減密演算法private const bits_to_a_byte = 8private const bytes_to_a_word = 4private const bits_to_a_word = 32private m_lonbits(30)private m_l2power(30)private function lshift(lvalue, ishiftbits)if ishiftbits = 0 thenlshift = lvalueexit functionelseif ishiftbits = 31 thenif lvalue and 1 thenlshift = &h80000000elselshift = 0end ifexit functionelseif ishiftbits < 0 or ishiftbits > 31 thenerr.raise 6end ifif (lvalue and m_l2power(31 - ishiftbits)) thenlshift = ((lvalue and m_lonbits(31 - (ishiftbits + 1))) * m_l2power(ishiftbits)) or &h80000000elselshift = ((lvalue and m_lonbits(31 - ishiftbits)) * m_l2power(ishiftbits))end ifend functionprivate function rshift(lvalue, ishiftbits)if ishiftbits = 0 thenrshift = lvalueexit functionelseif ishiftbits = 31 thenif lvalue and &h80000000 thenrshift = 1elsershift = 0end ifexit functionelseif ishiftbits < 0 or ishiftbits > 31 thenerr.raise 6end ifrshift = (lvalue and &h7ffffffe) \ m_l2power(ishiftbits)if (lvalue and &h80000000) thenrshift = (rshift or (&h40000000 \ m_l2power(ishiftbits - 1)))end ifend functionprivate function rotateleft(lvalue, ishiftbits)rotateleft = lshift(lvalue, ishiftbits) or rshift(lvalue, (32 - ishiftbits))end functionprivate function addunsigned(lx, ly)dim lx4dim ly4dim lx8dim ly8dim lresultlx8 = lx and &h80000000ly8 = ly and &h80000000lx4 = lx and &h40000000ly4 = ly and &h40000000lresult = (lx and &h3fffffff) + (ly and &h3fffffff)if lx4 and ly4 thenlresult = lresult xor &h80000000 xor lx8 xor ly8elseif lx4 or ly4 thenif lresult and &h40000000 thenlresult = lresult xor &hc0000000 xor lx8 xor ly8elselresult = lresult xor &h40000000 xor lx8 xor ly8end ifelselresult = lresult xor lx8 xor ly8end ifaddunsigned = lresultend functionprivate function md5_f(x, y, z)md5_f = (x and y) or ((not x) and z)end functionprivate function md5_g(x, y, z)md5_g = (x and z) or (y and (not z))end functionprivate function md5_h(x, y, z)md5_h = (x xor y xor z)end functionprivate function md5_i(x, y, z)md5_i = (y xor (x or (not z)))end functionprivate 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 subprivate 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 subprivate 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 subprivate 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 subprivate function converttowordarray(smessage)dim lmessagelengthdim lnumberofwordsdim lwordarray()dim lbytepositiondim lbytecountdim lwordcountconst modulus_bits = 512const congruent_bits = 448lmessagelength = len(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 = 0lbytecount = 0do until lbytecount >= lmessagelengthlwordcount = lbytecount \ bytes_to_a_wordlbyteposition = (lbytecount mod bytes_to_a_word) * bits_to_a_bytelwordarray(lwordcount) = lwordarray(lwordcount) or lshift(asc(mid(smessage, lbytecount + 1, 1)), lbyteposition)lbytecount = lbytecount + 1looplwordcount = lbytecount \ bytes_to_a_wordlbyteposition = (lbytecount mod bytes_to_a_word) * bits_to_a_bytelwordarray(lwordcount) = lwordarray(lwordcount) or lshift(&h80, lbyteposition)lwordarray(lnumberofwords - 2) = lshift(lmessagelength, 3)lwordarray(lnumberofwords - 1) = rshift(lmessagelength, 29)converttowordarray = lwordarrayend functionprivate function wordtohex(lvalue)dim lbytedim lcountfor lcount = 0 to 3lbyte = rshift(lvalue, lcount * bits_to_a_byte) and m_lonbits(bits_to_a_byte - 1)wordtohex = wordtohex & right("0" & hex(lbyte), 2)nextend functionpublic 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 xdim kdim aadim bbdim ccdim dddim adim bdim cdim dconst s11 = 7const s12 = 12const s13 = 17const s14 = 22const s21 = 5const s22 = 9const s23 = 14const s24 = 20const s31 = 4const s32 = 11const s33 = 16const s34 = 23const s41 = 6const s42 = 10const s43 = 15const s44 = 21x = converttowordarray(smessage)a = &h67452301b = &hefcdab89c = &h98badcfed = &h10325476for k = 0 to ubound(x) step 16aa = abb = bcc = cdd = dmd5_ff a, b, c, d, x(k + 0), s11, &hd76aa478md5_ff d, a, b, c, x(k + 1), s12, &he8c7b756md5_ff c, d, a, b, x(k + 2), s13, &h242070dbmd5_ff b, c, d, a, x(k + 3), s14, &hc1bdceeemd5_ff a, b, c, d, x(k + 4), s11, &hf57c0fafmd5_ff d, a, b, c, x(k + 5), s12, &h4787c62amd5_ff c, d, a, b, x(k + 6), s13, &ha8304613md5_ff b, c, d, a, x(k + 7), s14, &hfd469501md5_ff a, b, c, d, x(k + 8), s11, &h698098d8md5_ff d, a, b, c, x(k + 9), s12, &h8b44f7afmd5_ff c, d, a, b, x(k + 10), s13, &hffff5bb1md5_ff b, c, d, a, x(k + 11), s14, &h895cd7bemd5_ff a, b, c, d, x(k + 12), s11, &h6b901122md5_ff d, a, b, c, x(k + 13), s12, &hfd987193md5_ff c, d, a, b, x(k + 14), s13, &ha679438emd5_ff b, c, d, a, x(k + 15), s14, &h49b40821md5_gg a, b, c, d, x(k + 1), s21, &hf61e2562md5_gg d, a, b, c, x(k + 6), s22, &hc040b340md5_gg c, d, a, b, x(k + 11), s23, &h265e5a51md5_gg b, c, d, a, x(k + 0), s24, &he9b6c7aamd5_gg a, b, c, d, x(k + 5), s21, &hd62f105dmd5_gg d, a, b, c, x(k + 10), s22, &h2441453md5_gg c, d, a, b, x(k + 15), s23, &hd8a1e681md5_gg b, c, d, a, x(k + 4), s24, &he7d3fbc8md5_gg a, b, c, d, x(k + 9), s21, &h21e1cde6md5_gg d, a, b, c, x(k + 14), s22, &hc33707d6md5_gg c, d, a, b, x(k + 3), s23, &hf4d50d87md5_gg b, c, d, a, x(k + 8), s24, &h455a14edmd5_gg a, b, c, d, x(k + 13), s21, &ha9e3e905md5_gg d, a, b, c, x(k + 2), s22, &hfcefa3f8md5_gg c, d, a, b, x(k + 7), s23, &h676f02d9md5_gg b, c, d, a, x(k + 12), s24, &h8d2a4c8amd5_hh a, b, c, d, x(k + 5), s31, &hfffa3942md5_hh d, a, b, c, x(k + 8), s32, &h8771f681md5_hh c, d, a, b, x(k + 11), s33, &h6d9d6122md5_hh b, c, d, a, x(k + 14), s34, &hfde5380cmd5_hh a, b, c, d, x(k + 1), s31, &ha4beea44md5_hh d, a, b, c, x(k + 4), s32, &h4bdecfa9md5_hh c, d, a, b, x(k + 7), s33, &hf6bb4b60md5_hh b, c, d, a, x(k + 10), s34, &hbebfbc70md5_hh a, b, c, d, x(k + 13), s31, &h289b7ec6md5_hh d, a, b, c, x(k + 0), s32, &heaa127famd5_hh c, d, a, b, x(k + 3), s33, &hd4ef3085md5_hh b, c, d, a, x(k + 6), s34, &h4881d05md5_hh a, b, c, d, x(k + 9), s31, &hd9d4d039md5_hh d, a, b, c, x(k + 12), s32, &he6db99e5md5_hh c, d, a, b, x(k + 15), s33, &h1fa27cf8md5_hh b, c, d, a, x(k + 2), s34, &hc4ac5665md5_ii a, b, c, d, x(k + 0), s41, &hf4292244md5_ii d, a, b, c, x(k + 7), s42, &h432aff97md5_ii c, d, a, b, x(k + 14), s43, &hab9423a7md5_ii b, c, d, a, x(k + 5), s44, &hfc93a039md5_ii a, b, c, d, x(k + 12), s41, &h655b59c3md5_ii d, a, b, c, x(k + 3), s42, &h8f0ccc92md5_ii c, d, a, b, x(k + 10), s43, &hffeff47dmd5_ii b, c, d, a, x(k + 1), s44, &h85845dd1md5_ii a, b, c, d, x(k + 8), s41, &h6fa87e4fmd5_ii d, a, b, c, x(k + 15), s42, &hfe2ce6e0md5_ii c, d, a, b, x(k + 6), s43, &ha3014314md5_ii b, c, d, a, x(k + 13), s44, &h4e0811a1md5_ii a, b, c, d, x(k + 4), s41, &hf7537e82md5_ii d, a, b, c, x(k + 11), s42, &hbd3af235md5_ii c, d, a, b, x(k + 2), s43, &h2ad7d2bbmd5_ii b, c, d, a, x(k + 9), s44, &heb86d391a = addunsigned(a, aa)b = addunsigned(b, bb)c = addunsigned(c, cc)d = addunsigned(d, dd)nextmd5 = lcase(wordtohex(a) & wordtohex(b) & wordtohex(c) & wordtohex(d))'md5=lcase(wordtohex(b) & wordtohex(c)) 'i crop this to fit 16byte database password :dmd5=ucase(md5)end functionpublic function md5_16(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 xdim kdim aadim bbdim ccdim dddim adim bdim cdim dconst s11 = 7const s12 = 12const s13 = 17const s14 = 22const s21 = 5const s22 = 9const s23 = 14const s24 = 20const s31 = 4const s32 = 11const s33 = 16const s34 = 23const s41 = 6const s42 = 10const s43 = 15const s44 = 21x = converttowordarray(smessage)a = &h67452301b = &hefcdab89c = &h98badcfed = &h10325476for k = 0 to ubound(x) step 16aa = abb = bcc = cdd = dmd5_ff a, b, c, d, x(k + 0), s11, &hd76aa478md5_ff d, a, b, c, x(k + 1), s12, &he8c7b756md5_ff c, d, a, b, x(k + 2), s13, &h242070dbmd5_ff b, c, d, a, x(k + 3), s14, &hc1bdceeemd5_ff a, b, c, d, x(k + 4), s11, &hf57c0fafmd5_ff d, a, b, c, x(k + 5), s12, &h4787c62amd5_ff c, d, a, b, x(k + 6), s13, &ha8304613md5_ff b, c, d, a, x(k + 7), s14, &hfd469501md5_ff a, b, c, d, x(k + 8), s11, &h698098d8md5_ff d, a, b, c, x(k + 9), s12, &h8b44f7afmd5_ff c, d, a, b, x(k + 10), s13, &hffff5bb1md5_ff b, c, d, a, x(k + 11), s14, &h895cd7bemd5_ff a, b, c, d, x(k + 12), s11, &h6b901122md5_ff d, a, b, c, x(k + 13), s12, &hfd987193md5_ff c, d, a, b, x(k + 14), s13, &ha679438emd5_ff b, c, d, a, x(k + 15), s14, &h49b40821md5_gg a, b, c, d, x(k + 1), s21, &hf61e2562md5_gg d, a, b, c, x(k + 6), s22, &hc040b340md5_gg c, d, a, b, x(k + 11), s23, &h265e5a51md5_gg b, c, d, a, x(k + 0), s24, &he9b6c7aamd5_gg a, b, c, d, x(k + 5), s21, &hd62f105dmd5_gg d, a, b, c, x(k + 10), s22, &h2441453md5_gg c, d, a, b, x(k + 15), s23, &hd8a1e681md5_gg b, c, d, a, x(k + 4), s24, &he7d3fbc8md5_gg a, b, c, d, x(k + 9), s21, &h21e1cde6md5_gg d, a, b, c, x(k + 14), s22, &hc33707d6md5_gg c, d, a, b, x(k + 3), s23, &hf4d50d87md5_gg b, c, d, a, x(k + 8), s24, &h455a14edmd5_gg a, b, c, d, x(k + 13), s21, &ha9e3e905md5_gg d, a, b, c, x(k + 2), s22, &hfcefa3f8md5_gg c, d, a, b, x(k + 7), s23, &h676f02d9md5_gg b, c, d, a, x(k + 12), s24, &h8d2a4c8amd5_hh a, b, c, d, x(k + 5), s31, &hfffa3942md5_hh d, a, b, c, x(k + 8), s32, &h8771f681md5_hh c, d, a, b, x(k + 11), s33, &h6d9d6122md5_hh b, c, d, a, x(k + 14), s34, &hfde5380cmd5_hh a, b, c, d, x(k + 1), s31, &ha4beea44md5_hh d, a, b, c, x(k + 4), s32, &h4bdecfa9md5_hh c, d, a, b, x(k + 7), s33, &hf6bb4b60md5_hh b, c, d, a, x(k + 10), s34, &hbebfbc70md5_hh a, b, c, d, x(k + 13), s31, &h289b7ec6md5_hh d, a, b, c, x(k + 0), s32, &heaa127famd5_hh c, d, a, b, x(k + 3), s33, &hd4ef3085md5_hh b, c, d, a, x(k + 6), s34, &h4881d05md5_hh a, b, c, d, x(k + 9), s31, &hd9d4d039md5_hh d, a, b, c, x(k + 12), s32, &he6db99e5md5_hh c, d, a, b, x(k + 15), s33, &h1fa27cf8md5_hh b, c, d, a, x(k + 2), s34, &hc4ac5665md5_ii a, b, c, d, x(k + 0), s41, &hf4292244md5_ii d, a, b, c, x(k + 7), s42, &h432aff97md5_ii c, d, a, b, x(k + 14), s43, &hab9423a7md5_ii b, c, d, a, x(k + 5), s44, &hfc93a039md5_ii a, b, c, d, x(k + 12), s41, &h655b59c3md5_ii d, a, b, c, x(k + 3), s42, &h8f0ccc92md5_ii c, d, a, b, x(k + 10), s43, &hffeff47dmd5_ii b, c, d, a, x(k + 1), s44, &h85845dd1md5_ii a, b, c, d, x(k + 8), s41, &h6fa87e4fmd5_ii d, a, b, c, x(k + 15), s42, &hfe2ce6e0md5_ii c, d, a, b, x(k + 6), s43, &ha3014314md5_ii b, c, d, a, x(k + 13), s44, &h4e0811a1md5_ii a, b, c, d, x(k + 4), s41, &hf7537e82md5_ii d, a, b, c, x(k + 11), s42, &hbd3af235md5_ii c, d, a, b, x(k + 2), s43, &h2ad7d2bbmd5_ii b, c, d, a, x(k + 9), s44, &heb86d391a = 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))md5_16=lcase(wordtohex(b) & wordtohex(c)) 'i crop this to fit 16byte database password :dmd5_16=ucase(md5_16)end function%><%Dim b b=base64_encode("jifeng") '注意:&和lt,&和gt之間的空格去掉!!我是為了不在baidu上顯示出來! response.write b response.write "<br/>"b=base64_decode("NjEwNDAzMTk4NDAzMjYwMDQ0")response.write bresponse.write "<br/>"response.write MD5("jifeng")response.end %> 

頁面顯示結果:

amlmZW5n
7788119
92497696BBC8C1CBF141FC116CB117F6

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.