Hex Artifact Content
Not logged in

Artifact 22ecd222db6e6ad091aa98e95ee07101d04c7675:


0000: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
0010: 54 63 6c 20 38 2e 36 0a 70 61 63 6b 61 67 65 20  Tcl 8.6.package 
0020: 70 72 6f 76 69 64 65 20 6d 73 67 70 61 63 6b 20  provide msgpack 
0030: 32 2e 30 2e 30 0a 0a 6e 61 6d 65 73 70 61 63 65  2.0.0..namespace
0040: 20 65 76 61 6c 20 6d 73 67 70 61 63 6b 20 7b 7d   eval msgpack {}
0050: 0a 0a 6f 6f 3a 3a 63 6c 61 73 73 20 63 72 65 61  ..oo::class crea
0060: 74 65 20 6d 73 67 70 61 63 6b 3a 3a 70 61 63 6b  te msgpack::pack
0070: 65 72 20 7b 0a 0a 20 20 20 20 76 61 72 69 61 62  er {..    variab
0080: 6c 65 20 64 61 74 61 0a 0a 20 20 20 20 63 6f 6e  le data..    con
0090: 73 74 72 75 63 74 6f 72 20 7b 7d 20 7b 0a 20 20  structor {} {.  
00a0: 20 20 20 20 20 20 73 65 74 20 64 61 74 61 20 22        set data "
00b0: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 73  ".    }..    des
00c0: 74 72 75 63 74 6f 72 20 7b 7d 0a 0a 20 20 20 20  tructor {}..    
00d0: 6d 65 74 68 6f 64 20 64 61 74 61 20 7b 7d 20 7b  method data {} {
00e0: 20 72 65 74 75 72 6e 20 24 64 61 74 61 20 7d 0a   return $data }.
00f0: 0a 20 20 20 20 6d 65 74 68 6f 64 20 72 65 73 65  .    method rese
0100: 74 20 7b 7d 20 7b 20 73 65 74 20 64 61 74 61 20  t {} { set data 
0110: 22 22 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64  "" }..    method
0120: 20 70 61 63 6b 20 7b 74 79 70 65 20 7b 76 61 6c   pack {type {val
0130: 75 65 20 30 7d 20 7b 76 61 6c 75 65 31 20 22 22  ue 0} {value1 ""
0140: 7d 20 7b 76 61 6c 75 65 32 20 22 22 7d 7d 20 7b  } {value2 ""}} {
0150: 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20  .        switch 
0160: 2d 65 78 61 63 74 20 2d 2d 20 24 74 79 70 65 20  -exact -- $type 
0170: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68  {.            sh
0180: 6f 72 74 20 7b 20 61 70 70 65 6e 64 20 64 61 74  ort { append dat
0190: 61 20 5b 6d 79 20 70 61 63 6b 20 69 6e 74 31 36  a [my pack int16
01a0: 20 24 76 61 6c 75 65 5d 20 7d 0a 20 20 20 20 20   $value] }.     
01b0: 20 20 20 20 20 20 20 69 6e 74 20 7b 20 61 70 70         int { app
01c0: 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61 63  end data [my pac
01d0: 6b 20 69 6e 74 33 32 20 24 76 61 6c 75 65 5d 20  k int32 $value] 
01e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  }.            lo
01f0: 6e 67 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61  ng { append data
0200: 20 5b 6d 79 20 70 61 63 6b 20 69 6e 74 33 32 20   [my pack int32 
0210: 24 76 61 6c 75 65 5d 20 7d 0a 20 20 20 20 20 20  $value] }.      
0220: 20 20 20 20 20 20 6c 6f 6e 67 5f 6c 6f 6e 67 20        long_long 
0230: 7b 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b 6d  { append data [m
0240: 79 20 70 61 63 6b 20 69 6e 74 36 34 20 24 76 61  y pack int64 $va
0250: 6c 75 65 5d 20 7d 0a 20 20 20 20 20 20 20 20 20  lue] }.         
0260: 20 20 20 75 6e 73 69 67 6e 65 64 5f 73 68 6f 72     unsigned_shor
0270: 74 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61 20  t { append data 
0280: 5b 6d 79 20 70 61 63 6b 20 75 69 6e 74 31 36 20  [my pack uint16 
0290: 24 76 61 6c 75 65 5d 20 7d 0a 20 20 20 20 20 20  $value] }.      
02a0: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 5f 69        unsigned_i
02b0: 6e 74 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61  nt { append data
02c0: 20 5b 6d 79 20 70 61 63 6b 20 75 69 6e 74 33 32   [my pack uint32
02d0: 20 24 76 61 6c 75 65 5d 20 7d 0a 20 20 20 20 20   $value] }.     
02e0: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 5f         unsigned_
02f0: 6c 6f 6e 67 20 7b 20 61 70 70 65 6e 64 20 64 61  long { append da
0300: 74 61 20 5b 6d 79 20 70 61 63 6b 20 75 69 6e 74  ta [my pack uint
0310: 33 32 20 24 76 61 6c 75 65 5d 20 7d 0a 20 20 20  32 $value] }.   
0320: 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65           unsigne
0330: 64 5f 6c 6f 6e 67 5f 6c 6f 6e 67 20 7b 20 61 70  d_long_long { ap
0340: 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61  pend data [my pa
0350: 63 6b 20 75 69 6e 74 36 34 20 24 76 61 6c 75 65  ck uint64 $value
0360: 5d 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ] }.            
0370: 66 69 78 6e 75 6d 70 6f 73 20 7b 20 61 70 70 65  fixnumpos { appe
0380: 6e 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20  nd data [binary 
0390: 66 6f 72 6d 61 74 20 63 20 5b 65 78 70 72 20 7b  format c [expr {
03a0: 24 76 61 6c 75 65 20 26 20 30 78 37 46 7d 5d 5d  $value & 0x7F}]]
03b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   }.            f
03c0: 69 78 6e 75 6d 6e 65 67 20 7b 20 61 70 70 65 6e  ixnumneg { appen
03d0: 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66  d data [binary f
03e0: 6f 72 6d 61 74 20 63 20 5b 65 78 70 72 20 7b 28  ormat c [expr {(
03f0: 24 76 61 6c 75 65 20 26 20 30 78 31 46 29 20 7c  $value & 0x1F) |
0400: 20 30 78 45 30 7d 5d 5d 20 7d 0a 20 20 20 20 20   0xE0}]] }.     
0410: 20 20 20 20 20 20 20 69 6e 74 38 20 7b 0a 20 20         int8 {.  
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
0430: 20 7b 24 76 61 6c 75 65 20 3c 20 2d 33 32 7d 20   {$value < -32} 
0440: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0450: 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74        append dat
0460: 61 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 69  a [my pack fix_i
0470: 6e 74 38 20 24 76 61 6c 75 65 5d 0a 20 20 20 20  nt8 $value].    
0480: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
0490: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
04a0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 61           if {$va
04b0: 6c 75 65 20 3c 20 30 7d 20 7b 0a 20 20 20 20 20  lue < 0} {.     
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b     append data [
04e0: 6d 79 20 70 61 63 6b 20 66 69 78 6e 75 6d 6e 65  my pack fixnumne
04f0: 67 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20  g $value].      
0500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
0510: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
0520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
0530: 66 20 7b 24 76 61 6c 75 65 20 3c 20 31 32 38 7d  f {$value < 128}
0540: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0560: 70 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70  ppend data [my p
0570: 61 63 6b 20 66 69 78 6e 75 6d 70 6f 73 20 24 76  ack fixnumpos $v
0580: 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20  alue].          
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
05a0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
05b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05c0: 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b     append data [
05d0: 6d 79 20 70 61 63 6b 20 66 69 78 5f 69 6e 74 38  my pack fix_int8
05e0: 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20   $value].       
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0600: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
0610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0620: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
0630: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0640: 20 20 20 20 20 69 6e 74 31 36 20 7b 0a 20 20 20       int16 {.   
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
0660: 7b 24 76 61 6c 75 65 20 3c 20 2d 31 32 38 7d 20  {$value < -128} 
0670: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0680: 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74        append dat
0690: 61 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 69  a [my pack fix_i
06a0: 6e 74 31 36 20 24 76 61 6c 75 65 5d 0a 20 20 20  nt16 $value].   
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
06c0: 6c 73 65 69 66 20 7b 24 76 61 6c 75 65 20 3c 20  lseif {$value < 
06d0: 31 32 38 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  128} {.         
06e0: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
06f0: 64 20 64 61 74 61 20 5b 6d 79 20 70 61 63 6b 20  d data [my pack 
0700: 69 6e 74 38 20 24 76 61 6c 75 65 5d 0a 20 20 20  int8 $value].   
0710: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
0720: 6c 73 65 69 66 20 7b 24 76 61 6c 75 65 20 3c 20  lseif {$value < 
0730: 32 35 36 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  256} {.         
0740: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
0750: 64 20 64 61 74 61 20 5b 6d 79 20 70 61 63 6b 20  d data [my pack 
0760: 66 69 78 5f 75 69 6e 74 38 20 24 76 61 6c 75 65  fix_uint8 $value
0770: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
0780: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
07a0: 70 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70  ppend data [my p
07b0: 61 63 6b 20 66 69 78 5f 75 69 6e 74 31 36 20 24  ack fix_uint16 $
07c0: 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20  value].         
07d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
07e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
07f0: 20 20 20 69 6e 74 33 32 20 7b 0a 20 20 20 20 20     int32 {.     
0800: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
0810: 76 61 6c 75 65 20 3c 20 2d 33 32 37 36 38 7d 20  value < -32768} 
0820: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0830: 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74        append dat
0840: 61 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 69  a [my pack fix_i
0850: 6e 74 33 32 20 24 76 61 6c 75 65 5d 0a 20 20 20  nt32 $value].   
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
0870: 6c 73 65 69 66 20 7b 24 76 61 6c 75 65 20 3c 20  lseif {$value < 
0880: 36 35 35 33 36 7d 20 7b 0a 20 20 20 20 20 20 20  65536} {.       
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
08a0: 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61 63  end data [my pac
08b0: 6b 20 69 6e 74 31 36 20 24 76 61 6c 75 65 5d 0a  k int16 $value].
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
08f0: 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61 63  end data [my pac
0900: 6b 20 66 69 78 5f 75 69 6e 74 33 32 20 24 76 61  k fix_uint32 $va
0910: 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  lue].           
0920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
0930: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
0940: 20 69 6e 74 36 34 20 7b 0a 20 20 20 20 20 20 20   int64 {.       
0950: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 61           if {$va
0960: 6c 75 65 20 3c 20 2d 32 31 34 37 34 38 33 36 34  lue < -214748364
0970: 38 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  8} {.           
0980: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20           append 
0990: 64 61 74 61 20 5b 6d 79 20 70 61 63 6b 20 66 69  data [my pack fi
09a0: 78 5f 69 6e 74 36 34 20 24 76 61 6c 75 65 5d 0a  x_int64 $value].
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 7d 20 65 6c 73 65 69 66 20 7b 24 76 61 6c 75 65  } elseif {$value
09d0: 20 3c 20 34 32 39 34 39 36 37 32 39 36 7d 20 7b   < 4294967296} {
09e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
09f0: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61       append data
0a00: 20 5b 6d 79 20 70 61 63 6b 20 69 6e 74 33 32 20   [my pack int32 
0a10: 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20  $value].        
0a20: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
0a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0a40: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61       append data
0a50: 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 75 69   [my pack fix_ui
0a60: 6e 74 36 34 20 24 76 61 6c 75 65 5d 0a 20 20 20  nt64 $value].   
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
0a80: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0a90: 20 20 20 20 20 20 20 20 20 75 69 6e 74 38 20 7b           uint8 {
0aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ab0: 20 73 65 74 20 76 61 6c 75 65 20 5b 65 78 70 72   set value [expr
0ac0: 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46 7d   {$value & 0xFF}
0ad0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
0ae0: 20 20 69 66 20 7b 24 76 61 6c 75 65 20 3c 20 31    if {$value < 1
0af0: 32 38 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  28} {.          
0b00: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
0b10: 20 64 61 74 61 20 5b 6d 79 20 70 61 63 6b 20 66   data [my pack f
0b20: 69 78 6e 75 6d 70 6f 73 20 24 76 61 6c 75 65 5d  ixnumpos $value]
0b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0b40: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
0b60: 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61  pend data [my pa
0b70: 63 6b 20 66 69 78 5f 75 69 6e 74 38 20 24 76 61  ck fix_uint8 $va
0b80: 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  lue].           
0b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
0ba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
0bb0: 20 75 69 6e 74 31 36 20 7b 0a 20 20 20 20 20 20   uint16 {.      
0bc0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61            set va
0bd0: 6c 75 65 20 5b 65 78 70 72 20 7b 24 76 61 6c 75  lue [expr {$valu
0be0: 65 20 26 20 30 78 46 46 46 46 7d 5d 0a 20 20 20  e & 0xFFFF}].   
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
0c00: 7b 24 76 61 6c 75 65 20 3c 20 32 35 36 7d 20 7b  {$value < 256} {
0c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0c20: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61       append data
0c30: 20 5b 6d 79 20 70 61 63 6b 20 75 69 6e 74 38 20   [my pack uint8 
0c40: 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20  $value].        
0c50: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
0c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0c70: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61       append data
0c80: 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 75 69   [my pack fix_ui
0c90: 6e 74 31 36 20 24 76 61 6c 75 65 5d 0a 20 20 20  nt16 $value].   
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
0cb0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0cc0: 20 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20           uint32 
0cd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0ce0: 20 20 73 65 74 20 76 61 6c 75 65 20 5b 65 78 70    set value [exp
0cf0: 72 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46  r {$value & 0xFF
0d00: 46 46 46 46 46 46 7d 5d 0a 20 20 20 20 20 20 20  FFFFFF}].       
0d10: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 61           if {$va
0d20: 6c 75 65 20 3c 20 36 35 35 33 36 7d 20 7b 0a 20  lue < 65536} {. 
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b     append data [
0d50: 6d 79 20 70 61 63 6b 20 69 6e 74 31 36 20 24 76  my pack int16 $v
0d60: 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20  alue].          
0d70: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b     append data [
0da0: 6d 79 20 70 61 63 6b 20 66 69 78 5f 75 69 6e 74  my pack fix_uint
0db0: 33 32 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 20  32 $value].     
0dc0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0dd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
0de0: 20 20 20 20 20 20 20 75 69 6e 74 36 34 20 7b 0a         uint64 {.
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e00: 73 65 74 20 76 61 6c 75 65 20 5b 65 78 70 72 20  set value [expr 
0e10: 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46 46 46  {$value & 0xFFFF
0e20: 46 46 46 46 46 46 46 46 46 46 46 46 7d 5d 0a 20  FFFFFFFFFFFF}]. 
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
0e40: 66 20 7b 24 76 61 6c 75 65 20 3c 20 34 32 39 34  f {$value < 4294
0e50: 39 36 37 32 39 36 7d 20 7b 0a 20 20 20 20 20 20  967296} {.      
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
0e70: 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61  pend data [my pa
0e80: 63 6b 20 69 6e 74 33 32 20 24 76 61 6c 75 65 5d  ck int32 $value]
0e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ea0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
0ec0: 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61  pend data [my pa
0ed0: 63 6b 20 66 69 78 5f 75 69 6e 74 36 34 20 24 76  ck fix_uint64 $v
0ee0: 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20  alue].          
0ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0f00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
0f10: 20 20 66 69 78 5f 65 78 74 31 20 7b 0a 20 20 20    fix_ext1 {.   
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 24               # $
0f30: 76 61 6c 75 65 20 69 73 20 74 68 65 20 65 78 74  value is the ext
0f40: 65 6e 73 69 6f 6e 20 74 79 70 65 20 61 6e 64 20  ension type and 
0f50: 24 76 61 6c 75 65 31 20 69 73 20 74 68 65 20 62  $value1 is the b
0f60: 79 74 65 20 61 72 72 61 79 2e 0a 20 20 20 20 20  yte array..     
0f70: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
0f80: 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66  d data [binary f
0f90: 6f 72 6d 61 74 20 63 63 61 31 20 30 78 44 34 20  ormat cca1 0xD4 
0fa0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
0fb0: 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 76 61        [expr {$va
0fc0: 6c 75 65 20 26 20 30 78 46 46 7d 5d 20 5c 0a 20  lue & 0xFF}] \. 
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 24 76 61 6c 75 65 31 0a 20 20 20 20 20     $value1.     
0ff0: 20 20 20 20 20 20 20 20 20 20 20 5d 0a 20 20 20             ].   
1000: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1010: 20 20 20 20 20 20 20 66 69 78 5f 65 78 74 32 20         fix_ext2 
1020: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1030: 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62    append data [b
1040: 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 63 61  inary format cca
1050: 32 20 30 78 44 35 20 5c 0a 20 20 20 20 20 20 20  2 0xD5 \.       
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
1070: 70 72 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46  pr {$value & 0xF
1080: 46 7d 5d 20 5c 0a 20 20 20 20 20 20 20 20 20 20  F}] \.          
1090: 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65            $value
10a0: 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1.              
10b0: 20 20 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20    ].            
10c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  }.            fi
10d0: 78 5f 65 78 74 34 20 7b 0a 20 20 20 20 20 20 20  x_ext4 {.       
10e0: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20           append 
10f0: 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72  data [binary for
1100: 6d 61 74 20 63 63 61 34 20 30 78 44 36 20 5c 0a  mat cca4 0xD6 \.
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 20 20 20 5b 65 78 70 72 20 7b 24 76 61 6c 75      [expr {$valu
1130: 65 20 26 20 30 78 46 46 7d 5d 20 5c 0a 20 20 20  e & 0xFF}] \.   
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 24 76 61 6c 75 65 31 0a 20 20 20 20 20 20 20   $value1.       
1160: 20 20 20 20 20 20 20 20 20 5d 0a 20 20 20 20 20           ].     
1170: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1180: 20 20 20 20 20 66 69 78 5f 65 78 74 38 20 7b 0a       fix_ext8 {.
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e  append data [bin
11b0: 61 72 79 20 66 6f 72 6d 61 74 20 63 63 61 38 20  ary format cca8 
11c0: 30 78 44 37 20 5c 0a 20 20 20 20 20 20 20 20 20  0xD7 \.         
11d0: 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72             [expr
11e0: 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46 7d   {$value & 0xFF}
11f0: 5d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ] \.            
1200: 20 20 20 20 20 20 20 20 24 76 61 6c 75 65 31 0a          $value1.
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ].            }.
1230: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 78 5f              fix_
1240: 65 78 74 31 36 20 7b 0a 20 20 20 20 20 20 20 20  ext16 {.        
1250: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 64          append d
1260: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  ata [binary form
1270: 61 74 20 63 63 61 31 36 20 30 78 44 38 20 5c 0a  at cca16 0xD8 \.
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 5b 65 78 70 72 20 7b 24 76 61 6c 75      [expr {$valu
12a0: 65 20 26 20 30 78 46 46 7d 5d 20 5c 0a 20 20 20  e & 0xFF}] \.   
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 24 76 61 6c 75 65 31 0a 20 20 20 20 20 20 20   $value1.       
12d0: 20 20 20 20 20 20 20 20 20 5d 0a 20 20 20 20 20           ].     
12e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12f0: 20 20 20 20 20 66 69 78 5f 69 6e 74 38 20 7b 20       fix_int8 { 
1300: 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e  append data [bin
1310: 61 72 79 20 66 6f 72 6d 61 74 20 63 63 20 30 78  ary format cc 0x
1320: 44 30 20 5b 65 78 70 72 20 7b 24 76 61 6c 75 65  D0 [expr {$value
1330: 20 26 20 30 78 46 46 7d 5d 5d 20 7d 0a 20 20 20   & 0xFF}]] }.   
1340: 20 20 20 20 20 20 20 20 20 66 69 78 5f 69 6e 74           fix_int
1350: 31 36 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61  16 { append data
1360: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
1370: 63 53 20 30 78 44 31 20 5b 65 78 70 72 20 7b 24  cS 0xD1 [expr {$
1380: 76 61 6c 75 65 20 26 20 30 78 46 46 46 46 7d 5d  value & 0xFFFF}]
1390: 5d 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ] }.            
13a0: 66 69 78 5f 69 6e 74 33 32 20 7b 20 61 70 70 65  fix_int32 { appe
13b0: 6e 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20  nd data [binary 
13c0: 66 6f 72 6d 61 74 20 63 49 20 30 78 44 32 20 5b  format cI 0xD2 [
13d0: 65 78 70 72 20 7b 24 76 61 6c 75 65 20 26 20 30  expr {$value & 0
13e0: 78 46 46 46 46 46 46 46 46 7d 5d 5d 20 7d 0a 20  xFFFFFFFF}]] }. 
13f0: 20 20 20 20 20 20 20 20 20 20 20 66 69 78 5f 69             fix_i
1400: 6e 74 36 34 20 7b 20 61 70 70 65 6e 64 20 64 61  nt64 { append da
1410: 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61  ta [binary forma
1420: 74 20 63 57 20 30 78 44 33 20 5b 65 78 70 72 20  t cW 0xD3 [expr 
1430: 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46 46 46  {$value & 0xFFFF
1440: 46 46 46 46 46 46 46 46 46 46 46 46 7d 5d 5d 20  FFFFFFFFFFFF}]] 
1450: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  }.            fi
1460: 78 5f 75 69 6e 74 38 20 7b 20 61 70 70 65 6e 64  x_uint8 { append
1470: 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f   data [binary fo
1480: 72 6d 61 74 20 63 63 20 30 78 43 43 20 5b 65 78  rmat cc 0xCC [ex
1490: 70 72 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46  pr {$value & 0xF
14a0: 46 7d 5d 5d 20 7d 0a 20 20 20 20 20 20 20 20 20  F}]] }.         
14b0: 20 20 20 66 69 78 5f 75 69 6e 74 31 36 20 7b 20     fix_uint16 { 
14c0: 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e  append data [bin
14d0: 61 72 79 20 66 6f 72 6d 61 74 20 63 53 20 30 78  ary format cS 0x
14e0: 43 44 20 5b 65 78 70 72 20 7b 24 76 61 6c 75 65  CD [expr {$value
14f0: 20 26 20 30 78 46 46 46 46 7d 5d 5d 20 7d 0a 20   & 0xFFFF}]] }. 
1500: 20 20 20 20 20 20 20 20 20 20 20 66 69 78 5f 75             fix_u
1510: 69 6e 74 33 32 20 7b 20 61 70 70 65 6e 64 20 64  int32 { append d
1520: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  ata [binary form
1530: 61 74 20 63 49 20 30 78 43 45 20 5b 65 78 70 72  at cI 0xCE [expr
1540: 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46 46   {$value & 0xFFF
1550: 46 46 46 46 46 7d 5d 5d 20 7d 0a 20 20 20 20 20  FFFFF}]] }.     
1560: 20 20 20 20 20 20 20 66 69 78 5f 75 69 6e 74 36         fix_uint6
1570: 34 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61 20  4 { append data 
1580: 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63  [binary format c
1590: 57 20 30 78 43 46 20 5b 65 78 70 72 20 7b 24 76  W 0xCF [expr {$v
15a0: 61 6c 75 65 20 26 20 30 78 46 46 46 46 46 46 46  alue & 0xFFFFFFF
15b0: 46 46 46 46 46 46 46 46 46 7d 5d 5d 20 7d 0a 20  FFFFFFFFF}]] }. 
15c0: 20 20 20 20 20 20 20 20 20 20 20 66 6c 6f 61 74             float
15d0: 33 32 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61  32 { append data
15e0: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
15f0: 63 52 20 30 78 43 41 20 24 76 61 6c 75 65 5d 20  cR 0xCA $value] 
1600: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6c  }.            fl
1610: 6f 61 74 36 34 20 7b 20 61 70 70 65 6e 64 20 64  oat64 { append d
1620: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  ata [binary form
1630: 61 74 20 63 51 20 30 78 43 42 20 24 76 61 6c 75  at cQ 0xCB $valu
1640: 65 5d 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20  e] }.           
1650: 20 6e 69 6c 20 7b 20 61 70 70 65 6e 64 20 64 61   nil { append da
1660: 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61  ta [binary forma
1670: 74 20 63 20 30 78 43 30 5d 20 7d 0a 20 20 20 20  t c 0xC0] }.    
1680: 20 20 20 20 20 20 20 20 74 72 75 65 20 7b 20 61          true { a
1690: 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e 61  ppend data [bina
16a0: 72 79 20 66 6f 72 6d 61 74 20 63 20 30 78 43 33  ry format c 0xC3
16b0: 5d 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ] }.            
16c0: 66 61 6c 73 65 20 7b 20 61 70 70 65 6e 64 20 64  false { append d
16d0: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  ata [binary form
16e0: 61 74 20 63 20 30 78 43 32 5d 20 7d 0a 20 20 20  at c 0xC2] }.   
16f0: 20 20 20 20 20 20 20 20 20 61 72 72 61 79 20 7b           array {
1700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1710: 20 69 66 20 7b 24 76 61 6c 75 65 20 3c 20 31 36   if {$value < 16
1720: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
1730: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 64          append d
1740: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  ata [binary form
1750: 61 74 20 63 20 5b 65 78 70 72 20 7b 30 78 39 30  at c [expr {0x90
1760: 20 7c 20 24 76 61 6c 75 65 7d 5d 5d 0a 20 20 20   | $value}]].   
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
1780: 6c 73 65 69 66 20 7b 24 76 61 6c 75 65 20 3c 20  lseif {$value < 
1790: 36 35 35 33 36 7d 20 7b 0a 20 20 20 20 20 20 20  65536} {.       
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
17b0: 65 6e 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79  end data [binary
17c0: 20 66 6f 72 6d 61 74 20 63 53 20 30 78 44 43 20   format cS 0xDC 
17d0: 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20  $value].        
17e0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
17f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1800: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61       append data
1810: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
1820: 63 49 20 30 78 44 44 20 24 76 61 6c 75 65 5d 0a  cI 0xDD $value].
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1850: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 73 74              list
1860: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1870: 20 20 20 73 65 74 20 72 20 5b 6d 79 20 70 61 63     set r [my pac
1880: 6b 20 61 72 72 61 79 20 5b 6c 6c 65 6e 67 74 68  k array [llength
1890: 20 24 76 61 6c 75 65 31 5d 5d 0a 20 20 20 20 20   $value1]].     
18a0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
18b0: 63 68 20 65 20 24 76 61 6c 75 65 31 20 7b 0a 20  ch e $value1 {. 
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 61 70 70 65 6e 64 20 72 20 5b 6d 79 20     append r [my 
18e0: 70 61 63 6b 20 24 76 61 6c 75 65 20 24 65 5d 0a  pack $value $e].
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1910: 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 24 72    append data $r
1920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1930: 20 20 20 20 20 20 20 20 20 20 20 6d 61 70 20 7b             map {
1940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1950: 20 69 66 20 7b 24 76 61 6c 75 65 20 3c 20 31 36   if {$value < 16
1960: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
1970: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 64          append d
1980: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  ata [binary form
1990: 61 74 20 63 20 5b 65 78 70 72 20 7b 30 78 38 30  at c [expr {0x80
19a0: 20 7c 20 24 76 61 6c 75 65 7d 5d 5d 0a 20 20 20   | $value}]].   
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
19c0: 6c 73 65 69 66 20 7b 24 76 61 6c 75 65 20 3c 20  lseif {$value < 
19d0: 36 35 35 33 36 7d 20 7b 0a 20 20 20 20 20 20 20  65536} {.       
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
19f0: 65 6e 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79  end data [binary
1a00: 20 66 6f 72 6d 61 74 20 63 53 20 30 78 44 45 20   format cS 0xDE 
1a10: 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20  $value].        
1a20: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a40: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61       append data
1a50: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
1a60: 63 49 20 30 78 44 46 20 24 76 61 6c 75 65 5d 0a  cI 0xDF $value].
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 74 63 6c 5f              tcl_
1aa0: 61 72 72 61 79 20 7b 0a 20 20 20 20 20 20 20 20  array {.        
1ab0: 20 20 20 20 20 20 20 20 75 70 76 61 72 20 24 76          upvar $v
1ac0: 61 6c 75 65 32 20 61 0a 20 20 20 20 20 20 20 20  alue2 a.        
1ad0: 20 20 20 20 20 20 20 20 73 65 74 20 72 20 5b 6d          set r [m
1ae0: 79 20 70 61 63 6b 20 6d 61 70 20 5b 61 72 72 61  y pack map [arra
1af0: 79 20 73 69 7a 65 20 61 5d 5d 0a 20 20 20 20 20  y size a]].     
1b00: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
1b10: 63 68 20 6b 20 5b 6c 73 6f 72 74 20 2d 64 69 63  ch k [lsort -dic
1b20: 74 69 6f 6e 61 72 79 20 5b 61 72 72 61 79 20 6e  tionary [array n
1b30: 61 6d 65 73 20 61 5d 5d 20 7b 0a 20 20 20 20 20  ames a]] {.     
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1b50: 70 70 65 6e 64 20 72 20 5b 6d 79 20 70 61 63 6b  ppend r [my pack
1b60: 20 24 76 61 6c 75 65 20 24 6b 5d 0a 20 20 20 20   $value $k].    
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 61 70 70 65 6e 64 20 72 20 5b 6d 79 20 70 61 63  append r [my pac
1b90: 6b 20 24 76 61 6c 75 65 31 20 24 61 28 24 6b 29  k $value1 $a($k)
1ba0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
1bb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1bc0: 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20      append data 
1bd0: 24 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  $r.            }
1be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 63  .            dic
1bf0: 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t {.            
1c00: 20 20 20 20 73 65 74 20 72 20 5b 6d 79 20 70 61      set r [my pa
1c10: 63 6b 20 6d 61 70 20 5b 64 69 63 74 20 73 69 7a  ck map [dict siz
1c20: 65 20 24 76 61 6c 75 65 32 5d 5d 0a 20 20 20 20  e $value2]].    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 63 74              dict
1c40: 20 66 6f 72 20 7b 6b 20 76 7d 20 24 76 61 6c 75   for {k v} $valu
1c50: 65 32 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e2 {.           
1c60: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20           append 
1c70: 72 20 5b 6d 79 20 70 61 63 6b 20 24 76 61 6c 75  r [my pack $valu
1c80: 65 20 24 6b 5d 0a 20 20 20 20 20 20 20 20 20 20  e $k].          
1c90: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
1ca0: 20 72 20 5b 6d 79 20 70 61 63 6b 20 24 76 61 6c   r [my pack $val
1cb0: 75 65 31 20 24 76 5d 0a 20 20 20 20 20 20 20 20  ue1 $v].        
1cc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cd0: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
1ce0: 20 64 61 74 61 20 24 72 0a 20 20 20 20 20 20 20   data $r.       
1cf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d00: 20 20 20 62 69 6e 20 7b 0a 20 20 20 20 20 20 20     bin {.       
1d10: 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 20 5b           set n [
1d20: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
1d30: 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20  alue].          
1d40: 20 20 20 20 20 20 69 66 20 7b 24 6e 20 3c 20 32        if {$n < 2
1d50: 35 36 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  56} {.          
1d60: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
1d70: 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f   data [binary fo
1d80: 72 6d 61 74 20 63 63 61 2a 20 30 78 43 34 20 24  rmat cca* 0xC4 $
1d90: 6e 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20  n $value].      
1da0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1db0: 69 66 20 7b 24 6e 20 3c 20 36 35 35 33 36 7d 20  if {$n < 65536} 
1dc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1dd0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74        append dat
1de0: 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74  a [binary format
1df0: 20 63 53 61 2a 20 30 78 43 35 20 24 6e 20 24 76   cSa* 0xC5 $n $v
1e00: 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20  alue].          
1e10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b     append data [
1e40: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 49  binary format cI
1e50: 61 2a 20 30 78 43 36 20 24 6e 20 24 76 61 6c 75  a* 0xC6 $n $valu
1e60: 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e].             
1e70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
1e90: 74 72 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  tr {.           
1ea0: 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b       set value [
1eb0: 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 74  encoding convert
1ec0: 74 6f 20 75 74 66 2d 38 20 24 76 61 6c 75 65 5d  to utf-8 $value]
1ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ee0: 20 73 65 74 20 6e 20 5b 73 74 72 69 6e 67 20 6c   set n [string l
1ef0: 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 0a 20 20  ength $value].  
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1f10: 20 7b 24 6e 20 3c 20 33 32 7d 20 7b 0a 20 20 20   {$n < 32} {.   
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f30: 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69   append data [bi
1f40: 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 61 2a 20  nary format ca* 
1f50: 5b 65 78 70 72 20 7b 30 78 41 30 20 7c 20 24 6e  [expr {0xA0 | $n
1f60: 7d 5d 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 20  }] $value].     
1f70: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1f80: 65 69 66 20 7b 24 6e 20 3c 20 32 35 36 7d 20 7b  eif {$n < 256} {
1f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa0: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61       append data
1fb0: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
1fc0: 63 63 61 2a 20 30 78 44 39 20 24 6e 20 24 76 61  cca* 0xD9 $n $va
1fd0: 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  lue].           
1fe0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24       } elseif {$
1ff0: 6e 20 3c 20 36 35 35 33 36 7d 20 7b 0a 20 20 20  n < 65536} {.   
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69   append data [bi
2020: 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 53 61 2a  nary format cSa*
2030: 20 30 78 44 41 20 24 6e 20 24 76 61 6c 75 65 5d   0xDA $n $value]
2040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2050: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
2070: 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e 61 72  pend data [binar
2080: 79 20 66 6f 72 6d 61 74 20 63 49 61 2a 20 30 78  y format cIa* 0x
2090: 44 42 20 24 6e 20 24 76 61 6c 75 65 5d 0a 20 20  DB $n $value].  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
20c0: 20 20 20 20 20 20 20 20 20 20 65 78 74 20 7b 0a            ext {.
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 23 20 24 76 61 6c 75 65 20 69 73 20 74 68 65 20  # $value is the 
20f0: 65 78 74 65 6e 73 69 6f 6e 20 74 79 70 65 20 61  extension type a
2100: 6e 64 20 24 76 61 6c 75 65 31 20 69 73 20 74 68  nd $value1 is th
2110: 65 20 62 79 74 65 20 61 72 72 61 79 2e 0a 20 20  e byte array..  
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
2130: 74 20 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  t n [string leng
2140: 74 68 20 24 76 61 6c 75 65 31 5d 0a 20 20 20 20  th $value1].    
2150: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2160: 24 6e 20 3c 20 32 35 36 7d 20 7b 0a 20 20 20 20  $n < 256} {.    
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e  append data [bin
2190: 61 72 79 20 66 6f 72 6d 61 74 20 63 63 63 61 2a  ary format ccca*
21a0: 20 30 78 43 37 20 24 6e 20 24 76 61 6c 75 65 20   0xC7 $n $value 
21b0: 24 76 61 6c 75 65 31 5d 0a 20 20 20 20 20 20 20  $value1].       
21c0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
21d0: 66 20 7b 24 6e 20 3c 20 36 35 35 33 36 7d 20 7b  f {$n < 65536} {
21e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21f0: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61       append data
2200: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
2210: 63 53 63 61 2a 20 30 78 43 38 20 24 6e 20 24 76  cSca* 0xC8 $n $v
2220: 61 6c 75 65 20 24 76 61 6c 75 65 31 5d 0a 20 20  alue $value1].  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
2240: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
2250: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
2260: 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66  d data [binary f
2270: 6f 72 6d 61 74 20 63 49 63 61 2a 20 30 78 43 39  ormat cIca* 0xC9
2280: 20 24 6e 20 24 76 61 6c 75 65 20 24 76 61 6c 75   $n $value $valu
2290: 65 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e1].            
22a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22c0: 74 69 6d 65 73 74 61 6d 70 33 32 20 7b 0a 20 20  timestamp32 {.  
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
22e0: 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61  pend data [my pa
22f0: 63 6b 20 66 69 78 5f 65 78 74 34 20 2d 31 20 5b  ck fix_ext4 -1 [
2300: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 20  binary format I 
2310: 5b 65 78 70 72 20 7b 0a 20 20 20 20 20 20 20 20  [expr {.        
2320: 20 20 20 20 20 20 20 20 20 20 20 20 24 76 61 6c              $val
2330: 75 65 20 26 20 30 78 46 46 46 46 46 46 46 46 0a  ue & 0xFFFFFFFF.
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 7d 5d 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20  }]]].           
2360: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
2370: 69 6d 65 73 74 61 6d 70 36 34 20 7b 0a 20 20 20  imestamp64 {.   
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 24               # $
2390: 76 61 6c 75 65 20 69 73 20 73 65 63 6f 6e 64 73  value is seconds
23a0: 20 28 33 34 20 62 69 74 73 20 75 6e 73 69 67 6e   (34 bits unsign
23b0: 65 64 29 2c 20 24 76 61 6c 75 65 31 20 69 73 20  ed), $value1 is 
23c0: 6e 61 6e 6f 73 65 63 6f 6e 64 73 0a 20 20 20 20  nanoseconds.    
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 28 33              # (3
23e0: 30 20 62 69 74 73 20 75 6e 73 69 67 6e 65 64 29  0 bits unsigned)
23f0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2400: 20 20 69 66 20 7b 24 76 61 6c 75 65 31 20 3e 20    if {$value1 > 
2410: 39 39 39 39 39 39 39 39 39 7d 20 7b 20 65 72 72  999999999} { err
2420: 6f 72 20 7b 6e 61 6e 6f 73 65 63 6f 6e 64 73 20  or {nanoseconds 
2430: 65 78 63 65 65 64 20 39 39 39 39 39 39 39 39 39  exceed 999999999
2440: 7d 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20  } }..           
2450: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61       append data
2460: 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 65 78   [my pack fix_ex
2470: 74 38 20 2d 31 20 5b 62 69 6e 61 72 79 20 66 6f  t8 -1 [binary fo
2480: 72 6d 61 74 20 57 20 5b 65 78 70 72 20 7b 0a 20  rmat W [expr {. 
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 28 28 24 76 61 6c 75 65 31 20 3c 3c 20     (($value1 << 
24b0: 33 34 29 20 7c 20 24 76 61 6c 75 65 29 20 26 20  34) | $value) & 
24c0: 30 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46  0xFFFFFFFFFFFFFF
24d0: 46 46 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  FF.             
24e0: 20 20 20 7d 5d 5d 5d 0a 20 20 20 20 20 20 20 20     }]]].        
24f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2500: 20 20 74 69 6d 65 73 74 61 6d 70 39 36 20 7b 0a    timestamp96 {.
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 23 20 24 76 61 6c 75 65 20 69 73 20 73 65 63 6f  # $value is seco
2530: 6e 64 73 20 28 36 34 20 62 69 74 73 20 73 69 67  nds (64 bits sig
2540: 6e 65 64 29 2c 20 24 76 61 6c 75 65 31 20 69 73  ned), $value1 is
2550: 20 6e 61 6e 6f 73 65 63 6f 6e 64 73 0a 20 20 20   nanoseconds.   
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 28               # (
2570: 33 32 20 62 69 74 73 20 75 6e 73 69 67 6e 65 64  32 bits unsigned
2580: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2590: 20 20 69 66 20 7b 24 76 61 6c 75 65 31 20 3e 20    if {$value1 > 
25a0: 39 39 39 39 39 39 39 39 39 7d 20 7b 20 65 72 72  999999999} { err
25b0: 6f 72 20 7b 6e 61 6e 6f 73 65 63 6f 6e 64 73 20  or {nanoseconds 
25c0: 65 78 63 65 65 64 20 39 39 39 39 39 39 39 39 39  exceed 999999999
25d0: 7d 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20  } }..           
25e0: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61       append data
25f0: 20 5b 6d 79 20 70 61 63 6b 20 65 78 74 20 2d 31   [my pack ext -1
2600: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
2610: 49 57 20 5b 65 78 70 72 20 7b 0a 20 20 20 20 20  IW [expr {.     
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
2630: 76 61 6c 75 65 31 20 26 20 30 78 46 46 46 46 46  value1 & 0xFFFFF
2640: 46 46 46 0a 20 20 20 20 20 20 20 20 20 20 20 20  FFF.            
2650: 20 20 20 20 7d 5d 20 24 76 61 6c 75 65 5d 5d 0a      }] $value]].
2660: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2670: 20 20 20 20 20 20 20 20 20 20 6d 69 6c 6c 69 73            millis
2680: 65 63 6f 6e 64 73 20 7b 0a 20 20 20 20 20 20 20  econds {.       
2690: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20           append 
26a0: 64 61 74 61 20 5b 6d 79 20 70 61 63 6b 20 74 69  data [my pack ti
26b0: 6d 65 73 74 61 6d 70 39 36 20 5b 65 78 70 72 20  mestamp96 [expr 
26c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26d0: 20 20 20 20 20 20 72 6f 75 6e 64 28 24 76 61 6c        round($val
26e0: 75 65 20 2f 20 31 30 30 30 29 0a 20 20 20 20 20  ue / 1000).     
26f0: 20 20 20 20 20 20 20 20 20 20 20 7d 5d 20 5b 65             }] [e
2700: 78 70 72 20 7b 0a 20 20 20 20 20 20 20 20 20 20  xpr {.          
2710: 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65            $value
2720: 20 25 20 31 30 30 30 20 2a 20 31 30 30 30 30 30   % 1000 * 100000
2730: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2740: 20 20 7d 5d 5d 0a 20 20 20 20 20 20 20 20 20 20    }]].          
2750: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2760: 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 7b 0a 20  microseconds {. 
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2780: 70 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70  ppend data [my p
2790: 61 63 6b 20 74 69 6d 65 73 74 61 6d 70 39 36 20  ack timestamp96 
27a0: 5b 65 78 70 72 20 7b 0a 20 20 20 20 20 20 20 20  [expr {.        
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 75 6e              roun
27c0: 64 28 24 76 61 6c 75 65 20 2f 20 31 30 30 30 30  d($value / 10000
27d0: 30 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  00).            
27e0: 20 20 20 20 7d 5d 20 5b 65 78 70 72 20 7b 0a 20      }] [expr {. 
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 24 76 61 6c 75 65 20 25 20 31 30 30 30     $value % 1000
2810: 30 30 30 20 2a 20 31 30 30 30 0a 20 20 20 20 20  000 * 1000.     
2820: 20 20 20 20 20 20 20 20 20 20 20 7d 5d 5d 0a 20             }]]. 
2830: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2840: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
2850: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2860: 20 20 20 65 72 72 6f 72 20 5b 6c 69 73 74 20 75     error [list u
2870: 6e 6b 6e 6f 77 6e 20 74 79 70 65 3a 20 24 74 79  nknown type: $ty
2880: 70 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  pe].            
2890: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28a0: 20 20 20 20 72 65 74 75 72 6e 0a 20 20 20 20 7d      return.    }
28b0: 0a 7d 0a 0a 6f 6f 3a 3a 63 6c 61 73 73 20 63 72  .}..oo::class cr
28c0: 65 61 74 65 20 6d 73 67 70 61 63 6b 3a 3a 75 6e  eate msgpack::un
28d0: 70 61 63 6b 65 72 20 7b 0a 0a 20 20 20 20 76 61  packer {..    va
28e0: 72 69 61 62 6c 65 20 64 61 74 61 20 73 74 72 65  riable data stre
28f0: 61 6d 20 63 61 6c 6c 62 61 63 6b 20 63 6f 72 6f  am callback coro
2900: 20 65 78 74 5f 75 6e 70 61 63 6b 65 72 73 0a 0a   ext_unpackers..
2910: 20 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72 20      constructor 
2920: 7b 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74  {} {.        set
2930: 20 65 78 74 5f 75 6e 70 61 63 6b 65 72 73 20 7b   ext_unpackers {
2940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 20  .            -1 
2950: 7b 61 70 70 6c 79 20 7b 7b 74 79 70 65 20 64 61  {apply {{type da
2960: 74 61 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ta} {.          
2970: 20 20 20 20 20 20 73 65 74 20 6c 65 6e 20 5b 73        set len [s
2980: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61  tring length $da
2990: 74 61 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta].            
29a0: 20 20 20 20 69 66 20 7b 24 6c 65 6e 20 3d 3d 20      if {$len == 
29b0: 34 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4} {.           
29c0: 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20           binary 
29d0: 73 63 61 6e 20 24 64 61 74 61 20 49 20 73 0a 20  scan $data I s. 
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 73 65 74 20 73 20 5b 65 78 70 72 20 7b     set s [expr {
2a00: 20 24 73 20 26 20 30 78 46 46 46 46 46 46 46 46   $s & 0xFFFFFFFF
2a10: 20 7d 5d 0a 0a 20 20 20 20 20 20 20 20 20 20 20   }]..           
2a20: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2a30: 5b 6c 69 73 74 20 74 69 6d 65 73 74 61 6d 70 20  [list timestamp 
2a40: 24 73 20 30 5d 0a 20 20 20 20 20 20 20 20 20 20  $s 0].          
2a50: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
2a60: 24 6c 65 6e 20 3d 3d 20 38 7d 20 7b 0a 20 20 20  $len == 8} {.   
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61   binary scan $da
2a90: 74 61 20 57 20 74 0a 20 20 20 20 20 20 20 20 20  ta W t.         
2aa0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74             set t
2ab0: 20 5b 65 78 70 72 20 7b 20 24 74 20 26 20 30 78   [expr { $t & 0x
2ac0: 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46  FFFFFFFFFFFFFFFF
2ad0: 20 7d 5d 0a 0a 20 20 20 20 20 20 20 20 20 20 20   }]..           
2ae0: 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 73 20           set ns 
2af0: 5b 65 78 70 72 20 7b 20 24 74 20 3e 3e 20 33 34  [expr { $t >> 34
2b00: 20 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }].            
2b10: 20 20 20 20 20 20 20 20 73 65 74 20 73 20 5b 65          set s [e
2b20: 78 70 72 20 7b 20 24 74 20 26 20 30 58 30 30 30  xpr { $t & 0X000
2b30: 30 30 30 30 33 46 46 46 46 46 46 46 46 20 7d 5d  00003FFFFFFFF }]
2b40: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2b50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
2b60: 73 74 20 74 69 6d 65 73 74 61 6d 70 20 24 73 20  st timestamp $s 
2b70: 24 6e 73 5d 0a 20 20 20 20 20 20 20 20 20 20 20  $ns].           
2b80: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24       } elseif {$
2b90: 6c 65 6e 20 3d 3d 20 31 32 7d 20 7b 0a 20 20 20  len == 12} {.   
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61   binary scan $da
2bc0: 74 61 20 49 57 20 6e 73 20 73 0a 0a 20 20 20 20  ta IW ns s..    
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 73 65 74 20 6e 73 20 5b 65 78 70 72 20 7b 20 24  set ns [expr { $
2bf0: 6e 73 20 26 20 30 78 46 46 46 46 46 46 46 46 46  ns & 0xFFFFFFFFF
2c00: 46 46 46 46 46 46 46 20 7d 5d 0a 20 20 20 20 20  FFFFFFF }].     
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2c20: 65 74 75 72 6e 20 5b 6c 69 73 74 20 74 69 6d 65  eturn [list time
2c30: 73 74 61 6d 70 20 24 73 20 24 6e 73 5d 0a 20 20  stamp $s $ns].  
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
2c50: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
2c60: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
2c70: 20 5b 6c 69 73 74 20 63 61 6e 27 74 20 64 65 63   [list can't dec
2c80: 6f 64 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 66  ode timestamp of
2c90: 20 6c 65 6e 67 74 68 20 24 6c 65 6e 5d 0a 20 20   length $len].  
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 7d 7d 0a              }}}.
2cc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
2cd0: 0a 20 20 20 20 64 65 73 74 72 75 63 74 6f 72 20  .    destructor 
2ce0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  {.        if {[i
2cf0: 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 72 6f 5d  nfo exists coro]
2d00: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
2d10: 72 65 6e 61 6d 65 20 24 63 6f 72 6f 20 7b 7d 0a  rename $coro {}.
2d20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
2d30: 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 65 74 5f  .    method set_
2d40: 65 78 74 5f 75 6e 70 61 63 6b 65 72 20 61 72 67  ext_unpacker arg
2d50: 73 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 73  s {.        lass
2d60: 69 67 6e 20 24 61 72 67 73 20 74 79 70 65 20 73  ign $args type s
2d70: 63 72 69 70 74 0a 20 20 20 20 20 20 20 20 73 77  cript.        sw
2d80: 69 74 63 68 20 5b 6c 6c 65 6e 67 74 68 20 24 61  itch [llength $a
2d90: 72 67 73 5d 20 7b 0a 20 20 20 20 20 20 20 20 20  rgs] {.         
2da0: 20 20 20 30 20 7b 20 72 65 74 75 72 6e 20 24 65     0 { return $e
2db0: 78 74 5f 75 6e 70 61 63 6b 65 72 73 20 7d 0a 20  xt_unpackers }. 
2dc0: 20 20 20 20 20 20 20 20 20 20 20 31 20 7b 20 72             1 { r
2dd0: 65 74 75 72 6e 20 5b 64 69 63 74 20 67 65 74 20  eturn [dict get 
2de0: 24 65 78 74 5f 75 6e 70 61 63 6b 65 72 73 20 24  $ext_unpackers $
2df0: 74 79 70 65 5d 20 7d 0a 20 20 20 20 20 20 20 20  type] }.        
2e00: 20 20 20 20 32 20 7b 0a 20 20 20 20 20 20 20 20      2 {.        
2e10: 20 20 20 20 20 20 20 20 64 69 63 74 20 73 65 74          dict set
2e20: 20 65 78 74 5f 75 6e 70 61 63 6b 65 72 73 20 24   ext_unpackers $
2e30: 74 79 70 65 20 24 73 63 72 69 70 74 0a 20 20 20  type $script.   
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2e50: 75 72 6e 20 7b 7d 0a 20 20 20 20 20 20 20 20 20  urn {}.         
2e60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e70: 20 64 65 66 61 75 6c 74 20 7b 0a 20 20 20 20 20   default {.     
2e80: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
2e90: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2ea0: 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20  should be.      
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 5c 22 73 65 74 5f 65 78 74 5f 75 6e 70 61 63   \"set_ext_unpac
2ed0: 6b 65 72 20 3f 74 79 70 65 3f 20 3f 73 63 72 69  ker ?type? ?scri
2ee0: 70 74 3f 5c 22 22 0a 20 20 20 20 20 20 20 20 20  pt?\"".         
2ef0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2f00: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
2f10: 20 75 6e 70 61 63 6b 5f 65 78 74 20 7b 74 79 70   unpack_ext {typ
2f20: 65 20 64 61 74 61 7d 20 7b 0a 20 20 20 20 20 20  e data} {.      
2f30: 20 20 69 66 20 7b 5b 64 69 63 74 20 65 78 69 73    if {[dict exis
2f40: 74 73 20 24 65 78 74 5f 75 6e 70 61 63 6b 65 72  ts $ext_unpacker
2f50: 73 20 24 74 79 70 65 5d 0a 20 20 20 20 20 20 20  s $type].       
2f60: 20 20 20 20 20 26 26 20 5b 64 69 63 74 20 67 65       && [dict ge
2f70: 74 20 24 65 78 74 5f 75 6e 70 61 63 6b 65 72 73  t $ext_unpackers
2f80: 20 24 74 79 70 65 5d 20 6e 65 20 7b 7d 7d 20 7b   $type] ne {}} {
2f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2fa0: 75 72 6e 20 5b 7b 2a 7d 5b 64 69 63 74 20 67 65  urn [{*}[dict ge
2fb0: 74 20 24 65 78 74 5f 75 6e 70 61 63 6b 65 72 73  t $ext_unpackers
2fc0: 20 24 74 79 70 65 5d 20 24 74 79 70 65 20 24 64   $type] $type $d
2fd0: 61 74 61 5d 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ata].        }..
2fe0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
2ff0: 6c 69 73 74 20 65 78 74 20 24 74 79 70 65 20 24  list ext $type $
3000: 64 61 74 61 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  data].    }..   
3010: 20 6d 65 74 68 6f 64 20 75 6e 70 61 63 6b 5f 73   method unpack_s
3020: 74 72 65 61 6d 20 7b 69 73 74 72 65 61 6d 20 69  tream {istream i
3030: 63 61 6c 6c 62 61 63 6b 7d 20 7b 0a 20 20 20 20  callback} {.    
3040: 20 20 20 20 73 65 74 20 63 6f 72 6f 20 3a 3a 6d      set coro ::m
3050: 73 67 70 61 63 6b 3a 3a 75 70 73 5b 63 6c 6f 63  sgpack::ups[cloc
3060: 6b 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5d 0a  k milliseconds].
3070: 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
3080: 20 22 22 0a 20 20 20 20 20 20 20 20 73 65 74 20   "".        set 
3090: 73 74 72 65 61 6d 20 24 69 73 74 72 65 61 6d 0a  stream $istream.
30a0: 20 20 20 20 20 20 20 20 73 65 74 20 63 61 6c 6c          set call
30b0: 62 61 63 6b 20 24 69 63 61 6c 6c 62 61 63 6b 0a  back $icallback.
30c0: 20 20 20 20 20 20 20 20 63 6f 72 6f 75 74 69 6e          coroutin
30d0: 65 20 24 63 6f 72 6f 20 5b 73 65 6c 66 5d 20 75  e $coro [self] u
30e0: 6e 70 61 63 6b 5f 63 6f 72 6f 20 30 20 31 0a 20  npack_coro 0 1. 
30f0: 20 20 20 20 20 20 20 63 68 61 6e 20 63 6f 6e 66         chan conf
3100: 69 67 75 72 65 20 24 73 74 72 65 61 6d 20 2d 62  igure $stream -b
3110: 6c 6f 63 6b 69 6e 67 20 30 20 2d 62 75 66 66 65  locking 0 -buffe
3120: 72 69 6e 67 20 6e 6f 6e 65 20 2d 74 72 61 6e 73  ring none -trans
3130: 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 2d 65  lation binary -e
3140: 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 0a 20  ncoding binary. 
3150: 20 20 20 20 20 20 20 63 68 61 6e 20 65 76 65 6e         chan even
3160: 74 20 24 73 74 72 65 61 6d 20 72 65 61 64 61 62  t $stream readab
3170: 6c 65 20 24 63 6f 72 6f 0a 20 20 20 20 7d 0a 0a  le $coro.    }..
3180: 20 20 20 20 6d 65 74 68 6f 64 20 75 6e 70 61 63      method unpac
3190: 6b 5f 73 74 72 69 6e 67 20 7b 69 64 61 74 61 20  k_string {idata 
31a0: 7b 69 63 61 6c 6c 62 61 63 6b 20 7b 7d 7d 7d 20  {icallback {}}} 
31b0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61  {.        set da
31c0: 74 61 20 24 69 64 61 74 61 0a 20 20 20 20 20 20  ta $idata.      
31d0: 20 20 73 65 74 20 63 61 6c 6c 62 61 63 6b 20 24    set callback $
31e0: 69 63 61 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20  icallback.      
31f0: 20 20 73 65 74 20 6c 20 5b 6d 79 20 75 6e 70 61    set l [my unpa
3200: 63 6b 5f 63 6f 72 6f 20 30 20 30 5d 0a 20 20 20  ck_coro 0 0].   
3210: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
3220: 68 20 24 63 61 6c 6c 62 61 63 6b 5d 20 3d 3d 20  h $callback] == 
3230: 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0} {.           
3240: 20 72 65 74 75 72 6e 20 24 6c 0a 20 20 20 20 20   return $l.     
3250: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3260: 6d 65 74 68 6f 64 20 4e 65 65 64 43 6f 72 6f 20  method NeedCoro 
3270: 7b 6e 7d 20 7b 0a 20 20 20 20 20 20 20 20 77 68  {n} {.        wh
3280: 69 6c 65 20 7b 31 7d 20 7b 0a 20 20 20 20 20 20  ile {1} {.      
3290: 20 20 20 20 20 20 23 20 43 61 74 63 68 20 74 68        # Catch th
32a0: 65 20 5b 65 6f 66 5d 20 61 6e 64 20 5b 72 65 61  e [eof] and [rea
32b0: 64 5d 2c 20 73 6f 63 6b 65 74 20 6d 61 79 20 62  d], socket may b
32c0: 65 20 63 6c 6f 73 65 20 61 6c 72 65 61 64 79 2e  e close already.
32d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74  .            cat
32e0: 63 68 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ch {.           
32f0: 20 20 20 20 20 69 66 20 7b 5b 65 6f 66 20 24 73       if {[eof $s
3300: 74 72 65 61 6d 5d 7d 20 7b 0a 20 20 20 20 20 20  tream]} {.      
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 2a                {*
3320: 7d 24 63 61 6c 6c 62 61 63 6b 20 65 6f 66 20 24  }$callback eof $
3330: 73 74 72 65 61 6d 0a 20 20 20 20 20 20 20 20 20  stream.         
3340: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
3350: 6e 20 2d 63 6f 64 65 20 72 65 74 75 72 6e 20 7b  n -code return {
3360: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3370: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3380: 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20      append data 
3390: 5b 72 65 61 64 20 24 73 74 72 65 61 6d 5d 0a 20  [read $stream]. 
33a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
33b0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
33c0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74  ring length $dat
33d0: 61 5d 20 3e 3d 20 24 6e 7d 20 62 72 65 61 6b 0a  a] >= $n} break.
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
33f0: 64 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  d.        }.    
3400: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 4e 65  }..    method Ne
3410: 65 64 53 74 72 69 6e 67 20 7b 6e 7d 20 7b 0a 20  edString {n} {. 
3420: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
3430: 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 61 5d  ng length $data]
3440: 20 3c 20 24 6e 7d 20 7b 0a 20 20 20 20 20 20 20   < $n} {.       
3450: 20 20 20 20 20 65 72 72 6f 72 20 22 69 6e 70 75       error "inpu
3460: 74 20 73 74 72 69 6e 67 20 6e 6f 74 20 6c 6f 6e  t string not lon
3470: 67 20 65 6e 6f 75 67 68 2c 20 6e 65 65 64 20 24  g enough, need $
3480: 6e 20 62 79 74 65 28 73 29 2c 20 6f 6e 6c 79 20  n byte(s), only 
3490: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
34a0: 64 61 74 61 5d 20 6c 65 66 74 22 0a 20 20 20 20  data] left".    
34b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
34c0: 20 6d 65 74 68 6f 64 20 75 6e 70 61 63 6b 5f 63   method unpack_c
34d0: 6f 72 6f 20 7b 6e 65 73 74 65 64 20 63 6f 72 6f  oro {nested coro
34e0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  } {.        if {
34f0: 24 63 6f 72 6f 7d 20 7b 0a 20 20 20 20 20 20 20  $coro} {.       
3500: 20 20 20 20 20 69 66 20 7b 21 24 6e 65 73 74 65       if {!$neste
3510: 64 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d} {.           
3520: 20 20 20 20 20 23 20 59 69 65 6c 64 20 63 72 65       # Yield cre
3530: 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ation.          
3540: 20 20 20 20 20 20 79 69 65 6c 64 0a 20 20 20 20        yield.    
3550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3560: 20 20 20 20 20 20 73 65 74 20 6e 65 65 64 5f 70        set need_p
3570: 72 6f 63 20 4e 65 65 64 43 6f 72 6f 0a 20 20 20  roc NeedCoro.   
3580: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
3590: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 65            set ne
35a0: 65 64 5f 70 72 6f 63 20 4e 65 65 64 53 74 72 69  ed_proc NeedStri
35b0: 6e 67 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ng.        }.   
35c0: 20 20 20 20 20 73 65 74 20 6c 20 7b 7d 0a 20 20       set l {}.  
35d0: 20 20 20 20 20 20 77 68 69 6c 65 20 7b 31 7d 20        while {1} 
35e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 79  {.            my
35f0: 20 24 6e 65 65 64 5f 70 72 6f 63 20 31 0a 20 20   $need_proc 1.  
3600: 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 79            binary
3610: 20 73 63 61 6e 20 24 64 61 74 61 20 63 20 63 0a   scan $data c c.
3620: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
3630: 74 63 20 5b 65 78 70 72 20 7b 24 63 20 26 20 30  tc [expr {$c & 0
3640: 78 46 46 7d 5d 0a 20 20 20 20 20 20 20 20 20 20  xFF}].          
3650: 20 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 69    set data [stri
3660: 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 31  ng range $data 1
3670: 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20   end].          
3680: 20 20 69 66 20 7b 24 74 63 20 3c 20 30 78 38 30    if {$tc < 0x80
3690: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
36a0: 20 20 20 20 23 20 50 6f 73 69 74 69 76 65 20 46      # Positive F
36b0: 69 78 4e 75 6d 0a 20 20 20 20 20 20 20 20 20 20  ixNum.          
36c0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20        lappend l 
36d0: 5b 6c 69 73 74 20 69 6e 74 65 67 65 72 20 5b 65  [list integer [e
36e0: 78 70 72 20 7b 24 63 20 26 20 30 78 37 46 7d 5d  xpr {$c & 0x7F}]
36f0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ].            } 
3700: 65 6c 73 65 69 66 20 7b 28 24 74 63 20 26 20 30  elseif {($tc & 0
3710: 78 45 30 29 20 3e 3d 20 30 78 45 30 7d 20 7b 0a  xE0) >= 0xE0} {.
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 23 20 4e 65 67 61 74 69 76 65 20 46 69 78 4e 75  # Negative FixNu
3740: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
3750: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 5b 62    binary scan [b
3760: 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 20 5b  inary format c [
3770: 65 78 70 72 20 7b 28 24 63 20 26 20 30 78 31 46  expr {($c & 0x1F
3780: 29 20 7c 20 30 78 45 30 7d 5d 5d 20 63 20 63 0a  ) | 0xE0}]] c c.
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a0: 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20  lappend l [list 
37b0: 69 6e 74 65 67 65 72 20 24 63 5d 0a 20 20 20 20  integer $c].    
37c0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
37d0: 20 7b 24 74 63 20 3e 3d 20 30 78 38 30 20 26 26   {$tc >= 0x80 &&
37e0: 20 24 74 63 20 3c 3d 20 30 78 38 46 7d 20 7b 0a   $tc <= 0x8F} {.
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 23 20 46 69 78 4d 61 70 0a 20 20 20 20 20 20 20  # FixMap.       
3810: 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 20 5b           set n [
3820: 65 78 70 72 20 7b 24 74 63 20 26 20 30 78 46 7d  expr {$tc & 0xF}
3830: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
3840: 20 20 73 65 74 20 61 20 7b 7d 0a 20 20 20 20 20    set a {}.     
3850: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b             for {
3860: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 24  set i 0} {$i < $
3870: 6e 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  n} {incr i} {.  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 6c 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b    lappend a {*}[
38a0: 6d 79 20 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31  my unpack_coro 1
38b0: 20 24 63 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20   $coro].        
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
38d0: 65 6e 64 20 61 20 7b 2a 7d 5b 6d 79 20 75 6e 70  end a {*}[my unp
38e0: 61 63 6b 5f 63 6f 72 6f 20 31 20 24 63 6f 72 6f  ack_coro 1 $coro
38f0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
3900: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3910: 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c      lappend l [l
3920: 69 73 74 20 6d 61 70 20 24 61 5d 0a 20 20 20 20  ist map $a].    
3930: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
3940: 20 7b 24 74 63 20 3e 3d 20 30 78 39 30 20 26 26   {$tc >= 0x90 &&
3950: 20 24 74 63 20 3c 3d 20 30 78 39 46 7d 20 7b 0a   $tc <= 0x9F} {.
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 23 20 46 69 78 41 72 72 61 79 0a 20 20 20 20 20  # FixArray.     
3980: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e             set n
3990: 20 5b 65 78 70 72 20 7b 24 74 63 20 26 20 30 78   [expr {$tc & 0x
39a0: 46 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  F}].            
39b0: 20 20 20 20 73 65 74 20 61 20 7b 7d 0a 20 20 20      set a {}.   
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
39d0: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
39e0: 20 24 6e 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a   $n} {incr i} {.
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a00: 20 20 20 20 6c 61 70 70 65 6e 64 20 61 20 7b 2a      lappend a {*
3a10: 7d 5b 6d 79 20 75 6e 70 61 63 6b 5f 63 6f 72 6f  }[my unpack_coro
3a20: 20 31 20 24 63 6f 72 6f 5d 0a 20 20 20 20 20 20   1 $coro].      
3a30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
3a50: 65 6e 64 20 6c 20 5b 6c 69 73 74 20 61 72 72 61  end l [list arra
3a60: 79 20 24 61 5d 0a 20 20 20 20 20 20 20 20 20 20  y $a].          
3a70: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 20    } elseif {$tc 
3a80: 3e 3d 20 30 78 41 30 20 26 26 20 24 74 63 20 3c  >= 0xA0 && $tc <
3a90: 3d 20 30 78 42 46 7d 20 7b 0a 20 20 20 20 20 20  = 0xBF} {.      
3aa0: 20 20 20 20 20 20 20 20 20 20 23 20 46 69 78 53            # FixS
3ab0: 74 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  tr.             
3ac0: 20 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b     set n [expr {
3ad0: 24 74 63 20 26 20 30 78 31 46 7d 5d 0a 20 20 20  $tc & 0x1F}].   
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20               my 
3af0: 24 6e 65 65 64 5f 70 72 6f 63 20 24 6e 0a 20 20  $need_proc $n.  
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69                bi
3b10: 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74 61 20  nary scan $data 
3b20: 61 24 6e 20 63 0a 20 20 20 20 20 20 20 20 20 20  a$n c.          
3b30: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20        lappend l 
3b40: 5b 6c 69 73 74 20 73 74 72 20 5b 65 6e 63 6f 64  [list str [encod
3b50: 69 6e 67 20 63 6f 6e 76 65 72 74 66 72 6f 6d 20  ing convertfrom 
3b60: 75 74 66 2d 38 20 24 63 5d 5d 0a 20 20 20 20 20  utf-8 $c]].     
3b70: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
3b80: 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  ata [string rang
3b90: 65 20 24 64 61 74 61 20 24 6e 20 65 6e 64 5d 0a  e $data $n end].
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
3bb0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
3bc0: 20 20 20 20 20 69 66 20 7b 24 74 63 20 3d 3d 20       if {$tc == 
3bd0: 30 78 43 30 7d 20 7b 0a 20 20 20 20 20 20 20 20  0xC0} {.        
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 6e 69              # ni
3bf0: 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
3c00: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20        lappend l 
3c10: 6e 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  nil.            
3c20: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74      } elseif {$t
3c30: 63 20 3d 3d 20 30 78 43 32 7d 20 7b 0a 20 20 20  c == 0xC2} {.   
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 23 20 66 61 6c 73 65 0a 20 20 20 20 20 20 20   # false.       
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
3c70: 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 62 6f 6f  pend l [list boo
3c80: 6c 65 61 6e 20 30 5d 0a 20 20 20 20 20 20 20 20  lean 0].        
3c90: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
3ca0: 20 7b 24 74 63 20 3d 3d 20 30 78 43 33 7d 20 7b   {$tc == 0xC3} {
3cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3cc0: 20 20 20 20 20 23 20 74 72 75 65 0a 20 20 20 20       # true.    
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ce0: 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20  lappend l [list 
3cf0: 62 6f 6f 6c 65 61 6e 20 31 5d 0a 20 20 20 20 20  boolean 1].     
3d00: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
3d10: 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 43 34  eif {$tc == 0xC4
3d20: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
3d30: 20 20 20 20 20 20 20 20 23 20 62 69 6e 20 38 0a          # bin 8.
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d50: 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f      my $need_pro
3d60: 63 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  c 1.            
3d70: 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 73          binary s
3d80: 63 61 6e 20 24 64 61 74 61 20 63 20 6e 0a 20 20  can $data c n.  
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24    set n [expr {$
3db0: 6e 20 26 20 30 78 46 46 7d 5d 0a 20 20 20 20 20  n & 0xFF}].     
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
3dd0: 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67 20  et data [string 
3de0: 72 61 6e 67 65 20 24 64 61 74 61 20 31 20 65 6e  range $data 1 en
3df0: 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d].             
3e00: 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f         my $need_
3e10: 70 72 6f 63 20 24 6e 0a 20 20 20 20 20 20 20 20  proc $n.        
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61              bina
3e30: 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 61 24  ry scan $data a$
3e40: 6e 20 63 0a 20 20 20 20 20 20 20 20 20 20 20 20  n c.            
3e50: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
3e60: 6c 20 5b 6c 69 73 74 20 62 69 6e 20 24 63 5d 0a  l [list bin $c].
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e80: 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 74      set data [st
3e90: 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61  ring range $data
3ea0: 20 24 6e 20 65 6e 64 5d 0a 20 20 20 20 20 20 20   $n end].       
3eb0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
3ec0: 66 20 7b 24 74 63 20 3d 3d 20 30 78 43 35 7d 20  f {$tc == 0xC5} 
3ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3ee0: 20 20 20 20 20 20 23 20 62 69 6e 20 31 36 0a 20        # bin 16. 
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63     my $need_proc
3f10: 20 32 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   2.             
3f20: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 63         binary sc
3f30: 61 6e 20 24 64 61 74 61 20 53 20 6e 0a 20 20 20  an $data S n.   
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f50: 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24 6e   set n [expr {$n
3f60: 20 26 20 30 78 46 46 46 46 7d 5d 0a 20 20 20 20   & 0xFFFF}].    
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67  set data [string
3f90: 20 72 61 6e 67 65 20 24 64 61 74 61 20 32 20 65   range $data 2 e
3fa0: 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  nd].            
3fb0: 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64          my $need
3fc0: 5f 70 72 6f 63 20 24 6e 0a 20 20 20 20 20 20 20  _proc $n.       
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e               bin
3fe0: 61 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 61  ary scan $data a
3ff0: 24 6e 20 63 0a 20 20 20 20 20 20 20 20 20 20 20  $n c.           
4000: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
4010: 20 6c 20 5b 6c 69 73 74 20 62 69 6e 20 24 63 5d   l [list bin $c]
4020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4030: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73       set data [s
4040: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74  tring range $dat
4050: 61 20 24 6e 20 65 6e 64 5d 0a 20 20 20 20 20 20  a $n end].      
4060: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
4070: 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 43 36 7d  if {$tc == 0xC6}
4080: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4090: 20 20 20 20 20 20 20 23 20 62 69 6e 20 33 32 0a         # bin 32.
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f      my $need_pro
40c0: 63 20 34 0a 20 20 20 20 20 20 20 20 20 20 20 20  c 4.            
40d0: 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 73          binary s
40e0: 63 61 6e 20 24 64 61 74 61 20 49 20 6e 0a 20 20  can $data I n.  
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24    set n [expr {$
4110: 6e 20 26 20 30 78 46 46 46 46 46 46 46 46 7d 5d  n & 0xFFFFFFFF}]
4120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4130: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73       set data [s
4140: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74  tring range $dat
4150: 61 20 34 20 65 6e 64 5d 0a 20 20 20 20 20 20 20  a 4 end].       
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20               my 
4170: 24 6e 65 65 64 5f 70 72 6f 63 20 24 6e 0a 20 20  $need_proc $n.  
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4190: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64    binary scan $d
41a0: 61 74 61 20 61 24 6e 20 63 0a 20 20 20 20 20 20  ata a$n c.      
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
41c0: 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 62 69  ppend l [list bi
41d0: 6e 20 24 63 5d 0a 20 20 20 20 20 20 20 20 20 20  n $c].          
41e0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61            set da
41f0: 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  ta [string range
4200: 20 24 64 61 74 61 20 24 6e 20 65 6e 64 5d 0a 20   $data $n end]. 
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4220: 20 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d 20   elseif {$tc == 
4230: 30 78 43 37 7d 20 7b 0a 20 20 20 20 20 20 20 20  0xC7} {.        
4240: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 65 78              # ex
4250: 74 20 38 0a 20 20 20 20 20 20 20 20 20 20 20 20  t 8.            
4260: 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64          my $need
4270: 5f 70 72 6f 63 20 32 0a 20 20 20 20 20 20 20 20  _proc 2.        
4280: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61              bina
4290: 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 63 63  ry scan $data cc
42a0: 20 6e 20 65 78 74 5f 74 79 70 65 0a 20 20 20 20   n ext_type.    
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24 6e 20  set n [expr {$n 
42d0: 26 20 30 78 46 46 7d 5d 0a 20 20 20 20 20 20 20  & 0xFF}].       
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
42f0: 20 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61   data [string ra
4300: 6e 67 65 20 24 64 61 74 61 20 32 20 65 6e 64 5d  nge $data 2 end]
4310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4320: 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72       my $need_pr
4330: 6f 63 20 24 6e 0a 20 20 20 20 20 20 20 20 20 20  oc $n.          
4340: 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 79            binary
4350: 20 73 63 61 6e 20 24 64 61 74 61 20 61 24 6e 20   scan $data a$n 
4360: 63 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c.              
4370: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20        lappend l 
4380: 5b 6d 79 20 75 6e 70 61 63 6b 5f 65 78 74 20 24  [my unpack_ext $
4390: 65 78 74 5f 74 79 70 65 20 24 63 5d 0a 20 20 20  ext_type $c].   
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e   set data [strin
43c0: 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 24 6e  g range $data $n
43d0: 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20   end].          
43e0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
43f0: 24 74 63 20 3d 3d 20 30 78 43 38 7d 20 7b 0a 20  $tc == 0xC8} {. 
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 20 23 20 65 78 74 20 31 36 0a 20 20 20 20     # ext 16.    
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4430: 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 33 0a  my $need_proc 3.
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20      binary scan 
4460: 24 64 61 74 61 20 53 63 20 6e 20 65 78 74 5f 74  $data Sc n ext_t
4470: 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ype.            
4480: 20 20 20 20 20 20 20 20 73 65 74 20 6e 20 5b 65          set n [e
4490: 78 70 72 20 7b 24 6e 20 26 20 30 78 46 46 46 46  xpr {$n & 0xFFFF
44a0: 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }].             
44b0: 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 20         set data 
44c0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64  [string range $d
44d0: 61 74 61 20 33 20 65 6e 64 5d 0a 20 20 20 20 20  ata 3 end].     
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
44f0: 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 24 6e 0a  y $need_proc $n.
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20      binary scan 
4520: 24 64 61 74 61 20 61 24 6e 20 63 0a 20 20 20 20  $data a$n c.    
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 6c 61 70 70 65 6e 64 20 6c 20 5b 6d 79 20 75 6e  lappend l [my un
4550: 70 61 63 6b 5f 65 78 74 20 24 65 78 74 5f 74 79  pack_ext $ext_ty
4560: 70 65 20 24 63 5d 0a 20 20 20 20 20 20 20 20 20  pe $c].         
4570: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
4580: 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  ata [string rang
4590: 65 20 24 64 61 74 61 20 24 6e 20 65 6e 64 5d 0a  e $data $n end].
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d  } elseif {$tc ==
45c0: 20 30 78 43 39 7d 20 7b 0a 20 20 20 20 20 20 20   0xC9} {.       
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 65               # e
45e0: 78 74 20 33 32 0a 20 20 20 20 20 20 20 20 20 20  xt 32.          
45f0: 20 20 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65            my $ne
4600: 65 64 5f 70 72 6f 63 20 35 0a 20 20 20 20 20 20  ed_proc 5.      
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69                bi
4620: 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74 61 20  nary scan $data 
4630: 49 63 20 6e 20 65 78 74 5f 74 79 70 65 0a 20 20  Ic n ext_type.  
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24    set n [expr {$
4660: 6e 20 26 20 30 78 46 46 46 46 46 46 46 46 7d 5d  n & 0xFFFFFFFF}]
4670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4680: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73       set data [s
4690: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74  tring range $dat
46a0: 61 20 35 20 65 6e 64 5d 0a 20 20 20 20 20 20 20  a 5 end].       
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20               my 
46c0: 24 6e 65 65 64 5f 70 72 6f 63 20 24 6e 0a 20 20  $need_proc $n.  
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64    binary scan $d
46f0: 61 74 61 20 61 24 6e 20 63 0a 20 20 20 20 20 20  ata a$n c.      
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
4710: 70 70 65 6e 64 20 6c 20 5b 6d 79 20 75 6e 70 61  ppend l [my unpa
4720: 63 6b 5f 65 78 74 20 24 65 78 74 5f 74 79 70 65  ck_ext $ext_type
4730: 20 24 63 5d 0a 20 20 20 20 20 20 20 20 20 20 20   $c].           
4740: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74           set dat
4750: 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  a [string range 
4760: 24 64 61 74 61 20 24 6e 20 65 6e 64 5d 0a 20 20  $data $n end].  
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4780: 20 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d 20   elseif {$tc == 
4790: 30 78 43 41 7d 20 7b 0a 20 20 20 20 20 20 20 20  0xCA} {.        
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 66 6c              # fl
47b0: 6f 61 74 33 32 0a 20 20 20 20 20 20 20 20 20 20  oat32.          
47c0: 20 20 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65            my $ne
47d0: 65 64 5f 70 72 6f 63 20 34 0a 20 20 20 20 20 20  ed_proc 4.      
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69                bi
47f0: 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74 61 20  nary scan $data 
4800: 52 20 63 0a 20 20 20 20 20 20 20 20 20 20 20 20  R c.            
4810: 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
4820: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
4830: 64 61 74 61 20 34 20 65 6e 64 5d 0a 20 20 20 20  data 4 end].    
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20  lappend l [list 
4860: 66 6c 6f 61 74 33 32 20 24 63 5d 0a 20 20 20 20  float32 $c].    
4870: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
4880: 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 43  seif {$tc == 0xC
4890: 42 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  B} {.           
48a0: 20 20 20 20 20 20 20 20 20 23 20 66 6c 6f 61 74           # float
48b0: 36 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  64.             
48c0: 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f         my $need_
48d0: 70 72 6f 63 20 38 0a 20 20 20 20 20 20 20 20 20  proc 8.         
48e0: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72             binar
48f0: 79 20 73 63 61 6e 20 24 64 61 74 61 20 51 20 63  y scan $data Q c
4900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4910: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73       set data [s
4920: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74  tring range $dat
4930: 61 20 38 20 65 6e 64 5d 0a 20 20 20 20 20 20 20  a 8 end].       
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
4950: 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 66 6c 6f  pend l [list flo
4960: 61 74 36 34 20 24 63 5d 0a 20 20 20 20 20 20 20  at64 $c].       
4970: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
4980: 66 20 7b 24 74 63 20 3d 3d 20 30 78 43 43 7d 20  f {$tc == 0xCC} 
4990: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
49a0: 20 20 20 20 20 20 23 20 75 69 6e 74 38 0a 20 20        # uint8.  
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49c0: 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20    my $need_proc 
49d0: 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1.              
49e0: 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 61        binary sca
49f0: 6e 20 24 64 61 74 61 20 63 20 63 0a 20 20 20 20  n $data c c.    
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67  set data [string
4a20: 20 72 61 6e 67 65 20 24 64 61 74 61 20 31 20 65   range $data 1 e
4a30: 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  nd].            
4a40: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
4a50: 6c 20 5b 6c 69 73 74 20 69 6e 74 65 67 65 72 20  l [list integer 
4a60: 5b 65 78 70 72 20 7b 24 63 20 26 20 30 78 46 46  [expr {$c & 0xFF
4a70: 7d 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  }]].            
4a80: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74      } elseif {$t
4a90: 63 20 3d 3d 20 30 78 43 44 7d 20 7b 0a 20 20 20  c == 0xCD} {.   
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 23 20 75 69 6e 74 31 36 0a 20 20 20 20 20 20   # uint16.      
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79                my
4ad0: 20 24 6e 65 65 64 5f 70 72 6f 63 20 32 0a 20 20   $need_proc 2.  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64    binary scan $d
4b00: 61 74 61 20 53 20 63 0a 20 20 20 20 20 20 20 20  ata S c.        
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
4b20: 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e  data [string ran
4b30: 67 65 20 24 64 61 74 61 20 32 20 65 6e 64 5d 0a  ge $data 2 end].
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c      lappend l [l
4b60: 69 73 74 20 69 6e 74 65 67 65 72 20 5b 65 78 70  ist integer [exp
4b70: 72 20 7b 24 63 20 26 20 30 78 46 46 46 46 7d 5d  r {$c & 0xFFFF}]
4b80: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
4b90: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 20    } elseif {$tc 
4ba0: 3d 3d 20 30 78 43 45 7d 20 7b 0a 20 20 20 20 20  == 0xCE} {.     
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
4bc0: 20 75 69 6e 74 33 32 0a 20 20 20 20 20 20 20 20   uint32.        
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24              my $
4be0: 6e 65 65 64 5f 70 72 6f 63 20 34 0a 20 20 20 20  need_proc 4.    
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74  binary scan $dat
4c10: 61 20 49 20 63 0a 20 20 20 20 20 20 20 20 20 20  a I c.          
4c20: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61            set da
4c30: 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  ta [string range
4c40: 20 24 64 61 74 61 20 34 20 65 6e 64 5d 0a 20 20   $data 4 end].  
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c60: 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73    lappend l [lis
4c70: 74 20 69 6e 74 65 67 65 72 20 5b 65 78 70 72 20  t integer [expr 
4c80: 7b 24 63 20 26 20 30 78 46 46 46 46 46 46 46 46  {$c & 0xFFFFFFFF
4c90: 7d 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  }]].            
4ca0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74      } elseif {$t
4cb0: 63 20 3d 3d 20 30 78 43 46 7d 20 7b 0a 20 20 20  c == 0xCF} {.   
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 23 20 75 69 6e 74 36 34 0a 20 20 20 20 20 20   # uint64.      
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79                my
4cf0: 20 24 6e 65 65 64 5f 70 72 6f 63 20 38 0a 20 20   $need_proc 8.  
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64    binary scan $d
4d20: 61 74 61 20 57 20 63 0a 20 20 20 20 20 20 20 20  ata W c.        
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
4d40: 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e  data [string ran
4d50: 67 65 20 24 64 61 74 61 20 38 20 65 6e 64 5d 0a  ge $data 8 end].
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c      lappend l [l
4d80: 69 73 74 20 69 6e 74 65 67 65 72 20 5b 65 78 70  ist integer [exp
4d90: 72 20 7b 24 63 20 26 20 30 78 46 46 46 46 46 46  r {$c & 0xFFFFFF
4da0: 46 46 46 46 46 46 46 46 46 46 7d 5d 5d 0a 20 20  FFFFFFFFFF}]].  
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
4dc0: 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 30  elseif {$tc == 0
4dd0: 78 44 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  xD0} {.         
4de0: 20 20 20 20 20 20 20 20 20 20 20 23 20 69 6e 74             # int
4df0: 38 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8.              
4e00: 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70        my $need_p
4e10: 72 6f 63 20 31 0a 20 20 20 20 20 20 20 20 20 20  roc 1.          
4e20: 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 79            binary
4e30: 20 73 63 61 6e 20 24 64 61 74 61 20 63 20 63 0a   scan $data c c.
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e50: 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 74      set data [st
4e60: 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61  ring range $data
4e70: 20 31 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20   1 end].        
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
4e90: 65 6e 64 20 6c 20 5b 6c 69 73 74 20 69 6e 74 65  end l [list inte
4ea0: 67 65 72 20 24 63 5d 0a 20 20 20 20 20 20 20 20  ger $c].        
4eb0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
4ec0: 20 7b 24 74 63 20 3d 3d 20 30 78 44 31 7d 20 7b   {$tc == 0xD1} {
4ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4ee0: 20 20 20 20 20 23 20 69 6e 74 31 36 0a 20 20 20       # int16.   
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 32   my $need_proc 2
4f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f20: 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e       binary scan
4f30: 20 24 64 61 74 61 20 53 20 63 0a 20 20 20 20 20   $data S c.     
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4f50: 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67 20  et data [string 
4f60: 72 61 6e 67 65 20 24 64 61 74 61 20 32 20 65 6e  range $data 2 en
4f70: 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d].             
4f80: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c         lappend l
4f90: 20 5b 6c 69 73 74 20 69 6e 74 65 67 65 72 20 24   [list integer $
4fa0: 63 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c].             
4fb0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 63     } elseif {$tc
4fc0: 20 3d 3d 20 30 78 44 32 7d 20 7b 0a 20 20 20 20   == 0xD2} {.    
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 23 20 69 6e 74 33 32 0a 20 20 20 20 20 20 20 20  # int32.        
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24              my $
5000: 6e 65 65 64 5f 70 72 6f 63 20 34 0a 20 20 20 20  need_proc 4.    
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74  binary scan $dat
5030: 61 20 49 20 63 0a 20 20 20 20 20 20 20 20 20 20  a I c.          
5040: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61            set da
5050: 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  ta [string range
5060: 20 24 64 61 74 61 20 34 20 65 6e 64 5d 0a 20 20   $data 4 end].  
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73    lappend l [lis
5090: 74 20 69 6e 74 65 67 65 72 20 24 63 5d 0a 20 20  t integer $c].  
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
50b0: 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 30  elseif {$tc == 0
50c0: 78 44 33 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  xD3} {.         
50d0: 20 20 20 20 20 20 20 20 20 20 20 23 20 69 6e 74             # int
50e0: 36 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  64.             
50f0: 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f         my $need_
5100: 70 72 6f 63 20 38 0a 20 20 20 20 20 20 20 20 20  proc 8.         
5110: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72             binar
5120: 79 20 73 63 61 6e 20 24 64 61 74 61 20 57 20 63  y scan $data W c
5130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5140: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73       set data [s
5150: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74  tring range $dat
5160: 61 20 38 20 65 6e 64 5d 0a 20 20 20 20 20 20 20  a 8 end].       
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
5180: 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 69 6e 74  pend l [list int
5190: 65 67 65 72 20 24 63 5d 0a 20 20 20 20 20 20 20  eger $c].       
51a0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
51b0: 66 20 7b 24 74 63 20 3d 3d 20 30 78 44 34 7d 20  f {$tc == 0xD4} 
51c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
51d0: 20 20 20 20 20 20 23 20 66 69 78 65 78 74 20 31        # fixext 1
51e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
51f0: 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72       my $need_pr
5200: 6f 63 20 32 0a 20 20 20 20 20 20 20 20 20 20 20  oc 2.           
5210: 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20           binary 
5220: 73 63 61 6e 20 24 64 61 74 61 20 63 61 31 20 65  scan $data ca1 e
5230: 78 74 5f 74 79 70 65 20 63 0a 20 20 20 20 20 20  xt_type c.      
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
5250: 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72  t data [string r
5260: 61 6e 67 65 20 24 64 61 74 61 20 32 20 65 6e 64  ange $data 2 end
5270: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
5280: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20        lappend l 
5290: 5b 6c 69 73 74 20 65 78 74 20 24 65 78 74 5f 74  [list ext $ext_t
52a0: 79 70 65 20 24 63 5d 0a 20 20 20 20 20 20 20 20  ype $c].        
52b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
52c0: 20 7b 24 74 63 20 3d 3d 20 30 78 44 35 7d 20 7b   {$tc == 0xD5} {
52d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
52e0: 20 20 20 20 20 23 20 66 69 78 65 78 74 20 32 0a       # fixext 2.
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5300: 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f      my $need_pro
5310: 63 20 33 0a 20 20 20 20 20 20 20 20 20 20 20 20  c 3.            
5320: 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 73          binary s
5330: 63 61 6e 20 24 64 61 74 61 20 63 61 32 20 65 78  can $data ca2 ex
5340: 74 5f 74 79 70 65 20 63 0a 20 20 20 20 20 20 20  t_type c.       
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
5360: 20 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61   data [string ra
5370: 6e 67 65 20 24 64 61 74 61 20 33 20 65 6e 64 5d  nge $data 3 end]
5380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5390: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b       lappend l [
53a0: 6d 79 20 75 6e 70 61 63 6b 5f 65 78 74 20 24 65  my unpack_ext $e
53b0: 78 74 5f 74 79 70 65 20 24 63 5d 0a 20 20 20 20  xt_type $c].    
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
53d0: 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 44  seif {$tc == 0xD
53e0: 36 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  6} {.           
53f0: 20 20 20 20 20 20 20 20 20 23 20 66 69 78 65 78           # fixex
5400: 74 20 34 0a 20 20 20 20 20 20 20 20 20 20 20 20  t 4.            
5410: 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64          my $need
5420: 5f 70 72 6f 63 20 35 0a 20 20 20 20 20 20 20 20  _proc 5.        
5430: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61              bina
5440: 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 63 61  ry scan $data ca
5450: 34 20 65 78 74 5f 74 79 70 65 20 63 0a 20 20 20  4 ext_type c.   
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e   set data [strin
5480: 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 35 20  g range $data 5 
5490: 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20  end].           
54a0: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
54b0: 20 6c 20 5b 6d 79 20 75 6e 70 61 63 6b 5f 65 78   l [my unpack_ex
54c0: 74 20 24 65 78 74 5f 74 79 70 65 20 24 63 5d 0a  t $ext_type $c].
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54e0: 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d  } elseif {$tc ==
54f0: 20 30 78 44 37 7d 20 7b 0a 20 20 20 20 20 20 20   0xD7} {.       
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 66               # f
5510: 69 78 65 78 74 20 38 0a 20 20 20 20 20 20 20 20  ixext 8.        
5520: 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24              my $
5530: 6e 65 65 64 5f 70 72 6f 63 20 39 0a 20 20 20 20  need_proc 9.    
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74  binary scan $dat
5560: 61 20 63 61 38 20 65 78 74 5f 74 79 70 65 20 63  a ca8 ext_type c
5570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5580: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73       set data [s
5590: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74  tring range $dat
55a0: 61 20 39 20 65 6e 64 5d 0a 20 20 20 20 20 20 20  a 9 end].       
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
55c0: 70 65 6e 64 20 6c 20 5b 6d 79 20 75 6e 70 61 63  pend l [my unpac
55d0: 6b 5f 65 78 74 20 24 65 78 74 5f 74 79 70 65 20  k_ext $ext_type 
55e0: 24 63 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  $c].            
55f0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74      } elseif {$t
5600: 63 20 3d 3d 20 30 78 44 38 7d 20 7b 0a 20 20 20  c == 0xD8} {.   
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 23 20 66 69 78 65 78 74 20 31 36 0a 20 20 20   # fixext 16.   
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 31   my $need_proc 1
5650: 37 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7.              
5660: 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 61        binary sca
5670: 6e 20 24 64 61 74 61 20 63 61 31 36 20 65 78 74  n $data ca16 ext
5680: 5f 74 79 70 65 20 63 0a 20 20 20 20 20 20 20 20  _type c.        
5690: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
56a0: 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e  data [string ran
56b0: 67 65 20 24 64 61 74 61 20 31 37 20 65 6e 64 5d  ge $data 17 end]
56c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
56d0: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b       lappend l [
56e0: 6d 79 20 75 6e 70 61 63 6b 5f 65 78 74 20 24 65  my unpack_ext $e
56f0: 78 74 5f 74 79 70 65 20 24 63 5d 0a 20 20 20 20  xt_type $c].    
5700: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
5710: 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 44  seif {$tc == 0xD
5720: 39 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  9} {.           
5730: 20 20 20 20 20 20 20 20 20 23 20 73 74 72 69 6e           # strin
5740: 67 20 38 0a 20 20 20 20 20 20 20 20 20 20 20 20  g 8.            
5750: 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64          my $need
5760: 5f 70 72 6f 63 20 31 0a 20 20 20 20 20 20 20 20  _proc 1.        
5770: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61              bina
5780: 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 63 20  ry scan $data c 
5790: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
57a0: 20 20 20 20 20 20 73 65 74 20 6e 20 5b 65 78 70        set n [exp
57b0: 72 20 7b 24 6e 20 26 20 30 78 46 46 7d 5d 0a 20  r {$n & 0xFF}]. 
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 74 72     set data [str
57e0: 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 20  ing range $data 
57f0: 31 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20  1 end].         
5800: 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24 6e             my $n
5810: 65 65 64 5f 70 72 6f 63 20 24 6e 0a 20 20 20 20  eed_proc $n.    
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74  binary scan $dat
5840: 61 20 61 24 6e 20 63 0a 20 20 20 20 20 20 20 20  a a$n c.        
5850: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
5860: 65 6e 64 20 6c 20 5b 6c 69 73 74 20 73 74 72 20  end l [list str 
5870: 5b 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72  [encoding conver
5880: 74 66 72 6f 6d 20 75 74 66 2d 38 20 24 63 5d 5d  tfrom utf-8 $c]]
5890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
58a0: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73       set data [s
58b0: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74  tring range $dat
58c0: 61 20 24 6e 20 65 6e 64 5d 0a 20 20 20 20 20 20  a $n end].      
58d0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
58e0: 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 44 41 7d  if {$tc == 0xDA}
58f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
5900: 20 20 20 20 20 20 20 23 20 73 74 72 69 6e 67 20         # string 
5910: 31 36 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  16.             
5920: 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f         my $need_
5930: 70 72 6f 63 20 32 0a 20 20 20 20 20 20 20 20 20  proc 2.         
5940: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72             binar
5950: 79 20 73 63 61 6e 20 24 64 61 74 61 20 53 20 6e  y scan $data S n
5960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5970: 20 20 20 20 20 73 65 74 20 6e 20 5b 65 78 70 72       set n [expr
5980: 20 7b 24 6e 20 26 20 30 78 46 46 46 46 7d 5d 0a   {$n & 0xFFFF}].
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 74      set data [st
59b0: 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61  ring range $data
59c0: 20 32 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20   2 end].        
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24              my $
59e0: 6e 65 65 64 5f 70 72 6f 63 20 24 6e 0a 20 20 20  need_proc $n.   
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61   binary scan $da
5a10: 74 61 20 61 24 6e 20 63 0a 20 20 20 20 20 20 20  ta a$n c.       
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
5a30: 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 73 74 72  pend l [list str
5a40: 20 5b 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65   [encoding conve
5a50: 72 74 66 72 6f 6d 20 75 74 66 2d 38 20 24 63 5d  rtfrom utf-8 $c]
5a60: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
5a70: 20 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b        set data [
5a80: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61  string range $da
5a90: 74 61 20 24 6e 20 65 6e 64 5d 0a 20 20 20 20 20  ta $n end].     
5aa0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
5ab0: 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 44 42  eif {$tc == 0xDB
5ac0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
5ad0: 20 20 20 20 20 20 20 20 23 20 73 74 72 69 6e 67          # string
5ae0: 20 33 32 0a 20 20 20 20 20 20 20 20 20 20 20 20   32.            
5af0: 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64          my $need
5b00: 5f 70 72 6f 63 20 34 0a 20 20 20 20 20 20 20 20  _proc 4.        
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61              bina
5b20: 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 49 20  ry scan $data I 
5b30: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
5b40: 20 20 20 20 20 20 73 65 74 20 6e 20 5b 65 78 70        set n [exp
5b50: 72 20 7b 24 6e 20 26 20 30 78 46 46 46 46 46 46  r {$n & 0xFFFFFF
5b60: 46 46 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20  FF}].           
5b70: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74           set dat
5b80: 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  a [string range 
5b90: 24 64 61 74 61 20 34 20 65 6e 64 5d 0a 20 20 20  $data 4 end].   
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bb0: 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 24   my $need_proc $
5bc0: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
5bd0: 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 61        binary sca
5be0: 6e 20 24 64 61 74 61 20 61 24 6e 20 63 0a 20 20  n $data a$n c.  
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c00: 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73    lappend l [lis
5c10: 74 20 73 74 72 20 5b 65 6e 63 6f 64 69 6e 67 20  t str [encoding 
5c20: 63 6f 6e 76 65 72 74 66 72 6f 6d 20 75 74 66 2d  convertfrom utf-
5c30: 38 20 24 63 5d 5d 0a 20 20 20 20 20 20 20 20 20  8 $c]].         
5c40: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
5c50: 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  ata [string rang
5c60: 65 20 24 64 61 74 61 20 24 6e 20 65 6e 64 5d 0a  e $data $n end].
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d  } elseif {$tc ==
5c90: 20 30 78 44 43 7d 20 7b 0a 20 20 20 20 20 20 20   0xDC} {.       
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 61               # a
5cb0: 72 72 61 79 20 31 36 0a 20 20 20 20 20 20 20 20  rray 16.        
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24              my $
5cd0: 6e 65 65 64 5f 70 72 6f 63 20 32 0a 20 20 20 20  need_proc 2.    
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74  binary scan $dat
5d00: 61 20 53 20 6e 0a 20 20 20 20 20 20 20 20 20 20  a S n.          
5d10: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 20            set n 
5d20: 5b 65 78 70 72 20 7b 24 6e 20 26 20 30 78 46 46  [expr {$n & 0xFF
5d30: 46 46 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20  FF}].           
5d40: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74           set dat
5d50: 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  a [string range 
5d60: 24 64 61 74 61 20 32 20 65 6e 64 5d 0a 20 20 20  $data 2 end].   
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 73 65 74 20 61 20 7b 7d 0a 20 20 20 20 20 20   set a {}.      
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
5da0: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20  r {set i 0} {$i 
5db0: 3c 20 24 6e 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  < $n} {incr i} {
5dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5dd0: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
5de0: 20 61 20 7b 2a 7d 5b 6d 79 20 75 6e 70 61 63 6b   a {*}[my unpack
5df0: 5f 63 6f 72 6f 20 31 20 24 63 6f 72 6f 5d 0a 20  _coro 1 $coro]. 
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
5e20: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
5e30: 20 6c 20 5b 6c 69 73 74 20 61 72 72 61 79 20 24   l [list array $
5e40: 61 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a].             
5e50: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 63     } elseif {$tc
5e60: 20 3d 3d 20 30 78 44 44 7d 20 7b 0a 20 20 20 20   == 0xDD} {.    
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 23 20 61 72 72 61 79 20 33 32 0a 20 20 20 20 20  # array 32.     
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
5ea0: 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 34 0a 20  y $need_proc 4. 
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24     binary scan $
5ed0: 64 61 74 61 20 49 20 6e 0a 20 20 20 20 20 20 20  data I n.       
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
5ef0: 20 6e 20 5b 65 78 70 72 20 7b 24 6e 20 26 20 30   n [expr {$n & 0
5f00: 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20 20 20  xFFFFFFFF}].    
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67  set data [string
5f30: 20 72 61 6e 67 65 20 24 64 61 74 61 20 34 20 65   range $data 4 e
5f40: 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  nd].            
5f50: 20 20 20 20 20 20 20 20 73 65 74 20 61 20 7b 7d          set a {}
5f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5f70: 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20       for {set i 
5f80: 30 7d 20 7b 24 69 20 3c 20 24 6e 7d 20 7b 69 6e  0} {$i < $n} {in
5f90: 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 20 20  cr i} {.        
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fb0: 6c 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b 6d 79  lappend a {*}[my
5fc0: 20 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31 20 24   unpack_coro 1 $
5fd0: 63 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20 20 20  coro].          
5fe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6000: 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20  lappend l [list 
6010: 61 72 72 61 79 20 24 61 5d 0a 20 20 20 20 20 20  array $a].      
6020: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
6030: 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 44 45 7d  if {$tc == 0xDE}
6040: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
6050: 20 20 20 20 20 20 20 23 20 6d 61 70 20 31 36 0a         # map 16.
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f      my $need_pro
6080: 63 20 32 0a 20 20 20 20 20 20 20 20 20 20 20 20  c 2.            
6090: 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 73          binary s
60a0: 63 61 6e 20 24 64 61 74 61 20 53 20 6e 0a 20 20  can $data S n.  
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24    set n [expr {$
60d0: 6e 20 26 20 30 78 46 46 46 46 7d 5d 0a 20 20 20  n & 0xFFFF}].   
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e   set data [strin
6100: 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 32 20  g range $data 2 
6110: 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20  end].           
6120: 20 20 20 20 20 20 20 20 20 73 65 74 20 61 20 7b           set a {
6130: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
6140: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
6150: 20 30 7d 20 7b 24 69 20 3c 20 24 6e 7d 20 7b 69   0} {$i < $n} {i
6160: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 20  ncr i} {.       
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 6c 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b 6d   lappend a {*}[m
6190: 79 20 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31 20  y unpack_coro 1 
61a0: 24 63 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20 20  $coro].         
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
61c0: 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b 6d 79 20  append a {*}[my 
61d0: 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31 20 24 63  unpack_coro 1 $c
61e0: 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20 20 20 20  oro].           
61f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
6210: 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 6d  append l [list m
6220: 61 70 20 24 61 5d 0a 20 20 20 20 20 20 20 20 20  ap $a].         
6230: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
6240: 7b 24 74 63 20 3d 3d 20 30 78 44 46 7d 20 7b 0a  {$tc == 0xDF} {.
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6260: 20 20 20 20 23 20 6d 61 70 20 33 32 0a 20 20 20      # map 32.   
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6280: 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 34   my $need_proc 4
6290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
62a0: 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e       binary scan
62b0: 20 24 64 61 74 61 20 49 20 6e 0a 20 20 20 20 20   $data I n.     
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
62d0: 65 74 20 6e 20 5b 65 78 70 72 20 7b 24 6e 20 26  et n [expr {$n &
62e0: 20 30 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20   0xFFFFFFFF}].  
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6300: 20 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 69    set data [stri
6310: 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 34  ng range $data 4
6320: 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20   end].          
6330: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 20            set a 
6340: 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {}.             
6350: 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20         for {set 
6360: 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 7d 20 7b  i 0} {$i < $n} {
6370: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20  incr i} {.      
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 20 20 6c 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b    lappend a {*}[
63a0: 6d 79 20 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31  my unpack_coro 1
63b0: 20 24 63 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20   $coro].        
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 6c 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b 6d 79  lappend a {*}[my
63e0: 20 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31 20 24   unpack_coro 1 $
63f0: 63 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20 20 20  coro].          
6400: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6420: 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20  lappend l [list 
6430: 6d 61 70 20 24 61 5d 0a 20 20 20 20 20 20 20 20  map $a].        
6440: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
6450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6460: 20 20 20 20 20 65 72 72 6f 72 20 5b 6c 69 73 74       error [list
6470: 20 75 6e 6b 6e 6f 77 6e 20 74 79 70 65 3a 20 24   unknown type: $
6480: 74 63 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  tc].            
6490: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
64a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
64b0: 69 66 20 7b 24 6e 65 73 74 65 64 7d 20 7b 0a 20  if {$nested} {. 
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
64d0: 65 74 75 72 6e 20 24 6c 0a 20 20 20 20 20 20 20  eturn $l.       
64e0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6500: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 63 61 6c 6c   {[llength $call
6510: 62 61 63 6b 5d 7d 20 7b 0a 20 20 20 20 20 20 20  back]} {.       
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
6530: 65 61 63 68 20 69 20 24 6c 20 7b 0a 20 20 20 20  each i $l {.    
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 7b 2a 7d 24 63 61 6c 6c 62 61 63 6b      {*}$callback
6560: 20 64 61 74 61 20 24 69 0a 20 20 20 20 20 20 20   data $i.       
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 20 20 20 73 65 74 20 6c 20 7b 7d 0a 20 20 20 20     set l {}.    
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
65c0: 20 7b 21 24 63 6f 72 6f 7d 20 7b 0a 20 20 20 20   {!$coro} {.    
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
65f0: 74 68 20 24 64 61 74 61 5d 20 3d 3d 20 30 7d 20  th $data] == 0} 
6600: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6610: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6620: 20 24 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20   $l.            
6630: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6640: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6650: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6660: 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 6e 61 6d    }.    }.}..nam
6670: 65 73 70 61 63 65 20 65 76 61 6c 20 6d 73 67 70  espace eval msgp
6680: 61 63 6b 20 7b 0a 0a 20 20 20 20 70 72 6f 63 20  ack {..    proc 
6690: 70 61 63 6b 20 7b 74 79 70 65 20 7b 76 61 6c 75  pack {type {valu
66a0: 65 20 30 7d 20 7b 76 61 6c 75 65 31 20 22 22 7d  e 0} {value1 ""}
66b0: 20 7b 76 61 6c 75 65 32 20 22 22 7d 7d 20 7b 0a   {value2 ""}} {.
66c0: 20 20 20 20 20 20 20 20 73 65 74 20 6f 20 5b 6d          set o [m
66d0: 73 67 70 61 63 6b 3a 3a 70 61 63 6b 65 72 20 6e  sgpack::packer n
66e0: 65 77 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ew].        if {
66f0: 24 74 79 70 65 20 65 71 20 22 74 63 6c 5f 61 72  $type eq "tcl_ar
6700: 72 61 79 22 7d 20 7b 0a 20 20 20 20 20 20 20 20  ray"} {.        
6710: 20 20 20 20 75 70 76 61 72 20 24 76 61 6c 75 65      upvar $value
6720: 32 20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  2 a.            
6730: 24 6f 20 70 61 63 6b 20 24 74 79 70 65 20 24 76  $o pack $type $v
6740: 61 6c 75 65 20 24 76 61 6c 75 65 31 20 61 0a 20  alue $value1 a. 
6750: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
6760: 20 20 20 20 20 20 20 20 20 20 20 20 24 6f 20 70              $o p
6770: 61 63 6b 20 24 74 79 70 65 20 24 76 61 6c 75 65  ack $type $value
6780: 20 24 76 61 6c 75 65 31 20 24 76 61 6c 75 65 32   $value1 $value2
6790: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
67a0: 20 20 20 73 65 74 20 73 20 5b 24 6f 20 64 61 74     set s [$o dat
67b0: 61 5d 0a 20 20 20 20 20 20 20 20 24 6f 20 64 65  a].        $o de
67c0: 73 74 72 6f 79 0a 20 20 20 20 20 20 20 20 72 65  stroy.        re
67d0: 74 75 72 6e 20 24 73 0a 20 20 20 20 7d 0a 0a 20  turn $s.    }.. 
67e0: 20 20 20 70 72 6f 63 20 75 6e 70 61 63 6b 20 7b     proc unpack {
67f0: 73 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74  s} {.        set
6800: 20 6f 20 5b 6d 73 67 70 61 63 6b 3a 3a 75 6e 70   o [msgpack::unp
6810: 61 63 6b 65 72 20 6e 65 77 5d 0a 20 20 20 20 20  acker new].     
6820: 20 20 20 73 65 74 20 6c 20 5b 24 6f 20 75 6e 70     set l [$o unp
6830: 61 63 6b 5f 73 74 72 69 6e 67 20 24 73 5d 0a 20  ack_string $s]. 
6840: 20 20 20 20 20 20 20 24 6f 20 64 65 73 74 72 6f         $o destro
6850: 79 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  y.        return
6860: 20 24 6c 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   $l.    }..    p
6870: 72 6f 63 20 6d 61 70 32 64 69 63 74 20 7b 6d 7d  roc map2dict {m}
6880: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 64   {.        set d
6890: 20 5b 64 69 63 74 20 63 72 65 61 74 65 5d 0a 20   [dict create]. 
68a0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b         foreach {
68b0: 6b 69 20 76 69 7d 20 24 6d 20 7b 0a 20 20 20 20  ki vi} $m {.    
68c0: 20 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20          lassign 
68d0: 24 6b 69 20 6b 74 20 6b 76 0a 20 20 20 20 20 20  $ki kt kv.      
68e0: 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20 24 76        lassign $v
68f0: 69 20 76 74 20 76 76 0a 20 20 20 20 20 20 20 20  i vt vv.        
6900: 20 20 20 20 64 69 63 74 20 73 65 74 20 64 20 24      dict set d $
6910: 6b 76 20 24 76 76 0a 20 20 20 20 20 20 20 20 7d  kv $vv.        }
6920: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6930: 24 64 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  $d.    }..    pr
6940: 6f 63 20 6d 61 70 32 61 72 72 61 79 20 7b 6d 20  oc map2array {m 
6950: 61 6e 6d 7d 20 7b 0a 20 20 20 20 20 20 20 20 75  anm} {.        u
6960: 70 76 61 72 20 24 61 6e 6d 20 61 0a 20 20 20 20  pvar $anm a.    
6970: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 6b 69 20      foreach {ki 
6980: 76 69 7d 20 24 6d 20 7b 0a 20 20 20 20 20 20 20  vi} $m {.       
6990: 20 20 20 20 20 6c 61 73 73 69 67 6e 20 24 6b 69       lassign $ki
69a0: 20 6b 74 20 6b 76 0a 20 20 20 20 20 20 20 20 20   kt kv.         
69b0: 20 20 20 6c 61 73 73 69 67 6e 20 24 76 69 20 76     lassign $vi v
69c0: 74 20 76 76 0a 20 20 20 20 20 20 20 20 20 20 20  t vv.           
69d0: 20 73 65 74 20 61 28 24 6b 76 29 20 24 76 76 0a   set a($kv) $vv.
69e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
69f0: 0a 20 20 20 20 70 72 6f 63 20 61 72 72 61 79 32  .    proc array2
6a00: 6c 69 73 74 20 7b 61 7d 20 7b 0a 20 20 20 20 20  list {a} {.     
6a10: 20 20 20 73 65 74 20 6c 20 5b 6c 69 73 74 5d 0a     set l [list].
6a20: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
6a30: 69 20 24 61 20 7b 0a 20 20 20 20 20 20 20 20 20  i $a {.         
6a40: 20 20 20 6c 61 73 73 69 67 6e 20 24 69 20 74 20     lassign $i t 
6a50: 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  v.            la
6a60: 70 70 65 6e 64 20 6c 20 24 76 0a 20 20 20 20 20  ppend l $v.     
6a70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
6a80: 75 72 6e 20 24 6c 0a 20 20 20 20 7d 0a 0a 20 20  urn $l.    }..  
6a90: 20 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f    namespace expo
6aa0: 72 74 20 2a 0a 20 20 20 20 6e 61 6d 65 73 70 61  rt *.    namespa
6ab0: 63 65 20 65 6e 73 65 6d 62 6c 65 20 63 72 65 61  ce ensemble crea
6ac0: 74 65 0a 7d 0a                                   te.}.