Page 1 of 1

Rabbit stream cipher include (x86) (8 Jun 2014)

Posted: Sun Jun 08, 2014 12:45 pm
by Inf0Byt3
For the sake of improving PB's crypto capabilities, I present to you an implementation of the Rabbit stream cipher. It has a key size of 128 bits (16 bytes) and an IV size of 64 bits (8 bytes). It was developed by Cryptico A/S as a high-speed synchronous cipher and it was patented, but as of 2008 the designers released the cipher into the public domain and now it's free for any use (see here). More information about it can be found here:

http://en.wikipedia.org/wiki/Rabbit_%28cipher%29
http://cryptico.com/cryptolab.html
http://www.ecrypt.eu.org/stream/e2-rabbit.html
http://tools.ietf.org/html/rfc4503

Please have a look at the implementation code before using it in your own software just in case I overlooked something.

Rabbit.pbi

Code: Select all

;/----------------------------------------------------------------------------------
;
; Include description : The Rabbit stream cipher
; Algo designers      : Martin Boesgaard, Mette Vesterager, Thomas Pedersen,
;                       Jesper Christiansen and Ove Scavenius
; More info           : http://en.wikipedia.org/wiki/Rabbit_%28cipher%29
;                       http://cryptico.com/cryptolab.html
;                       http://www.ecrypt.eu.org/stream/e2-rabbit.html
;                       http://tools.ietf.org/html/rfc4503
; Cryptanalysis       : Rabbit claims 128-bit security against attackers whose target
;                       is one specific key. If, however, the attacker targets a large
;                       number of keys at once and does not really care which one he
;                       breaks, then the small IV size results in a reduced security
;                       level of 96 bit. This is due to generic TMD trade-off attacks.
;                       A small bias in the output of Rabbit exists, resulting in a
;                       distinguisher with 2^158 complexity but it's not a threat to
;                       Rabbit's security because its complexity is significantly higher
;                       than the brute-force of the key space (2^128).
; Impl. author        : Alexandru Trutia based on the original from Cryptico A/S
; Date                : 08 Jun 2014
; Version             : 1.0
; Target Compiler     : PureBasic 5.22+
; Target OS           : Windows x86 (not tested on any other operating systems)
; License             : Free, unrestricted, no warranty whatsoever
;                       Use at your own risk
; Additional notes    : 1. After using RABBIT_process_bytes to encrypt or decrypt data,
;                       RABBIT_ivsetup must be called again to set the IV before
;                       encrypting or decrypting data again with RABBIT_process_bytes
;                       2. Cryptico had patents pending for the algorithm and for many
;                       years required a license fee for commercial use of the cipher
;                       which was waived for non-commercial uses. However, the algorithm
;                       was made free for any use on October 6, 2008.
;
;/----------------------------------------------------------------------------------

EnableExplicit

Structure RABBIT_state
  x.l[8]
  c.l[8]
  carry.l
EndStructure
Structure RABBIT_ctx
  master.RABBIT_state
  work.RABBIT_state
EndStructure
Structure asciiarray
  a.a[0]
EndStructure
Structure longarray
  l.l[0]
EndStructure

;-----------------------------------------------------------------------------------

Procedure.l shl32(value.l, count.l = 1)
  ;by mk-soft
  ;found here: http://forums.purebasic.com/english/viewtopic.php?p=272695&sid=0269f75f2190bc2765a21c29c86e8ae5#p272695
  !mov eax, dword [p.v_value] 
  !mov ecx, dword [p.v_count]
  !shl eax, cl
  ProcedureReturn
EndProcedure

Procedure.l shr32(value.l, count.l = 1)
  ;by mk-soft
  ;found here: http://forums.purebasic.com/english/viewtopic.php?p=272695&sid=0269f75f2190bc2765a21c29c86e8ae5#p272695
  !mov eax, dword [p.v_value] 
  !mov ecx, dword [p.v_count]
  !shr eax, cl
  ProcedureReturn
EndProcedure

Procedure.l rotl32(value.l, count.l = 1)
  ;by mk-soft
  ;found here: http://forums.purebasic.com/english/viewtopic.php?p=272695&sid=0269f75f2190bc2765a21c29c86e8ae5#p272695
  !mov eax, dword [p.v_value] 
  !mov ecx, dword [p.v_count]
  !rol eax, cl
  ProcedureReturn
EndProcedure

;-----------------------------------------------------------------------------------

Macro RABBIT_U32V(Value)
  (Value & $FFFFFFFF)
EndMacro

Macro RABBIT_U32ST(a, b, c, isproc)
  ;Compares unsigned integers a and b as below:
  ;If (uint32)a < (uint32)b then
  ;  (byte)c = 1 
  ;Else
  ;  (byte)c = 0
  ;Endif
  CompilerIf isproc = 1
    !mov ebx,dword[p.v_#a]
    !cmp ebx,[p.v_#b]
    !setb byte [p.v_#c]
  CompilerElse
    !mov ebx,dword[v_#a]
    !cmp ebx,[v_#b]
    !setb byte [v_#c]
  CompilerEndIf
EndMacro

Macro RABBIT_g_func(x, y)
  ;Construct high and low argument for squaring
  a = x & $FFFF
  b = shr32(x, 16) & $FFFF
  ;Calculate high and low result of squaring
  h = shr32((shr32(RABBIT_U32V(a * a), 17) + RABBIT_U32V(a * b)), 15) + b * b
  l = x * x
  ;Return high XOr low
  y = RABBIT_U32V(h ! l)
EndMacro

Procedure RABBIT_U8TO32(*in.asciiarray)
  ProcedureReturn *in\a[0] + (*in\a[1] << 8) + (*in\a[2] << 16) + (*in\a[3] << 24)
EndProcedure

Procedure RABBIT_next_state(*p_instance.RABBIT_state)
  ;Temporary variables
  Dim g.l(7)
  Dim c_old.l(7)
  Protected i.l, j.l, k.a, a.l, b.l, h.l, l.l
  ;Save old counter values
  c_old(0) = *p_instance\c[0]
  c_old(1) = *p_instance\c[1]
  c_old(2) = *p_instance\c[2]
  c_old(3) = *p_instance\c[3]
  c_old(4) = *p_instance\c[4]
  c_old(5) = *p_instance\c[5]
  c_old(6) = *p_instance\c[6]
  c_old(7) = *p_instance\c[7]
  ;Calculate new counter values
  *p_instance\c[0] = RABBIT_U32V(*p_instance\c[0] + $4D34D34D + *p_instance\carry)
  i = *p_instance\c[0] : j =  c_old(0)
  RABBIT_U32ST(i, j, k, 1)
  *p_instance\c[1] = RABBIT_U32V(*p_instance\c[1] + $D34D34D3 + k)
  i = *p_instance\c[1] : j =  c_old(1)
  RABBIT_U32ST(i, j, k, 1)
  *p_instance\c[2] = RABBIT_U32V(*p_instance\c[2] + $34D34D34 + k)
  i = *p_instance\c[2] : j =  c_old(2)
  RABBIT_U32ST(i, j, k, 1)
  *p_instance\c[3] = RABBIT_U32V(*p_instance\c[3] + $4D34D34D + k)
  i = *p_instance\c[3] : j =  c_old(3)
  RABBIT_U32ST(i, j, k, 1)
  *p_instance\c[4] = RABBIT_U32V(*p_instance\c[4] + $D34D34D3 + k)
  i = *p_instance\c[4] : j =  c_old(4)
  RABBIT_U32ST(i, j, k, 1)
  *p_instance\c[5] = RABBIT_U32V(*p_instance\c[5] + $34D34D34 + k)
  i = *p_instance\c[5] : j =  c_old(5)
  RABBIT_U32ST(i, j, k, 1)
  *p_instance\c[6] = RABBIT_U32V(*p_instance\c[6] + $4D34D34D + k)
  i = *p_instance\c[6] : j =  c_old(6)
  RABBIT_U32ST(i, j, k, 1)
  *p_instance\c[7] = RABBIT_U32V(*p_instance\c[7] + $D34D34D3 + k)
  i = *p_instance\c[7] : j =  c_old(7)
  RABBIT_U32ST(i, j, k, 1)
  *p_instance\carry = k
  ;Calculate the g-values
  RABBIT_g_func(RABBIT_U32V(*p_instance\x[0] + *p_instance\c[0]), g(0))
  RABBIT_g_func(RABBIT_U32V(*p_instance\x[1] + *p_instance\c[1]), g(1))
  RABBIT_g_func(RABBIT_U32V(*p_instance\x[2] + *p_instance\c[2]), g(2))
  RABBIT_g_func(RABBIT_U32V(*p_instance\x[3] + *p_instance\c[3]), g(3))
  RABBIT_g_func(RABBIT_U32V(*p_instance\x[4] + *p_instance\c[4]), g(4))
  RABBIT_g_func(RABBIT_U32V(*p_instance\x[5] + *p_instance\c[5]), g(5))
  RABBIT_g_func(RABBIT_U32V(*p_instance\x[6] + *p_instance\c[6]), g(6))
  RABBIT_g_func(RABBIT_U32V(*p_instance\x[7] + *p_instance\c[7]), g(7))
  ;Calculate new state values
  *p_instance\x[0] = RABBIT_U32V(g(0) + rotl32(g(7),16) + rotl32(g(6), 16))
  *p_instance\x[1] = RABBIT_U32V(g(1) + rotl32(g(0), 8) + g(7))
  *p_instance\x[2] = RABBIT_U32V(g(2) + rotl32(g(1),16) + rotl32(g(0), 16))
  *p_instance\x[3] = RABBIT_U32V(g(3) + rotl32(g(2), 8) + g(1))
  *p_instance\x[4] = RABBIT_U32V(g(4) + rotl32(g(3),16) + rotl32(g(2), 16))
  *p_instance\x[5] = RABBIT_U32V(g(5) + rotl32(g(4), 8) + g(3))
  *p_instance\x[6] = RABBIT_U32V(g(6) + rotl32(g(5),16) + rotl32(g(4), 16))
  *p_instance\x[7] = RABBIT_U32V(g(7) + rotl32(g(6), 8) + g(5))
EndProcedure

;-----------------------------------------------------------------------------------

; Key setup. It is the user's responsibility to select the values of
; keysize and ivsize from the set of supported values specified
; above (keysize = 128 and ivsize = 64) in bits.

Procedure RABBIT_keysetup(*ctx.RABBIT_ctx, *key, keysize, ivsize)
  ;Temporary variables
  Protected k0.l, k1.l, k2.l, k3.l
  ;Generate four subkeys
  k0 = RABBIT_U8TO32(*key + 0)
  k1 = RABBIT_U8TO32(*key + 4)
  k2 = RABBIT_U8TO32(*key + 8)
  k3 = RABBIT_U8TO32(*key + 12)
  ;Generate initial state variables
  *ctx\master\x[0] = k0
  *ctx\master\x[2] = k1
  *ctx\master\x[4] = k2
  *ctx\master\x[6] = k3
  *ctx\master\x[1] = RABBIT_U32V(shl32(k3, 16)) | shr32(k2, 16)
  *ctx\master\x[3] = RABBIT_U32V(shl32(k0, 16)) | shr32(k3, 16)
  *ctx\master\x[5] = RABBIT_U32V(shl32(k1, 16)) | shr32(k0, 16)
  *ctx\master\x[7] = RABBIT_U32V(shl32(k2, 16)) | shr32(k1, 16)
  ;Generate initial counter values
  *ctx\master\c[0] = rotl32(k2, 16)
  *ctx\master\c[2] = rotl32(k3, 16)
  *ctx\master\c[4] = rotl32(k0, 16)
  *ctx\master\c[6] = rotl32(k1, 16)
  *ctx\master\c[1] = (k0 & $FFFF0000) | (k1 & $FFFF)
  *ctx\master\c[3] = (k1 & $FFFF0000) | (k2 & $FFFF)
  *ctx\master\c[5] = (k2 & $FFFF0000) | (k3 & $FFFF)
  *ctx\master\c[7] = (k3 & $FFFF0000) | (k0 & $FFFF)
  ;Clear carry bit
  *ctx\master\carry = 0
  ;Iterate the system four times
  RABBIT_next_state(@*ctx\master)
  RABBIT_next_state(@*ctx\master)
  RABBIT_next_state(@*ctx\master)
  RABBIT_next_state(@*ctx\master)
  ;Modify the counters
  *ctx\master\c[0] ! *ctx\master\x[(4)  & $7]
  *ctx\master\c[1] ! *ctx\master\x[(5)  & $7]
  *ctx\master\c[2] ! *ctx\master\x[(6)  & $7]
  *ctx\master\c[3] ! *ctx\master\x[(7)  & $7]
  *ctx\master\c[4] ! *ctx\master\x[(8)  & $7]
  *ctx\master\c[5] ! *ctx\master\x[(9)  & $7]
  *ctx\master\c[6] ! *ctx\master\x[(10) & $7]
  *ctx\master\c[7] ! *ctx\master\x[(11) & $7]
  ;Copy master instance to work instance
  *ctx\work\x[0] = *ctx\master\x[0] : *ctx\work\c[0] = *ctx\master\c[0]
  *ctx\work\x[1] = *ctx\master\x[1] : *ctx\work\c[1] = *ctx\master\c[1]
  *ctx\work\x[2] = *ctx\master\x[2] : *ctx\work\c[2] = *ctx\master\c[2]
  *ctx\work\x[3] = *ctx\master\x[3] : *ctx\work\c[3] = *ctx\master\c[3]
  *ctx\work\x[4] = *ctx\master\x[4] : *ctx\work\c[4] = *ctx\master\c[4]
  *ctx\work\x[5] = *ctx\master\x[5] : *ctx\work\c[5] = *ctx\master\c[5]
  *ctx\work\x[6] = *ctx\master\x[6] : *ctx\work\c[6] = *ctx\master\c[6]
  *ctx\work\x[7] = *ctx\master\x[7] : *ctx\work\c[7] = *ctx\master\c[7]
  *ctx\work\carry = *ctx\master\carry
EndProcedure

; IV setup. After having called RABBIT_keysetup(), the user is
; allowed To call RABBIT_ivsetup() different times in order to
; encrypt/decrypt different messages with the same key but different
; IV's.

Procedure RABBIT_ivsetup(*ctx.RABBIT_ctx, *iv)
  ;Temporary variables
  Protected i0.l, i1.l, i2.l, i3.l, i.l
  ;Generate four subvectors
  i0 = RABBIT_U8TO32(*iv + 0)
  i2 = RABBIT_U8TO32(*iv + 4)
  i1 = shr32(i0, 16) | (i2 & $FFFF0000)
  i3 = shl32(i2, 16) | (i0 & $0000FFFF)
  ;Modify counter values
  *ctx\work\c[0] = *ctx\master\c[0] ! i0
  *ctx\work\c[1] = *ctx\master\c[1] ! i1
  *ctx\work\c[2] = *ctx\master\c[2] ! i2
  *ctx\work\c[3] = *ctx\master\c[3] ! i3
  *ctx\work\c[4] = *ctx\master\c[4] ! i0
  *ctx\work\c[5] = *ctx\master\c[5] ! i1
  *ctx\work\c[6] = *ctx\master\c[6] ! i2
  *ctx\work\c[7] = *ctx\master\c[7] ! i3
  ;Copy state variables
  i = 0
  While i < 8
    *ctx\work\x[i] = *ctx\master\x[i]
    i + 1
  Wend
  *ctx\work\carry = *ctx\master\carry
  ;Iterate the system four times
  i = 0
  While i < 4
    RABBIT_next_state(@*ctx\work)
    i + 1
  Wend
EndProcedure

; Encryption/decryption of arbitrary length messages.
; The ECRYPT_encrypt_bytes() function (declared here) encrypts byte
; strings of arbitrary length.
; The user is NOT allowed to make additional encryption calls once he
; has called ECRYPT_encrypt_bytes() (unless he starts a new message
; of course). 

Procedure RABBIT_process_bytes(*ctx.RABBIT_ctx, *input.longarray, *output.longarray, msglen)
  ;Temporary variables
  Protected i.l, *in.asciiarray, *out.asciiarray, *ks.asciiarray
  Dim buffer.l(3)
  ;Encrypt/decrypt all full block
  While msglen >= 16
    ;Iterate the system
    RABBIT_next_state(@*ctx\work)
    ;Encrypt/decrypt 16 bytes of data
    *output\l[0] = *input\l[0] ! *ctx\work\x[0] ! shr32(*ctx\work\x[5], 16) ! RABBIT_U32V(shl32(*ctx\work\x[3], 16))
    *output\l[1] = *input\l[1] ! *ctx\work\x[2] ! shr32(*ctx\work\x[7], 16) ! RABBIT_U32V(shl32(*ctx\work\x[5], 16))
    *output\l[2] = *input\l[2] ! *ctx\work\x[4] ! shr32(*ctx\work\x[1], 16) ! RABBIT_U32V(shl32(*ctx\work\x[7], 16))
    *output\l[3] = *input\l[3] ! *ctx\work\x[6] ! shr32(*ctx\work\x[3], 16) ! RABBIT_U32V(shl32(*ctx\work\x[1], 16))
    ;Increment pointers And decrement length
    *input + 16
    *output + 16
    msglen - 16
  Wend
  ;Encrypt/decrypt remaining data
  If msglen > 0
    ;Iterate the system
    RABBIT_next_state(@*ctx\work)
    ;Generate 16 bytes of pseudo-random data
    buffer(0) = *ctx\work\x[0] ! shr32(*ctx\work\x[5], 16) ! RABBIT_U32V(shl32(*ctx\work\x[3], 16))
    buffer(1) = *ctx\work\x[2] ! shr32(*ctx\work\x[7], 16) ! RABBIT_U32V(shl32(*ctx\work\x[5], 16))
    buffer(2) = *ctx\work\x[4] ! shr32(*ctx\work\x[1], 16) ! RABBIT_U32V(shl32(*ctx\work\x[7], 16))
    buffer(3) = *ctx\work\x[6] ! shr32(*ctx\work\x[3], 16) ! RABBIT_U32V(shl32(*ctx\work\x[1], 16))
    ;Encrypt/decrypt the data
    *in = *input
    *out = *output
    *ks = @buffer()
    While i < msglen
      *out\a[i] = *in\a[i] ! *ks\a[i]
      i + 1
    Wend
  EndIf
EndProcedure

;-----------------------------------------------------------------------------------

DisableExplicit
Examples below:

Re: Rabbit stream cipher include (x86) (8 Jun 2014)

Posted: Sun Jun 08, 2014 12:46 pm
by Inf0Byt3
Rabbit_VectorTest.pb

Code: Select all

;Needs RabbitTestVect.txt in the same dir

EnableExplicit
EnableDebugger

XIncludeFile "Rabbit.pbi"

Structure chararray
  c.c[0]
EndStructure

Procedure.i pokehex(*buff.asciiarray, *hexstring.chararray, hexstringlen)
  Protected byte1.c, byte2.c, counter1, counter2
  Repeat
    byte1 = *hexstring\c[counter1] - 48
    byte2 = *hexstring\c[counter1 + 1] - 48
    If byte1 > 10 : byte1 - 7 : EndIf
    If byte2 > 10 : byte2 - 7 : EndIf
    *buff\a[counter2] = (byte1 * 16) + byte2
    counter1 + 2
    counter2 + 1
  Until counter1 = hexstringlen
  ProcedureReturn counter2
EndProcedure

Define Vector.s, SKey.s, SIV.s, SIndex.s, SExpected.s, *In, *Out, *Key, *IV, Index, *Expected 
Define *ctx.RABBIT_ctx, Passed, Failed, Total

If ReadFile(0, "RabbitTestVect.txt")
  While Not Eof(0)
    Vector.s = ReadString(0) ;key|IV|startindex|expecteddata (the input data is always a buffer
    ;filled with 512-bytes of 0s)
    SKey.s = StringField(Vector, 1, "|")
    SIV.s = StringField(Vector, 2, "|")
    SIndex.s = StringField(Vector, 3, "|")
    SExpected.s = StringField(Vector, 4, "|")
    Index = Val(SIndex)
    *In = AllocateMemory(512 + Index, #PB_Memory_NoClear)
    *Out = AllocateMemory(512 + Index, #PB_Memory_NoClear)
    *Key = AllocateMemory(Len(SKey) / 2, #PB_Memory_NoClear)
    *IV = AllocateMemory(Len(SIV) / 2, #PB_Memory_NoClear)
    *Expected = AllocateMemory(64, #PB_Memory_NoClear)
    *ctx = AllocateMemory(SizeOf(RABBIT_ctx))
    pokehex(*Key, @SKey, Len(SKey))
    pokehex(*IV, @SIV, Len(SIV))
    pokehex(*Expected, @SExpected, Len(SExpected))
    RABBIT_keysetup(*ctx, *Key, 128, 64)
    RABBIT_ivsetup(*ctx, *IV)
    RABBIT_process_bytes(*ctx, *in, *out, 512 + Index)
    If CompareMemory(*Out + Index, *Expected, 64)
      Passed + 1
    Else
      Debug " !!! Fail: "+Vector
      Break
      Failed + 1
    EndIf
    Total + 1
    Debug "Tested vector #"+Str(Total)+" : failed so far: "+Str(Failed)
    FreeMemory(*In)
    FreeMemory(*Out)
    FreeMemory(*Key)
    FreeMemory(*IV)
    FreeMemory(*Expected)
    FreeMemory(*ctx)
  Wend
  Debug Str(Passed)+" tests were passed and "+Str(Failed)+" tests were failed!"
  CloseFile(0)
Else
  Debug "Error reading RabbitTestVect.txt!"
EndIf
Rabbit_StressTest.pb

Code: Select all

;This code encrypts and decrypts random data of arbitrary length

EnableExplicit
DisableDebugger ;Need for speed

XIncludeFile "Rabbit.pbi"

Procedure.s peekhex(*buff.asciiarray, bufflen)
  Protected loop, result.s
  While loop < bufflen
    Result + RSet(Hex(*buff\a[loop] & $FF ,#PB_Byte), 2, "0")
    loop + 1
  Wend
  ProcedureReturn result
EndProcedure

Define TotalLoops, Bar.s, BarC, TotalData, StartTime, Loops, Progress.f, TotalTime, Speed.f
Define *Ctx.RABBIT_ctx, *Key, OriginalLen, *Original, *Output, *Decrypted, *IV, Success, Clr

TotalLoops = 512

#MinLen = 512 * 1024
#MaxLen = #MinLen * 2

OpenConsole()
EnableGraphicalConsole(1)

Bar = "-\|/"
BarC = 1
TotalData = 1

If OpenCryptRandom() = 0
  PrintN("Error opening random generator!"):Beep_(1500,500):Input():End
EndIf

StartTime = ElapsedMilliseconds()

For Loops = 1 To TotalLoops
 
  Progress = Loops / TotalLoops * 100
  TotalTime = ElapsedMilliseconds() - StartTime
  Speed.f = TotalData / (TotalTime + 1) / 1000

  ConsoleLocate(0, 0)
  PrintN("-------------------------------")
  PrintN("Rabbit for PureBasic stress test, min buffer len: "+Str(#MinLen)+" ("+Str(#MinLen / 1024)+" KB)")
  PrintN("Rounds: "+Str(Loops)+" of "+Str(TotalLoops)+", "+StrF(Progress,2)+"% ready "+Mid(Bar, BarC, 1)) 
  BarC + 1 : If BarC = 5 : BarC = 1 : EndIf
  PrintN("Elapsed: "+Str(TotalTime/1000)+" s, speed: aprox. "+StrF(Speed,2)+" MB/s")
  PrintN("Total processed data: "+Str(TotalData)+" bytes ("+Str(TotalData / 1024 / 1024)+") MB")
  PrintN("The test is pretty slow, but it does random data encryption and")
  PrintN("decryption. Still, the implementation needs some speed improvements :-)")
  PrintN("Ctrl + C to end!")
  PrintN("-------------------------------")

  ;Create a context
  *Ctx = AllocateMemory(SizeOf(RABBIT_ctx))

  ;Make a random key
  *Key = AllocateMemory(16)
  CryptRandomData(*Key, 16)

  ;Make a buffer with random data
  OriginalLen = Random(#MaxLen, #MinLen)
  *Original = AllocateMemory(OriginalLen, #PB_Memory_NoClear)
  CryptRandomData(*Original, OriginalLen)
 
  ;Make an output and decryption buffer
  *Output = AllocateMemory(OriginalLen, #PB_Memory_NoClear)
  *Decrypted = AllocateMemory(OriginalLen, #PB_Memory_NoClear)

  ;Make an IV
  *IV = AllocateMemory(8)
  CryptRandomData(*IV, 8)

  ;Do the work
  RABBIT_keysetup(*ctx, *key, 128, 64)
  RABBIT_ivsetup(*ctx, *iv)
  RABBIT_process_bytes(*ctx, *Original, *Output, OriginalLen) ;enc
  TotalData + OriginalLen
  RABBIT_ivsetup(*ctx, *iv) ;[!] this has to be called again
  RABBIT_process_bytes(*ctx, *Output, *Decrypted, OriginalLen) ;dec
  TotalData + OriginalLen
 
  ;Check the work
  If CompareMemory(*Original, *Decrypted, OriginalLen) = 1
    Success = 1
  Else
    Success = 0
  EndIf

  ;Write status
  ConsoleLocate(0, 9)
  For Clr = 0 To 4
    PrintN(Space(80))
  Next
  ConsoleLocate(0, 9)
  PrintN("Key: "+PeekHEX(*Key, 16)+" (128 bit)")
  PrintN("IV: "+PeekHEX(*IV, 8))
  PrintN("Encrypted: "+Str(OriginalLen)+" bytes, output size: "+Str(OriginalLen))
  PrintN("Decrypted: "+Str(OriginalLen)+" bytes, output size: "+Str(OriginalLen))
  If Success = 1
    PrintN("Decryption successful!")
  Else
    PrintN("Error at decryption!"):Beep_(1500,500):Input():End
  EndIf
  PrintN("-------------------------------")
  ConsoleLocate(0, 16)
 
  ;Clean up
  FreeMemory(*Ctx)
  FreeMemory(*Key)
  FreeMemory(*Original)
  FreeMemory(*Output)
  FreeMemory(*Decrypted)
  FreeMemory(*IV)

Next

ConsoleLocate(0, 16)
PrintN("All rounds finished. Press Enter to quit.")

Input()

Re: Rabbit stream cipher include (x86) (8 Jun 2014)

Posted: Sun Jun 08, 2014 12:46 pm
by Inf0Byt3
RabbitTestVect.txt
80000000000000000000000000000000|0000000000000000|0|DCDCB614F738A20CE103637E58091766010B16EACD06A9108671B1EEEFE8CC172EC9402DD54C53079767A6299561EE5066A5DD404C4D6875F4B5D611B007B106
80000000000000000000000000000000|0000000000000000|448|63FB65776A91527C170EBFD625D0D5BB3715D348FA47C027FCA3AF0CA1A716D6304F2E82E888531FAB33A57E8230E36F0922F8C744BDD1755644D1C83352A958
00400000000000000000000000000000|0000000000000000|0|0847A3706C54B746E480F34DF10AC86EC67799AA56694ABBE8A2D10AB5B32D7B575DDAB74D2D8F37AFDF0923B9A1C5040DC31CF5A11E43A5E92B326A2A366D8A
00400000000000000000000000000000|0000000000000000|448|1A04CA6C992E6930A551A01D56B403CC2A348CD66FB7B5921051BF1D73A47F7F4C1CFB5EFC9395DDBA74374C2F27EA3BD656ACAA87D701CB09D39945482C5399
00002000000000000000000000000000|0000000000000000|0|178EDB78577D3F241A490303CC019F1DFD286FE86DC73287B43CF5CE60DB3D7F2A35768D44B8325F5F91A0AFCD8D8EEEB4F7188A087FBB156AF0833F669C11D2
00002000000000000000000000000000|0000000000000000|448|85FFCBD014E13679EA9AB9F0D4B2E453E5FDE7E41080B9A360A069DDEA8DA2CD6B69FB27FD8C1ABEFE63322B4A2F0A407ED2D6F7E4D4B80D2A79C0A6CDE4D367
00000010000000000000000000000000|0000000000000000|0|77FE705EE55BAB05978AA54D63071707009ADC8C18FC68A4D5941E0CAFB8E68CA218F1724EB5FA29485F0924F612AE670D975B485190040F9E112783D665E031
00000010000000000000000000000000|0000000000000000|448|091F49BDC8504F7FDCA3AA469F4C331E52C81B2C4458F8D5E9CFE7B2D649DEF1BBA70D51AFC4C3F713C1CFF92C819BB09BEC67AA7D45274B95D90F409209711A
00000000080000000000000000000000|0000000000000000|0|6414520BFA7AD13784F125CA63868602B83A834E403F6ED50F097107EFF80FE567987486EDC31CBFF000A52CB9AEDEA4B35F5DBD8438E901356A542A94232350
00000000080000000000000000000000|0000000000000000|448|63F7181EB551CAEE406A54BB95FA440136268D73758528ECB01620224661473DDF663FEAF506FA01F9A6B7FA5E4B5296E0CAD52A242275C346CC385EF3D04441
00000000000400000000000000000000|0000000000000000|0|BAA234DC594C3D1CC88CC9EC7D01273045D2E6157174BE898070ED8AED84988D07E8496AA0EEABCD0ED86F68F5705F25490DE5E3D40611E3E8AAC382E99EB7B7
00000000000400000000000000000000|0000000000000000|448|FB89F9AE501FC080F84285A080B12589548EB87D6926511E036151DB7AF7DA1DCE10635B672DB5BBD7437AE3234F0D99B2BC0619A2C87D322849946BF393F59E
00000000000002000000000000000000|0000000000000000|0|8105BB206CCCED69F9132B7FB44902BAC0C2206FB09AB8989A09A15562EAEDD63A7D1E9ADF90CA8A3F7107E452D5488CA386A722C4F73762C1E4672B0D01868E
00000000000002000000000000000000|0000000000000000|448|33453B4A5294C04C680420CBFC5D62DB4EB42F5B3535D3DDEF1845BB6A4B952B9A0D06018A0E3DE76DF672A94C067CAEF48B1D2EF19E78DDBD5112CFECE5834A
00000000000000010000000000000000|0000000000000000|0|B2F746E4CBC062068FA953B1EDC2C7C05BFFBAABC77CEBDC6D1C9C930C3DE23A2BE98C3EA3E2A49BFD2C7987DBD4516CFC6E5F81FC1F58EF9DA996D565B6FA21
00000000000000010000000000000000|0000000000000000|448|48CBA063235997E9E93A4D3F9E9941030680C0636ED64D055E057F7461A1B66071AEE9BC86EFF9EEABE02DFCDA753948A7C14057339314092CB3750CC4EDB7D3
00000000000000000080000000000000|0000000000000000|0|F6B2157EDE86467D5EB6AB4201F8C3FDF309ED03CC3B83213F31ADA62BAC10891A4A4FCC9C1586D47655594CA3D6873F175FB977B5C188707A72416EF64A7FBD
00000000000000000080000000000000|0000000000000000|448|19B0F855E69328BB3467ECE9C47C2F8DF389803CDECEFB7EFDB4D872527C05C0DB80286F0F606C2EC43F48B64CA2CEC577951C1DFF73024D5D52FA048EA47F58
00000000000000000000400000000000|0000000000000000|0|FBF7BF104F3EB499BCD76A4D90AB9F494DAB13F5888DB91FCB94AA36633841183F8DA5008EBA653A56CFE160D97CA7E9345D5262DDBF047E401DF8AA6A9C3660
00000000000000000000400000000000|0000000000000000|448|CA073241DEA3E74D0AD65B5B5BC3A728637C42263CE6ED5FB60760DEB770990139D6E784FF306C7B91FC9CA87B76059654EF5F0B0A1CD518D89C31AB13A97AB1
00000000000000000000002000000000|0000000000000000|0|A48202A2119A3809D95031267D92471F83774767C0F38A6D69D7A5FAE6827E2B687F878FD3582A83BD41AECCBA2A91897C7CC66C1BC7E090D17E5B22C7245136
00000000000000000000002000000000|0000000000000000|448|4D334A264A4596DE241152DC705C09FFC61E771659488096FD2B088456A067E3680C0C060BCB072B3F5553156048379B26845BAD16A0E6C996AD1E6B94926B63
00000000000000000000000010000000|0000000000000000|0|73A1348E48E50F450ABCEF31F8C777FB80754EDE5B17D226391FF1AE3394D81CE47B748155E1FB7EE5289CDDFB872A59083BDCAC8BF36DF8B7DF265EE1A5E4DB
00000000000000000000000010000000|0000000000000000|448|F313C6E3D2C09C36372AB808CD1D4BC2C1BF5C88409059935A812B059EE70513E96356B1525B6DA7C50EC0E3312EB5C312839384038A933C1C1D20276B76A16E
00000000000000000000000000080000|0000000000000000|0|AE8AAC412BC6B6F81AD0100B231A84BEEE3686E0ED509F08A7B40E432988321232198A234B5115F1360B4F93EA74F20F295FBDCD1805CA4D68145A9024B0754F
00000000000000000000000000080000|0000000000000000|448|D41C9F872600EEDFDACF659D9FFD92605944446D321E0CBD1B12C2106FD7CFDE7A2A5A52B9B3DDDD8253176B9C9F9F55687ED6A310F923978A2B27D99BDF32C3
00000000000000000000000000000400|0000000000000000|0|BED2F045FD3AE491375F44FF89915FB577B8AE4949BE93D027C999D4B0FA24B30DE2C9A498350F9D19879C477D791E31CD29D20E5575428B5035A26B4EBA52A4
00000000000000000000000000000400|0000000000000000|448|A408101324D5B636A4D67D11DEB3DC14911C7412181944C8268127303163F4FFFA4681D85352B1230ACD8663797A0C45A6DF090A2229B93C6EC7D08959919E42
00000000000000000000000000000002|0000000000000000|0|2668749B5D1436CC4A7C43AB4381EC91BF447D1F1F552F7C2493DACB72ADD9522A0A3397D2550C01CAA56B107BA2AF0C8A107A285BF087515E6973C128581B80
00000000000000000000000000000002|0000000000000000|448|610B5B3AA681D9A5B8A3FA34F1B273A0A1643935C609BEFE896CA2E91FD13D79B4423DA10E93CEF63C34F0CF9C552346C180D73C7AC283CD9E6193406038AC17
00000000000000000000000000000000|0000000000000000|0|EDB70567375DCD7CD89554F85E27A7C68D4ADC7032298F7BD4EFF504ACA6295F668FBF478ADB2BE51E6CDE292B82DE2AB48D2AC6565979220EC909A7E7576098
00000000000000000000000000000000|0000000000000000|448|109D5563D46DD78C2905F7D90036300C60326EBE3B1AA385FB75F1C5C7311BFD6DDA960C716C33E51C5A2B1906200C40CFF62FB5782A41BF816F7639C9341244
09090909090909090909090909090909|0000000000000000|0|E7F8DC75257F98D89124464C5DDCDC8693F8456B7FA2E2E0A907F6B4D9A56F2C86E5978203A6C8791C119D7AEC91D5CDF087AE3943091B2788B675353A0AB24A
09090909090909090909090909090909|0000000000000000|448|EB0629217238ABDA20897FA7D81CE478F83CE9BD5B45490D94780C17F796CAC8B16A60B66D31BF21F0BA3A7AB08C62623AB28229B1B716E21C6D2DAB92559B71
12121212121212121212121212121212|0000000000000000|0|62B5D123F8E578D991AD64A6983393666EE1107AB0EE844D000087F52F9E9038A413E3B500D1A7B50F94359B004F2132D1F229686673D12DCEF24700C297AD74
12121212121212121212121212121212|0000000000000000|448|21F84D08F4A321A883C2C9ADBEA4342E6F490D3D44417AE971324F3A0A6DE56FE1A2C791DFD35B73355F9CE8F9C30D9494F97CCFEFCBA9613423595BD95D11F6
1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B|0000000000000000|0|B8BE166D69975D3D9D991DC28F7B334BD14CA741BAE95E93FEE603D54509F8E0A265373D1A5BFA0EF97B61E2998E72283727FE5A3DED85B73CD41B86BE594684
1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B|0000000000000000|448|01C885E74B3A5438A005E35E8F04ADF2DA312163CCE2372B2E89EA10FA9D269B6D9301A30A652D4CDDA0EE147DF052868D16156743B90439F66C018FF4FED91A
24242424242424242424242424242424|0000000000000000|0|97260F8165CB32935F6E82380645E12905550F2DE054C5C443489C27706D8E405B02C5F17288C72B5E91D9635B7FFED5E20A533FC30AAB90362A4CFFE1158446
24242424242424242424242424242424|0000000000000000|448|4A809F1147E7FF8B541DB96B56567268741E623467751CF3AD7FDFE88525A05260DEB94B88FD630433D568C5C964168B8CF3EF696841ED6E4FADAF86E3D920C3
2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D|0000000000000000|0|A98720472640C385E68F7407CCA56859E667C471121418C3F1F653EDD1A2DDE7AC6735CE67A92CA65772773829CBA796ABF7F318AE8F6E0FEB8C8D20D099627C
2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D|0000000000000000|448|4974E94DDBE366813E27CBEE6CE96A4AD09E2D6BF52037AE474B05B1A1B55703EE529170AE3DBA70EE7159892660249CAAB273AFC70AB8C8E47844017E6581C3
36363636363636363636363636363636|0000000000000000|0|215C64657D3E1F9103C791A68D1B2CE30FB7E40AE433E5D490C76F3FC87C3E4312798A3468E7A9BE956966C9C23969F8E7F5732F046AF520162F559D6C5DEF8D
36363636363636363636363636363636|0000000000000000|448|0AC5911B6BCB6E3110A4EC1AC0FD473F1D4E8AACB643022C376E2231F6039ABA9A3B81A155D3972F8987CDE1E467069EB889BEA2F814950A0FB9D97D17B6B1A7
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F|0000000000000000|0|07A2104DF55468A03A06D5A031DC2CB3BA0AE5D8262133A553630048B0F0C19CCEA0CD6D03A5ED394698F6DF83C8D16E6E578BD1B2145AD9D92AEC5F298EA6E7
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F|0000000000000000|448|FC03429989E2B4549D88DF29C39290AA087E2ACD95404F1E605FF510F63D1FFE9F2D0BF8B709B92038C56A3FCF60A8C3208A50A09F015078EB14E972C45C73EE
48484848484848484848484848484848|0000000000000000|0|7D492821BA504459DDF1B750789689C879363F723E05AC35302C46219B542AD4AFDD29854FDB8753235354C9F2D9AF715BA712F8AF8E9C98328597A63AE9E338
48484848484848484848484848484848|0000000000000000|448|1C692D1455CAB3D3CF9B4D0C6DDDDEE4F63ABC2FA458917B4CF04436EAB75CE3FBC6B56CF1D3D24CD285F1080BFB6189EF8B8F2A9B851A721445FFED5B66C073
51515151515151515151515151515151|0000000000000000|0|9B50B71FDEC27AF3F5224C02D0BF435E64EAA7E927F6E0FA4B6F0E444389DDA1C8AC946BF3BCE3EC2F8474E386634D0DDDD2399C592D41B6B9242948E29722C1
51515151515151515151515151515151|0000000000000000|448|D36E8B836369ED37416D47D699C7EC9275A30B8BD30B3831042A41D2D7418AC1847E9F918B6E348644EED62B47B6ECF0906D3B8D4CC533100652E7503CE77FF0
5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A|0000000000000000|0|947BF8D9CB76D72AD11300E9F87DC775CAD0F21E55A9B4E3442A811848C8D3C4403733DEC1E0AD651762E9C76649FD349B161773B20FA271CF88753173CC9A3E
5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A|0000000000000000|448|F80EE18B800754361D4008E630A34740B7D07A89A711F0F3F3FD18AA2B9CA68929A1E8684EC396188E9A4E970217624E22BE83F87B593FB548DA290256F072BD
63636363636363636363636363636363|0000000000000000|0|51CDD88200CC5E396ECDEE75342E279709AA9675D6945A1046AAFA2171FA3ADE5126A367BB1DE48B9751F9CFB9A617CE365964AF30AB56F36C436D095C9140CD
63636363636363636363636363636363|0000000000000000|448|7893CAC1C6065126DC81170B16EC751F69012E1E3CF63CD7E34FFD4231D89FD06D3933066527A096E2E2ABCEE979C950771302C80EFF7A69FE0960390BCEA519
6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C|0000000000000000|0|718EC9CE30AFA1D0227EB4C258E3E021E5A8C79FDE66D5E77DA9AC2E03C4B215438961E4B7547DE3D25364139603680BABB795E71E68DC8BE87D2044B5C3A6EA
6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C|0000000000000000|448|10310F70CFF2222A64C1CF1CED8CA57BBAC520E01B2035EB4C4E029C5E7E8DBC4A02C3095A1AAA65A7779A5FC9C8D1C48CD462021A992E2FF0D782E042E96EDC
75757575757575757575757575757575|0000000000000000|0|735BDE23068FCD60A416443FA9C0689C5239DFF5785E7852F08EE0904BEA8BD39DA1B26EC7025F91179B7B7A421B999D716EB9653312FCA12F4829C5012A802D
75757575757575757575757575757575|0000000000000000|448|BB9E0A1828F1451B1D12FECCA3B9DA6B15F7B80BB16A2EEC694945ED3034C799F15D1754820F8B1AF07DC5B5F8566320EB1162641025DAD7C99856050A92A6C0
7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E|0000000000000000|0|97CB4027B82651B0CB7D6CE5B391307E830190157E94E8F0F4A51177006AE3169A0EF288684AD26E960F28CE91A74C8040E153A6436100F3629E54DE8A7543AA
7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E|0000000000000000|448|2AE2FFBCF916B76CF0C12B5F15312331316A7CA30D1DFF8EE7307F4B9182E73FF3951640C0E1BE2F62EC909D7F1AA193B9BB78BC67269BA40CC80C068123D812
87878787878787878787878787878787|0000000000000000|0|691C8D4B72F476352162F33DB1C2D4BF0093525DA58DD95F092599E3F79D7E4F81B241314E9C701F93CE1D5104D0BFAF8226B3D7F89FA3C0DF85F387264BD1B6
87878787878787878787878787878787|0000000000000000|448|6264AB7DFD5F9B519B20BF4338BE57D470D9A2FAC0800A1C3FBFDE4BE56CEE629D9C4DD638CB9AED526A4F9DF5E6DC9803AFB8CAF727D3920F48B32F7D10D3C2
90909090909090909090909090909090|0000000000000000|0|BC29877AC7EEBA85EB0CCD51520A2DA5F12B9B8BF67BF79914805B7CFB885B50E4486A6B986D2D72F90B7FFF720BFAD99560CCDD9AC940A9FEDCE4E57B7D1D6E
90909090909090909090909090909090|0000000000000000|448|8A2AE04BE3C2EC0A80543E7FB1FD5B8D3C37A388B926CC2E07557F69BAD423E4A48B7140FED20CCB311A5367B15FC7E94599882B51B4EF7553227DC645D1EB12
99999999999999999999999999999999|0000000000000000|0|FFF8FFA5CAE356592905AB22F66D9C1B4C163EC0213E2485996FF1BF67C81C93CA37F2195D03DE03AEFE7295DAE49C1AFFD2ADAC39212A73BFC0FD9C78946004
99999999999999999999999999999999|0000000000000000|448|643E75D6C08C2F0D0DDABF94B4963B2695F45FAA44B440CDFBAA7270DCC418280AA1CCE520845A6C89B6357C2B03AA3F3216B26690C1804408B9B76DE64AB5D6
A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2|0000000000000000|0|067EB690A95E007395D0D7557C696EF937A3FB5403F6CEC8A76612C4A8AC48DFBA2EFE0BFAD60D6841C8D1ACD1C4C79CED6EEF0AF9E289BC1A88F000A553B753
A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2|0000000000000000|448|1A563154F3CF5EBB95962A0F1DF8E37AF0A286273ADBF25B37762DC042E70D5DBDB28FBABBD50CC35A7590C1E9BA24B575B45A147A514C038024577B8AEBD681
ABABABABABABABABABABABABABABABAB|0000000000000000|0|545C27A12E1DD9411BC1BCF189105E8EA2286537B78122FCE0E95DF7ACC9088D37461D61817CFDAECADDC8663D2FF849C2A1BAF9999C67537654CBA119EE1F94
ABABABABABABABABABABABABABABABAB|0000000000000000|448|0FD043205ACD3163FCFCBCE388C8E9120AF0E34F9FB2C46D9AFFBA7385D518721D53349FB44822270A863415CAB906001F412376709B7ADFD3F99EEE5A9A25A6
B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4|0000000000000000|0|97C252D3DC5B0BC06A9E3CCFF0A88593451B5207CF1299AC5061386B3706BF6945FFBC060E250146F0725B096C2A3390DA6B4548DA3440BB6245AEAF8FC5C1BF
B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4|0000000000000000|448|CDFE4AF0D25CC0CE5469422F3EF2EEE79B1365D01A36B9D159EC9730524AFD4959A36A2AF2EECAC181C08F14AECE91239DBCA8A7C86601C4A4445B0036BC7A77
BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD|0000000000000000|0|4C90ED8E7CDE917A218A58DE158CBF98DE171190BEFFCB31C1F6318578D210D95F2707EE1D6BEFC7303598061460894C7B2DB117E1998B24193B57F9121CF00E
BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD|0000000000000000|448|BD4E150CCD803DF7A70307B306D69EBEA04033C5889709F1E8D2FAA01BC236CBD3EA172F53CE1C3B05FEA8874ED2F6BF1A7A64D69317C121B47F018C7B03B6CC
C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6|0000000000000000|0|61761E8265DCD6428005F25C66430E69E508B4D63E7A0746123AF7959DE08D64286A22946A03D623E57C59B5FBC7818584CD0FFAFCD313A9D03384BDCE947703
C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6|0000000000000000|448|6AEE8931388A469AC8B5E5641E870B8A39D22BD7C8A61EF04F9D988F17130BD98DFBAD94C7E68C5F161B46571E8C43962109C393B9AD566778DEAC09687020A8
CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF|0000000000000000|0|07ECA06EDF7435732E1A3DF0C8FD5FE5E9A14EC485950AF0586769584346D9C0F501EDA74407F0259F17533A32B98EFD19351EB8FDE4317CBCE57ACD76E528B1
CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF|0000000000000000|448|6194F2657A0FF3F2AA9329EBACCC660C121AAFE3B5CA4D45801177DB48652860950B6F2BA2C88535B0EFDAABE4F7D8C0A07CAD3417F5495A6348E2076D83DC9C
D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8|0000000000000000|0|7F51E124DE7011292790C991D92AA730B0C28EC739CDF7497D9B0B7299A46E8D82ACA3593EAEB4705ED2E310940F55CAB2D152AD7D4936BAD877AD328C1D1E57
D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8|0000000000000000|448|4C0CBC0DDFD5881B04D321342D8890AAEEFFD98E3110656F60C8600D5D11CF00B071FF8769DD775A5C09B92EC68DC4946C5C6A2E2AC5C037BFE3C00346C4112C
E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1|0000000000000000|0|ED1FDD5ADA19BECAE0FE43BD3C6813BAA54C70D0F270407ACA453A4FDBBE4D0AB14482673B74281385496EEBA9548DA7A3E9012F702E3155A3F8108D79FBBE5B
E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1|0000000000000000|448|FE8280084BF7F75AE6917333CF6D9CD53B5EB638FD1FC47436255FC249A2C65D8D3CC92A5E55313A2B9FD1C3DFAB29F05393C7D50CF5F1C6F0A49E61DB3E8844
EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA|0000000000000000|0|19BAF0AB98DC18BFC7F18C4EA0895AE92B5CE05E692208F0540EA02AD668353900F2C6456E001C19B274C3D120B2E00058A941390A93703CBFBFFDBAE6D6999B
EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA|0000000000000000|448|F3183BF8876E91A1DC4FECFA22538777AB9DDDD736C9F3BCF75D583A8AB61D2535E16969BD6A492A648BEA0D9A7C742412DCB9DCC6F41630634CBAD201AD1A87
F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3|0000000000000000|0|23B2D353FE88CED2F55235FF0C4F70579D0BC72FD108C1D87B95B879261248D2E6D6B536E9C5B096D7B6DD101AB1B99E8FE6ADC9DFFB0C183DDC23C26EDC6709
F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3|0000000000000000|448|3020F4ECA0972842E3A14B0729BCB401B4AE6F110D596361A5FE7153DF1CF2D53544552FAD0B8FAD79CA28136AB58873D7C359CD5DF5836355C9C208F5E4779A
FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC|0000000000000000|0|C739A8B50201D54EB5DAAC71D922A67FDBEB286F909E2DB02CFF896B2253DD83D17A171CE063F3DB1FE898AFC8F4887B4776A9D645B1625B10C4C61DAA46BECD
FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC|0000000000000000|448|72D3A4EAE1E7C83A78E4AC79AFE2B88AE33ADAFCB177938429026E291C187FF00AC89BE3CA542124289FC607FED0408BF379359A67BEBD85D9584D3A68A2C443
000102030405060708090A0B0C0D0E0F|0000000000000000|0|A8F7E69B6940A78D136A5C154A157952A6E4235859E30220EA686436BB38EF539C2940556B09ECD7FEA2B0AC8307F1696265A3D644281C39C9CD5E1E2F9BE4D0
000102030405060708090A0B0C0D0E0F|0000000000000000|448|F9AF33AAF2F0293C0739E052C5BF732FB721B00CF97D0E71B755686DDD739B70C99E194E2181C1AD8D36D0F1B130CF79EA4E32F9D2BE3479758CFCCC98155A1D
090A0B0C0D0E0F101112131415161718|0000000000000000|0|9C75803C70528B539235C01796AA016C7A5ED9AF5B54F3B9232C43727318801AA11E406463C68D6E5A3252D2BE4F387DB8D09713EF02EB6DAB6E3A3FC2DAE936
090A0B0C0D0E0F101112131415161718|0000000000000000|448|4887700FF78520D280E81CC71B51EC09E58A1FD72500538DC2A04A946C1F6525F9711922248FF47D06C824E40B5512C046F028F3E5CEC7252FA4BD95E890505E
12131415161718191A1B1C1D1E1F2021|0000000000000000|0|CEB8BE2CA5CEBBB8259C6ECA73FBC5F3D1E527A864E03CBF077FAEF9160F73937B75A6E13B056AA47AB962F6E97961D1B529A7FF1B580F393A1097328C1F7D0F
12131415161718191A1B1C1D1E1F2021|0000000000000000|448|19054D7AA84BC7E662383E1215CC137E9F8001CCD02D895641029519DE50956B38264F96B531FBEB509FDBE9759CF61BB98F599AE146B41EF6563B5D864C2B6A
1B1C1D1E1F202122232425262728292A|0000000000000000|0|8AA4421F2858E1BC0125939C4F6F0E7B5418CF975674E57F17A4CFDA935F04F2958847A37DCF577A1D35320EB01797CFAC41EAECF1D1B19A01AD353B9B7FA387
1B1C1D1E1F202122232425262728292A|0000000000000000|448|8F604597C790334398A2F4A818D12FC363BE3E8CE33662A259F109951DE5CD60E2C86869C2D54E49B892125D49F1ADAF63ACBADDAC218AB227637675A11DE12E
2425262728292A2B2C2D2E2F30313233|0000000000000000|0|3FD49CEC6AD6D112A23AFBC78959FC8435FA11A8279D4A9F1C385CDFD9E081F1788C19D0B797C448A61E5937030068823D23FA98350955A8DE1A20D2433919E4
2425262728292A2B2C2D2E2F30313233|0000000000000000|448|DF0B64330DCB54BF390DEB8F5B593395643A2468F0DE4268148D17B94A72E039D7A4CA53CE5D65A5E559B5E053B609CD77DEC40BF2BACAF6E7E9C4B68345FBB8
2D2E2F303132333435363738393A3B3C|0000000000000000|0|3F1DE6C663092E7C2BBD00E2FE8041A6D3FC3BAF6C46B783B29855BB8C58EED54E83B368329B5C1C995217770787965AC7EF9C416197F5FD238C24BBC7B1C8BC
2D2E2F303132333435363738393A3B3C|0000000000000000|448|D2782ACBF9BF5B9A7D5F954B7E237F0CD6D7D71BBA72D996C5FD8DE7C6534CDEBBF63382F812B62A007C56CC0BDB705B540D7D7D4C3DEA49BE0B47AA17E540F1
363738393A3B3C3D3E3F404142434445|0000000000000000|0|598EF6260979853F06470BD98FBE6C5E4399C6240743789F096DD2B4024116DF328AB398AF4C2B8D49A2484526240489918A7FEB2F1E60473BDDE6F6460E05A7
363738393A3B3C3D3E3F404142434445|0000000000000000|448|F5BE34F3B5790E0B28A80F9B94407866092A4F3EF2A650882DF027F744A6478994EB41ECC5EB79ECE17B87450F0BD48D8A9866F373EBBDFE78A56E1B02C86A90
3F404142434445464748494A4B4C4D4E|0000000000000000|0|ED55F27D6789B97BDCAD0F0C86C9423F84A6F4EBF5891173F958E77D7E0C748828D03F55223F0116F5F36C8849E408A3FE4D6976284D1EE93D20E4E7235BF874
3F404142434445464748494A4B4C4D4E|0000000000000000|448|5EF107C90BD579ACCDABC4FDE47C3C7802D89CE984262E86227FB066425733A426771FCB37A12B2621D1AFEAC10D383CD996A5E0616335D5F512ED9693D4962C
48494A4B4C4D4E4F5051525354555657|0000000000000000|0|BBE36FAC29E8097873AAD0BD26C41B384AF8FEF4153744E79732CA8F7CC0130B470A6B1D32EB62BAC555DA88A69A7091069E56A26E44447411666ACF2000DD62
48494A4B4C4D4E4F5051525354555657|0000000000000000|448|43994C6E8701610AEAE9190F3116690BBE0950B706DA3CE1D86A6AEF4D4FB78170BD84674CBF3EB6CCB0C588D53B2DD4A3923A6F6968C06541C422248B66D115
5152535455565758595A5B5C5D5E5F60|0000000000000000|0|17B496C4F998676C6D57D00B973B392EF055805142AA6B5D94F23CAD740A229011F0770C57590D1B301ADF2E6FE3B3F530F355C527330373CF8A3AAFCBE0BE2B
5152535455565758595A5B5C5D5E5F60|0000000000000000|448|B8C415B59D0A661525D1A01D6B8F2BC3F2C9087CE11C0B49EC84205D15054495550913ADA21A64684FB2257CC3612967795E8560FC7D64D84A20065173788F36
5A5B5C5D5E5F60616263646566676869|0000000000000000|0|F901D64CFCB8FA39F8FB8310C169063D9986203380EF433C3B01B72422E1DC45C40575CCAB09A87EC4B070A1F6DD25C43463DC8074E8E985522BE574C5DE6155
5A5B5C5D5E5F60616263646566676869|0000000000000000|448|52D62CC7050822CDCF515F4D8ECA66FEBBA746A767AAA6CE4EE90ABB0836176DB5AE9A3BECF2B8A9D405B9505A194104AA37349D18E2E98BD2FA21519E005494
636465666768696A6B6C6D6E6F707172|0000000000000000|0|4BDC73208B12082D1CD306ADA9E7C893DFF7B299BDCD08755FF58B8C99B6CFDC3F3D3F42F7FA1B68D925B1D6C40E811369308768D435A3EA6BC8EE6B04E244F3
636465666768696A6B6C6D6E6F707172|0000000000000000|448|6A6293FC21975C345F2B7D82F8EE1846589AA1062046F7B794431571B9653A29594054832E0AA3B9F6FA12AAC43B8845F5C393547EC6C2A3976613F583C3CA43
6C6D6E6F707172737475767778797A7B|0000000000000000|0|AB3E96DE9D091FF94F6E41681441A788BFF6EEE5562505C56CC69773EC1D9B36142C811EFD0AFFFF1D6FE198825DB0295E2282B1836D3CB6FC3EE32A0B27E331
6C6D6E6F707172737475767778797A7B|0000000000000000|448|CB52F4D67C19887BA565EA4DE18EA6C59367553F05C364B974BD337302655A873B44FE6DB5473D0FCB34A72B15206D4E32546236A4D568DD69AFF50D38E57BFA
75767778797A7B7C7D7E7F8081828384|0000000000000000|0|76BB00C566E1AB42102D9DECE873C28FD4938D8AA8D3FC052225D33D156A9A4D10A81FE9581B0FE0769452CDA51EFECC5E2D72D149E6EA4F2766F4B20FB2FD38
75767778797A7B7C7D7E7F8081828384|0000000000000000|448|268824C6E8F0E50D2A1D1E92FB87F51C3DDC0448C13887C1F66594808B49B971713E8D48B5F9077DA4267330CB4945FD6F4DF4F1F2EE13BA54A398C1C910B350
7E7F808182838485868788898A8B8C8D|0000000000000000|0|E3A9CC680C0773F34D33696AD7BCB5E5BA1D70D66C78DC99DFA778B1F5A8F98B2D1E13A7761A6505010896618166011D4F3D873422B63FBE6731488C95E24E0E
7E7F808182838485868788898A8B8C8D|0000000000000000|448|3D3C6A3915A16E9E8A6690D4AC61DB15098B4BBCD39227ACC88E6C0B2A2A15AC3FF032435BAD05C525813B4940EB15EB21B38E6E931E7A55220F6B561C9E60F3
8788898A8B8C8D8E8F90919293949596|0000000000000000|0|F8E0E1A0BE45C2F3019BDDA7123F7CDEACF74FEBFBDE272B532D55F26AD1564E1314D5267A69BCACAB2CFDC7217662AEEAF848FCC9C3CC7067BB93F3FBCF4D7E
8788898A8B8C8D8E8F90919293949596|0000000000000000|448|8E17D0390EB35B039A0EC1A3CF09B942BB637C6DD6551DFB3C2AE2A69A91FFD1A9D7385B1B23CF56AD63A31505781F2542A43F8B3A5EC7CEF39C3C1FD5127454
909192939495969798999A9B9C9D9E9F|0000000000000000|0|DB5DB3C8AD550940017570BABC37DC405B39E1EAB64FA9A281BB545548909A260DB3CE59E35E48C6D8511C5239317152CEB3AEDA8675B470B221AC0439A2BFCC
909192939495969798999A9B9C9D9E9F|0000000000000000|448|2EB24B1048E053781B564255FEF304A6EAA79ED748AF357BC1FF061FB308C82065083C216A31D23DC3018B03F356CF3367653DCAF14194F0725012EDD674A740
999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8|0000000000000000|0|C08ED7A73C376240AA50C4941C23C76E314B4A5BD1947AED90D9F8F95E63FDD61FC8EB7E674BF49AB44D411C5C2640DCBDB7F7A136C49AA5897C058D3421CD57
999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8|0000000000000000|448|4CEC62A9A8547134642F790E9819C5334B27054A3FA222A1C8513B9C32E8028BA0DE4A3FF59BC76EB8730252D49E71954892F39C21A3DE11376956462C39A60A
A2A3A4A5A6A7A8A9AAABACADAEAFB0B1|0000000000000000|0|2DBC230A1D4077730133CB681C63803CFE655F1F83628A49A0E74BCACC9185C932C61657E653D98D88EA9EA7D97BDDAED2627AAE38494630178A72ABDE934395
A2A3A4A5A6A7A8A9AAABACADAEAFB0B1|0000000000000000|448|779D4449233A4790DC0FB467D720041DC55097068381D5C06847A45973DFCDA3CB9570A83B7DB21AC572E5EBD33ED5572DB842E7331DE32B3848149279B5E358
ABACADAEAFB0B1B2B3B4B5B6B7B8B9BA|0000000000000000|0|2AD70E5D6074FF8692077E8EA3A7065C6542A2C44DD873C2B37DF8A12FA41C7FB460A5FD7904613CE9E013BD1B93F7C923FBDA997C538423F20C026173A6B14C
ABACADAEAFB0B1B2B3B4B5B6B7B8B9BA|0000000000000000|448|7ACA69E52A3A394093750862B4681B142F64810C39808C3796615D5D261669202F9B14336CCEFEECD0F556EB57747A66AFA55E3C0F65BC2D668A354A9179537E
B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3|0000000000000000|0|3796064A20EE2432983FFEAEF238BDFAEBE4EEC8BDD2243A12B226A4E4AB73D18A1A3B85A9A6E8C1B73D7A35E634AFF353C500FFA905BD00A57E2884D278CE48
B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3|0000000000000000|448|FE2DB543BC4F4A89510FC9442B83F3046A77EC2086861CA7959DF633513ABDCABC23AB39FBB97078202B73787404FF4C8F38FEC8BCE76D29A9D675F6E85FB5F5
BDBEBFC0C1C2C3C4C5C6C7C8C9CACBCC|0000000000000000|0|450EF26E87C27359A71BE95BE322B6566609B25A34090E97462D93369850AB4AD61C7F9F67F9B12847899C40F0EAFA228B7A6BC7F1BC4CBA7A85F5266177B0A0
BDBEBFC0C1C2C3C4C5C6C7C8C9CACBCC|0000000000000000|448|78C100DE69AE45C1B10EEF08B91CC67529356C7D44DF8FF8EEB2646B528F5F8FAFCD97E36005D72185D90B52A09F38A780332270DCC28AFC85FB68390315BB20
C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5|0000000000000000|0|96E4CF1A2758D880AADBB05273DF3E0369BB35AC9B71160C0E893355DBE033FADAE988C496D15BE772BC5E6A46283DBC8A0BC506DB145FD2BF309992B37F0963
C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5|0000000000000000|448|DB9661BDC10059CDDB501C1AB1AE9E8CCB8E192EBABBDEE6B0CF1DD7F7B02F7EF3ADC85AFFC380D977CE9462A5951107D9C20AAA87D9FC790591994B96AA4761
CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE|0000000000000000|0|3B662BCC798F80C6426786FB81D2C2C9BCCBD772216A31A626C9F54E6577495E773989D830F03A230B9B2C37B6432C564550AFF6C63BB220BC4BFC4B07678580
CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE|0000000000000000|448|059FD351E88F27F793E3A1CD61B2FAE27D9AF1DAC4558BED9D1B59E339EBFF3741E150E2C714E29B64075119B26793EEBD4C854AFDE7BE17DDB3E47CB7FAC255
D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7|0000000000000000|0|B846B5C09ED72772529CE3FA897AD2A7737C5B6CEE99896812A051E6EA98D58454FE1BAA29AF50B50DA15B093EBC67A56DAF9F3AEB5E838177820E0056BC1909
D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7|0000000000000000|448|64E714C1298785190F9C2871293D3BD984889FC5CDCE9C4E1110CDF5F0EBDDDC0233AA81715D55C2205CD105662E14BBB02F937A159DE32F518D3A2A5E2B7B02
E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0|0000000000000000|0|A3B43F8553B670D450AFEAE6A477AB98B5910C7E4FD443006A09FC88E0EF8A60DC951FD794F6F79A82E32D803D53D2939BEE4AB66917D7D6F795EB22BB60876C
E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0|0000000000000000|448|F45B25AAECD34C2BDE2B5735A945B10AACDD6BC4257FFF3BB3DCE5C0352655E0E855B71482A97887C74B6709F4DB006A6BB9F6B11E48E437063C48FA9EF6CC46
EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9|0000000000000000|0|8381B53D5301DBE45CC692C81D125D17CE55CCD0C28B36B37EF77CD326CC3F229EF3C2509BD7B94F7D6A2B6CDB98A83C9D40B37869D27CE76A753BD80E5C2197
EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9|0000000000000000|448|72F6FBDBFAF78752767E853764FAE20D94ECF8F2D3AF283C6737D2411CFE1EDD362274C3281616E15D79549E5ED20F744DBD2BD2DC40D42AF7C87ED4E36ADB0A
F3F4F5F6F7F8F9FAFBFCFDFEFF000102|0000000000000000|0|AC7A285AD6C329DAFC4C24B7082C56A11267101A40123E8BA3D26753FEC8E492D7C7FD6C6C7871AFCD2B90DEFB9ACA8261A568F6566F14B98F5D7B57DBD02372
F3F4F5F6F7F8F9FAFBFCFDFEFF000102|0000000000000000|448|6B7FAE2235360C09C3A25901E773C13C559DCE935685A7695DD05466CEBF4B6E73AFC1705842C2212A382D8CC658A332FBFF451071B5A72930D92A1EB6199EC7
FCFDFEFF000102030405060708090A0B|0000000000000000|0|B4F871C18B4BBA8E427AB5C06985D40327943574F02CA0A6BBBB27F8B72A6787BC8211C25FF3E180F0F1326E4D24BAA50B293633535FE6D3B1323C9188211AA2
FCFDFEFF000102030405060708090A0B|0000000000000000|448|064CFE4EA4580AB39F27811DF269BDBF8AA58157C97CDF454D6B50430EA518F739F70449AE6AE35D8E50C818A2EB169E595B86587475EF7001945098E20B5A62
0053A6F94C9FF24598EB3E91E4378ADD|0000000000000000|0|B1D49BA344C9B6E8D439A2D0BBD004E703D49516938A231AC30F868C93233D38E679549FDFEFBE314D548B457946ECC5DFF062DA84EC561DF55F95AD1A13211C
0053A6F94C9FF24598EB3E91E4378ADD|0000000000000000|131008|4AAB727DDFC1996787C40E969AFC6241CEB02F3D2DF9E72F17D4316CBAD1529746E3D0A347776C6FB5523050742EC23F3D8EB54DA83D4721AC90B443E5B7897C
0558ABFE51A4F74A9DF04396E93C8FE2|0000000000000000|0|4F02EFC370C559549DE321F2BFB5AEA65279F3855ED9E03972FC3EB954063644C4721C6F23CDF6DAA6CC18637E6AADB004136F6814B55FEDC3BFBE1E54CE1037
0558ABFE51A4F74A9DF04396E93C8FE2|0000000000000000|131008|D54A39330C57875A0241302C45BA9808790228A0967534904FDC810504E8AAE9B5DE76BB50F0F53EA9488565E44B55E12F1E17CBA3F9E31B21B7C5DFC31FC0B5
0A5DB00356A9FC4FA2F5489BEE4194E7|0000000000000000|0|C31AE4DCE8209D9F78B080FDC84BA5DB36A71F2FEECB6E9FCBC1ACB8D295D85FFE420068D7CCB265F5EB2F6D483ACDF51DBCCFCF113906CEF57495D437E4D62E
0A5DB00356A9FC4FA2F5489BEE4194E7|0000000000000000|131008|CB3EFA61C5FDE9C369BD641F840983D8B366F631AABD1CEE7F03A5E6DAF93427D4ACBDEE6D005B962E325703BC3528E013FEC419EF2E4BD8B472429652F9B9EE
0F62B5085BAE0154A7FA4DA0F34699EC|0000000000000000|0|9AF7391762B4D5793B26A1DAA5FC9DA8387BBBD1301D3931F761CF2C34634AB3FEDDB3B4C8833077367095AC02D3D78803650FAF6156D27B08A8888572BFBFBE
0F62B5085BAE0154A7FA4DA0F34699EC|0000000000000000|131008|A6F0676C38330BC828E57E7193A05FA157836E04837DA478CEB8EDB8E0BD7F20A2B83BBED25799CFB3D748FF4F2E06C029FE28C1F41C93DC7816AA3D2FFE10BB
00000000000000000000000000000000|8000000000000000|0|8C3E70D63D8541A33621912CC8385F9EA74DFE692DBF17090767E5D7D8468D9AA5E3FD7FE6164F731B49C92E42AAA4484635D6480BA792AD013655F19C47C599
00000000000000000000000000000000|8000000000000000|448|046433985C9FA18B949BCB73194176E26CBD4F854A9E1E9D81423C817220E771690FCD44B3B849EEC317F4B924A8DAE013EA88D817E1170A0EDF4E650721CAD9
00000000000000000000000000000000|0040000000000000|0|691CB2E41CB212A1954126DAF622BFF7F1B10335B9775EE2D44DF8179C582583F0116EFE70537F4F336E7B13851BE7C7CADFE15702AEC662830C40EF3E5CDAB2
00000000000000000000000000000000|0040000000000000|448|D522C112371EDAB20456AEE8A56039205EC3451D013B50B33343A2950088EA4E66E282DA12455C5EF6F8BF0011A2B3DF06DF1B24A4979FF8966527D2F8EDF420
00000000000000000000000000000000|0000200000000000|0|A8346F600E8B4B335BDC2BF73BAFBE7CFA9BAB3F4136DC162853184D1489741288924BB8C1C3856EADA27C0A78A0CB5BFB7D31F207378B7DD0781C51FB9AAFB9
00000000000000000000000000000000|0000200000000000|448|41D8F9AD87DC7A70DF1639A2DD3E18F9C2FCF9C70DF45F06950D84C65515030555B0A418189F3E10266CFB89CDE5C2E004A0CB031D45F7EB60E96556182D181D
00000000000000000000000000000000|0000001000000000|0|AD1CEF2DBC992972709AD20046F141DE692C0A1960425A7E97CD5CA0129749463F3D9F605EDEB7B104DD648C5AC03035106F90B8879DA7F5AA59EB0E7B348F67
00000000000000000000000000000000|0000001000000000|448|0DC61BC0188D40CEB3FF1F5609FAC338063490128A2D90529BC769F5434DA68D58C5F6812D40B67303445407FF2395E957A2D4CDD9A0C7129596B36E9A187A5D
00000000000000000000000000000000|0000000008000000|0|3A2A8DC611360210D764A8461B18CBB7C9E7683C14DB3AFADB084220821CC6BC292D4F2519CABDAE9948ED6763660B6CB2E8F80E987E95EB15995990EE1AEC47
00000000000000000000000000000000|0000000008000000|448|9D8B1483CA286AFCBC5A56F6EC99205AC40DCDE3239E3224D5F4E33B5A10785BF4EEEA0F5AD1817C81EC9F6A3BA707F35C570217C7B55B1810E8B75CCD14ACBE
00000000000000000000000000000000|0000000000040000|0|091021A7297C69E10442E24B0D06DBB6E3B30829BC0BA7AED758DF6E3548770125FE1E3BED56CD212B249DFA7B040AA50087FEF28729239A272BC0CA7C82EED3
00000000000000000000000000000000|0000000000040000|448|5519177B672C421F4B96494222188E82EE7CCF83DE51397ECCDD5A5B96965BCE00DA24C8188475BF04E8501E1440FCA3B1C0B8104EC8D6DBE7341F2194F0C3F5
00000000000000000000000000000000|0000000000000200|0|5FD06EDB1E00BFB4465CDAFAEDD38725B37BDCC92558651CF9233DE0CE17CD921EBF9ABBD37C1A3DEBD7E34BBB0885B1E370C510811F4FAE7B3CCCB3A2FB7851
00000000000000000000000000000000|0000000000000200|448|CCD2A83A7D6D353F24EA309165FC20A3F4AB36D578CAAC4658D08C6DE44809089C33B5F536B041C28A02A1C725FE4F9B2DBE4621CDAE50BE84E863F2B58AAB05
00000000000000000000000000000000|0000000000000001|0|55FB0B90A9FB953AE96D372BADBEBD30F531A454D31B669BCD8BAAD78C6C9994FFCCEC7ACB22F914A072DA22A617C0B7B1ABC91C8604D55ABB61B7AA88749C29
00000000000000000000000000000000|0000000000000001|448|A9BDEFF05695E0835C3596571177C489848E6B99221F71DFA5B77F92466CBFAB6D3514A6B172C4F5B3E163BC5A844BC10402A13EC657FF82B23AB3B1C6793195
0053A6F94C9FF24598EB3E91E4378ADD|0D74DB42A91077DE|0|75D186D6BC6905C64F1B2DFDD51F7BFCD74F926E6976CD0A9B1A3AE9DD8CB43FF5CD60F2541FF7F22C5C70CE0761398971D8779A8423157A9136C194BD0570A4
0053A6F94C9FF24598EB3E91E4378ADD|0D74DB42A91077DE|131008|7C28F9D069B6D1380AAA5A21F165DE47149BB4AEEDFA75C56F52B1375878C34030EB6C77CA5271E12FB28067B7A4891547C7149DC562326941DE8DDA4A91AEE1
0558ABFE51A4F74A9DF04396E93C8FE2|167DE44BB21980E7|0|476E2750C73856C93563B5F546F56A6AE5F97D8888655222812E3EDDB86BB8AD214AE0AA107CEAB4993CC74F63932885F0A585C735D590D194AC90717D0BADCF
0558ABFE51A4F74A9DF04396E93C8FE2|167DE44BB21980E7|131008|8C044756D4610B9BA4292E3C67F166C45AD0E1D6666050BDADDF6CAA609D3E8E3C76CC20D1C3D0C7CD2CA6006CDB3B23A26901C1CB989FA74797A16FDBE03428
0A5DB00356A9FC4FA2F5489BEE4194E7|1F86ED54BB2289F0|0|921FCF4983891365A7DC901924B5E24B50F615D59FCD61CBD27280474F3D23C9ADF14BACADF99E5A163B836B0CFF02C0FF60F4B64EE7C824C98C3481EF656894
0A5DB00356A9FC4FA2F5489BEE4194E7|1F86ED54BB2289F0|131008|C73A00E366B8F5FE717802F1BC843B8C4603B902EF2D6D65567E2F637EC99FC46321FA6F5A1CCDDE9447807EE21C04607569D1F793F413699A1E8921559AFC0C
0F62B5085BAE0154A7FA4DA0F34699EC|288FF65DC42B92F9|0|613CB0BA96AFF6CACF2A459A102A7F78CA985CF8FDD1474018758E36AE9923F519D13D718DAF8D7C0C109B79D5749439B7EFA4C4C9C8D29DC5B3888314A6816F
0F62B5085BAE0154A7FA4DA0F34699EC|288FF65DC42B92F9|131008|79037775E485C71704F308611AD1FE545B77CFFD982AF1FE0EDD3E926931AA54EE55F24DBC7B385ECA940EA73EE627CFA3BD376BF5D8D7F1E8AFFE344D6A34F0