Merge pull request #5850 from xiang90/get_o_kv

*: support get-old-kv in watch
This commit is contained in:
Xiang Li 2016-07-05 16:37:24 -07:00 committed by GitHub
commit 929d6ab62c
12 changed files with 383 additions and 231 deletions

View File

@ -674,7 +674,7 @@
"preserveKVs": { "preserveKVs": {
"type": "boolean", "type": "boolean",
"format": "boolean", "format": "boolean",
"description": "If preserveKVs is set, the deleted KVs will be preserved.\nThe preserved KVs will be returned as response.\nIt requires read permission to read the deleted KVs." "description": "If preserveKVs is set, the deleted KVs will be preserved for delete events\nThe preserved KVs will be returned as response.\nIt requires read permission to read the deleted KVs."
}, },
"range_end": { "range_end": {
"type": "string", "type": "string",
@ -1204,6 +1204,11 @@
"format": "byte", "format": "byte",
"description": "key is the key to register for watching." "description": "key is the key to register for watching."
}, },
"prev_kv": {
"type": "boolean",
"format": "boolean",
"description": "If prev_kv is set, created watcher gets the previous KV before the event happens.\nIf the previous KV is already compacted, nothing will be returned."
},
"progress_notify": { "progress_notify": {
"type": "boolean", "type": "boolean",
"format": "boolean", "format": "boolean",
@ -1273,6 +1278,10 @@
"$ref": "#/definitions/mvccpbKeyValue", "$ref": "#/definitions/mvccpbKeyValue",
"description": "kv holds the KeyValue for the event.\nA PUT event contains current kv pair.\nA PUT event with kv.Version=1 indicates the creation of a key.\nA DELETE/EXPIRE event contains the deleted key with\nits modification revision set to the revision of deletion." "description": "kv holds the KeyValue for the event.\nA PUT event contains current kv pair.\nA PUT event with kv.Version=1 indicates the creation of a key.\nA DELETE/EXPIRE event contains the deleted key with\nits modification revision set to the revision of deletion."
}, },
"prev_kv": {
"$ref": "#/definitions/mvccpbKeyValue",
"description": "prev_kv holds the key-value pair before the event happens."
},
"type": { "type": {
"$ref": "#/definitions/EventEventType", "$ref": "#/definitions/EventEventType",
"description": "type is the kind of event. If type is a PUT, it indicates\nnew data has been stored to the key. If type is a DELETE,\nit indicates the key was deleted." "description": "type is the kind of event. If type is a PUT, it indicates\nnew data has been stored to the key. If type is a DELETE,\nit indicates the key was deleted."

View File

@ -45,6 +45,8 @@ type Op struct {
// for range, watch // for range, watch
rev int64 rev int64
prevKV bool
// for delete // for delete
preserveKVs bool preserveKVs bool
@ -276,3 +278,11 @@ func WithProgressNotify() OpOption {
op.progressNotify = true op.progressNotify = true
} }
} }
// WithPrevKV gets the previous key-value pair before the event happens. If the previous KV is already compacted,
// nothing will be returned.
func WithPrevKV() OpOption {
return func(op *Op) {
op.prevKV = true
}
}

View File

@ -137,8 +137,10 @@ type watchRequest struct {
key string key string
end string end string
rev int64 rev int64
// progressNotify is for progress updates. // progressNotify is for progress updates
progressNotify bool progressNotify bool
// get the previous key-value pair before the event happens
prevKV bool
// retc receives a chan WatchResponse once the watcher is established // retc receives a chan WatchResponse once the watcher is established
retc chan chan WatchResponse retc chan chan WatchResponse
} }
@ -209,6 +211,7 @@ func (w *watcher) Watch(ctx context.Context, key string, opts ...OpOption) Watch
end: string(ow.end), end: string(ow.end),
rev: ow.rev, rev: ow.rev,
progressNotify: ow.progressNotify, progressNotify: ow.progressNotify,
prevKV: ow.prevKV,
retc: retc, retc: retc,
} }
@ -682,6 +685,7 @@ func (wr *watchRequest) toPB() *pb.WatchRequest {
Key: []byte(wr.key), Key: []byte(wr.key),
RangeEnd: []byte(wr.end), RangeEnd: []byte(wr.end),
ProgressNotify: wr.progressNotify, ProgressNotify: wr.progressNotify,
PrevKv: wr.prevKV,
} }
cr := &pb.WatchRequest_CreateRequest{CreateRequest: req} cr := &pb.WatchRequest_CreateRequest{CreateRequest: req}
return &pb.WatchRequest{RequestUnion: cr} return &pb.WatchRequest{RequestUnion: cr}

View File

@ -231,6 +231,8 @@ Watch watches events stream on keys or prefixes, [key or prefix, range_end) if `
- prefix -- watch on a prefix if prefix is set. - prefix -- watch on a prefix if prefix is set.
- prev-kv -- get the previous key-value pair before the event happens.
- rev -- the revision to start watching. Specifying a revision is useful for observing past events. - rev -- the revision to start watching. Specifying a revision is useful for observing past events.
#### Input Format #### Input Format
@ -245,7 +247,7 @@ watch [options] <key or prefix>\n
##### Simple reply ##### Simple reply
- \<event\>\n\<key\>\n\<value\>\n\<event\>\n\<next_key\>\n\<next_value\>\n... - \<event\>[\n\<old_key\>\n\<old_value\>]\n\<key\>\n\<value\>\n\<event\>\n\<next_key\>\n\<next_value\>\n...
- Additional error string if WATCH failed. Exit code is non-zero. - Additional error string if WATCH failed. Exit code is non-zero.

View File

@ -146,6 +146,9 @@ func (s *simplePrinter) Txn(resp v3.TxnResponse) {
func (s *simplePrinter) Watch(resp v3.WatchResponse) { func (s *simplePrinter) Watch(resp v3.WatchResponse) {
for _, e := range resp.Events { for _, e := range resp.Events {
fmt.Println(e.Type) fmt.Println(e.Type)
if e.PrevKv != nil {
printKV(s.isHex, e.PrevKv)
}
printKV(s.isHex, e.Kv) printKV(s.isHex, e.Kv)
} }
} }

View File

@ -29,6 +29,7 @@ var (
watchRev int64 watchRev int64
watchPrefix bool watchPrefix bool
watchInteractive bool watchInteractive bool
watchPrevKey bool
) )
// NewWatchCommand returns the cobra command for "watch". // NewWatchCommand returns the cobra command for "watch".
@ -42,6 +43,7 @@ func NewWatchCommand() *cobra.Command {
cmd.Flags().BoolVarP(&watchInteractive, "interactive", "i", false, "Interactive mode") cmd.Flags().BoolVarP(&watchInteractive, "interactive", "i", false, "Interactive mode")
cmd.Flags().BoolVar(&watchPrefix, "prefix", false, "Watch on a prefix if prefix is set") cmd.Flags().BoolVar(&watchPrefix, "prefix", false, "Watch on a prefix if prefix is set")
cmd.Flags().Int64Var(&watchRev, "rev", 0, "Revision to start watching") cmd.Flags().Int64Var(&watchRev, "rev", 0, "Revision to start watching")
cmd.Flags().BoolVar(&watchPrevKey, "prev-kv", false, "get the previous key-value pair before the event happens")
return cmd return cmd
} }
@ -68,6 +70,10 @@ func watchCommandFunc(cmd *cobra.Command, args []string) {
if watchPrefix { if watchPrefix {
opts = append(opts, clientv3.WithPrefix()) opts = append(opts, clientv3.WithPrefix())
} }
if watchPrevKey {
opts = append(opts, clientv3.WithPrevKV())
}
c := mustClientFromCmd(cmd) c := mustClientFromCmd(cmd)
wc := c.Watch(context.TODO(), key, opts...) wc := c.Watch(context.TODO(), key, opts...)
printWatchCh(wc) printWatchCh(wc)

View File

@ -32,7 +32,7 @@ type watchServer struct {
clusterID int64 clusterID int64
memberID int64 memberID int64
raftTimer etcdserver.RaftTimer raftTimer etcdserver.RaftTimer
watchable mvcc.Watchable watchable mvcc.WatchableKV
} }
func NewWatchServer(s *etcdserver.EtcdServer) pb.WatchServer { func NewWatchServer(s *etcdserver.EtcdServer) pb.WatchServer {
@ -82,13 +82,18 @@ type serverWatchStream struct {
memberID int64 memberID int64
raftTimer etcdserver.RaftTimer raftTimer etcdserver.RaftTimer
watchable mvcc.WatchableKV
gRPCStream pb.Watch_WatchServer gRPCStream pb.Watch_WatchServer
watchStream mvcc.WatchStream watchStream mvcc.WatchStream
ctrlStream chan *pb.WatchResponse ctrlStream chan *pb.WatchResponse
// progress tracks the watchID that stream might need to send // progress tracks the watchID that stream might need to send
// progress to. // progress to.
// TOOD: combine progress and prevKV into a single struct?
progress map[mvcc.WatchID]bool progress map[mvcc.WatchID]bool
prevKV map[mvcc.WatchID]bool
// mu protects progress // mu protects progress
mu sync.Mutex mu sync.Mutex
@ -101,14 +106,18 @@ type serverWatchStream struct {
func (ws *watchServer) Watch(stream pb.Watch_WatchServer) (err error) { func (ws *watchServer) Watch(stream pb.Watch_WatchServer) (err error) {
sws := serverWatchStream{ sws := serverWatchStream{
clusterID: ws.clusterID, clusterID: ws.clusterID,
memberID: ws.memberID, memberID: ws.memberID,
raftTimer: ws.raftTimer, raftTimer: ws.raftTimer,
watchable: ws.watchable,
gRPCStream: stream, gRPCStream: stream,
watchStream: ws.watchable.NewWatchStream(), watchStream: ws.watchable.NewWatchStream(),
// chan for sending control response like watcher created and canceled. // chan for sending control response like watcher created and canceled.
ctrlStream: make(chan *pb.WatchResponse, ctrlStreamBufLen), ctrlStream: make(chan *pb.WatchResponse, ctrlStreamBufLen),
progress: make(map[mvcc.WatchID]bool), progress: make(map[mvcc.WatchID]bool),
prevKV: make(map[mvcc.WatchID]bool),
closec: make(chan struct{}), closec: make(chan struct{}),
} }
@ -181,8 +190,13 @@ func (sws *serverWatchStream) recvLoop() error {
rev = wsrev + 1 rev = wsrev + 1
} }
id := sws.watchStream.Watch(creq.Key, creq.RangeEnd, rev, filters...) id := sws.watchStream.Watch(creq.Key, creq.RangeEnd, rev, filters...)
if id != -1 && creq.ProgressNotify { if id != -1 {
sws.progress[id] = true if creq.ProgressNotify {
sws.progress[id] = true
}
if creq.PrevKv {
sws.prevKV[id] = true
}
} }
wr := &pb.WatchResponse{ wr := &pb.WatchResponse{
Header: sws.newResponseHeader(wsrev), Header: sws.newResponseHeader(wsrev),
@ -207,6 +221,7 @@ func (sws *serverWatchStream) recvLoop() error {
} }
sws.mu.Lock() sws.mu.Lock()
delete(sws.progress, mvcc.WatchID(id)) delete(sws.progress, mvcc.WatchID(id))
delete(sws.prevKV, mvcc.WatchID(id))
sws.mu.Unlock() sws.mu.Unlock()
} }
} }
@ -253,8 +268,17 @@ func (sws *serverWatchStream) sendLoop() {
// or define protocol buffer with []mvccpb.Event. // or define protocol buffer with []mvccpb.Event.
evs := wresp.Events evs := wresp.Events
events := make([]*mvccpb.Event, len(evs)) events := make([]*mvccpb.Event, len(evs))
needPrevKV := sws.prevKV[wresp.WatchID]
for i := range evs { for i := range evs {
events[i] = &evs[i] events[i] = &evs[i]
if needPrevKV {
opt := mvcc.RangeOptions{Rev: evs[i].Kv.ModRevision - 1}
r, err := sws.watchable.Range(evs[i].Kv.Key, nil, opt)
if err == nil && len(r.KVs) != 0 {
events[i].PrevKv = &(r.KVs[0])
}
}
} }
wr := &pb.WatchResponse{ wr := &pb.WatchResponse{

View File

@ -326,7 +326,7 @@ type DeleteRangeRequest struct {
// If range_end is not given, the range is defined to contain only the key argument. // If range_end is not given, the range is defined to contain only the key argument.
// If range_end is '\0', the range is all keys greater than or equal to the key argument. // If range_end is '\0', the range is all keys greater than or equal to the key argument.
RangeEnd []byte `protobuf:"bytes,2,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"` RangeEnd []byte `protobuf:"bytes,2,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"`
// If preserveKVs is set, the deleted KVs will be preserved. // If preserveKVs is set, the deleted KVs will be preserved for delete events
// The preserved KVs will be returned as response. // The preserved KVs will be returned as response.
// It requires read permission to read the deleted KVs. // It requires read permission to read the deleted KVs.
PreserveKVs bool `protobuf:"varint,3,opt,name=preserveKVs,proto3" json:"preserveKVs,omitempty"` PreserveKVs bool `protobuf:"varint,3,opt,name=preserveKVs,proto3" json:"preserveKVs,omitempty"`
@ -1159,6 +1159,9 @@ type WatchCreateRequest struct {
ProgressNotify bool `protobuf:"varint,4,opt,name=progress_notify,json=progressNotify,proto3" json:"progress_notify,omitempty"` ProgressNotify bool `protobuf:"varint,4,opt,name=progress_notify,json=progressNotify,proto3" json:"progress_notify,omitempty"`
// filters filter the events at server side before it sends back to the watcher. // filters filter the events at server side before it sends back to the watcher.
Filters []WatchCreateRequest_FilterType `protobuf:"varint,5,rep,name=filters,enum=etcdserverpb.WatchCreateRequest_FilterType" json:"filters,omitempty"` Filters []WatchCreateRequest_FilterType `protobuf:"varint,5,rep,name=filters,enum=etcdserverpb.WatchCreateRequest_FilterType" json:"filters,omitempty"`
// If prev_kv is set, created watcher gets the previous KV before the event happens.
// If the previous KV is already compacted, nothing will be returned.
PrevKv bool `protobuf:"varint,6,opt,name=prev_kv,json=prevKv,proto3" json:"prev_kv,omitempty"`
} }
func (m *WatchCreateRequest) Reset() { *m = WatchCreateRequest{} } func (m *WatchCreateRequest) Reset() { *m = WatchCreateRequest{} }
@ -4503,6 +4506,16 @@ func (m *WatchCreateRequest) MarshalTo(data []byte) (int, error) {
i = encodeVarintRpc(data, i, uint64(num)) i = encodeVarintRpc(data, i, uint64(num))
} }
} }
if m.PrevKv {
data[i] = 0x30
i++
if m.PrevKv {
data[i] = 1
} else {
data[i] = 0
}
i++
}
return i, nil return i, nil
} }
@ -6669,6 +6682,9 @@ func (m *WatchCreateRequest) Size() (n int) {
n += 1 + sovRpc(uint64(e)) n += 1 + sovRpc(uint64(e))
} }
} }
if m.PrevKv {
n += 2
}
return n return n
} }
@ -9925,6 +9941,26 @@ func (m *WatchCreateRequest) Unmarshal(data []byte) error {
} }
} }
m.Filters = append(m.Filters, v) m.Filters = append(m.Filters, v)
case 6:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRpc
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := data[iNdEx]
iNdEx++
v |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
m.PrevKv = bool(v != 0)
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipRpc(data[iNdEx:]) skippy, err := skipRpc(data[iNdEx:])
@ -15280,205 +15316,206 @@ var (
) )
var fileDescriptorRpc = []byte{ var fileDescriptorRpc = []byte{
// 3189 bytes of a gzipped FileDescriptorProto // 3207 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x5a, 0xcd, 0x73, 0x23, 0x47, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x1a, 0x4d, 0x73, 0x23, 0x57,
0x15, 0xdf, 0x91, 0xfc, 0xa5, 0x27, 0x59, 0xeb, 0x6d, 0x7b, 0x37, 0xf6, 0xac, 0xd7, 0xeb, 0xed, 0x71, 0x47, 0xb2, 0x25, 0xab, 0x25, 0x6b, 0xbd, 0xcf, 0xde, 0x8d, 0x3c, 0xeb, 0xf5, 0x7a, 0xdf,
0xfd, 0xcc, 0x97, 0x45, 0x9c, 0xc0, 0x01, 0xa8, 0x54, 0xc9, 0x96, 0xb2, 0x31, 0x76, 0xec, 0xcd, 0x7e, 0xe6, 0xcb, 0x22, 0x4e, 0xe0, 0x00, 0x54, 0xaa, 0x64, 0x4b, 0xd9, 0x18, 0x3b, 0xf6, 0x66,
0x58, 0xeb, 0x84, 0x2a, 0x0a, 0xd7, 0x58, 0xea, 0xb5, 0x55, 0xd6, 0x57, 0x66, 0x46, 0xde, 0xf5, 0xac, 0x75, 0x42, 0x15, 0x85, 0x6b, 0x2c, 0xcd, 0xda, 0x2a, 0xeb, 0x2b, 0x33, 0x23, 0xed, 0x7a,
0x02, 0x55, 0x90, 0x22, 0x87, 0x70, 0xcd, 0x81, 0x02, 0x8e, 0xfc, 0x0d, 0xdc, 0xf8, 0x03, 0x28, 0x81, 0x2a, 0x2a, 0x45, 0x0e, 0xe1, 0x9a, 0x03, 0x45, 0x38, 0xf2, 0x1b, 0xb8, 0xf1, 0x03, 0x28,
0x2e, 0xa4, 0x8a, 0x23, 0x17, 0x8a, 0xe2, 0xc0, 0x81, 0x3b, 0xc5, 0x09, 0xfa, 0x73, 0xa6, 0x67, 0x2e, 0xa4, 0x8a, 0x23, 0x17, 0x8a, 0xe2, 0xc0, 0x81, 0x3b, 0xc5, 0x09, 0xde, 0xe7, 0xcc, 0x9b,
0xd4, 0x23, 0x3b, 0x0c, 0x39, 0x24, 0xab, 0x7e, 0xfd, 0xfa, 0xfd, 0x5e, 0xbf, 0xee, 0xf7, 0xfa, 0xd1, 0x1b, 0xd9, 0x61, 0xc8, 0x61, 0xd7, 0xf3, 0xfa, 0xf5, 0xeb, 0xee, 0xd7, 0xaf, 0xbb, 0x5f,
0xbd, 0x37, 0x86, 0x82, 0x37, 0x68, 0xae, 0x0d, 0xbc, 0x7e, 0xd0, 0x47, 0x25, 0x12, 0x34, 0x5b, 0x77, 0x3f, 0x41, 0xc1, 0x1d, 0xb6, 0xd6, 0x87, 0xee, 0xc0, 0x1f, 0xa0, 0x92, 0xe3, 0xb7, 0xda,
0x3e, 0xf1, 0xce, 0x88, 0x37, 0x38, 0xb2, 0x17, 0x8e, 0xfb, 0xc7, 0x7d, 0x3e, 0x51, 0x61, 0xbf, 0x9e, 0xe3, 0x8e, 0x1d, 0x77, 0x78, 0x6c, 0x2e, 0x9d, 0x0c, 0x4e, 0x06, 0x6c, 0xa2, 0x4a, 0xbf,
0x04, 0x8f, 0xbd, 0xc4, 0x78, 0x2a, 0xdd, 0xb3, 0x66, 0x93, 0xff, 0x6f, 0x70, 0x54, 0x39, 0x3d, 0x38, 0x8e, 0xb9, 0x4c, 0x71, 0xaa, 0xbd, 0x71, 0xab, 0xc5, 0xfe, 0x1b, 0x1e, 0x57, 0xcf, 0xc6,
0x93, 0x53, 0x37, 0xf9, 0x94, 0x3b, 0x0c, 0x4e, 0xf8, 0xff, 0xe8, 0x14, 0xfb, 0x47, 0x4e, 0x2e, 0x62, 0xea, 0x26, 0x9b, 0xb2, 0x47, 0xfe, 0x29, 0xfb, 0x8f, 0x4c, 0xd1, 0x3f, 0x62, 0x72, 0xe5,
0x1f, 0xf7, 0xfb, 0xc7, 0x1d, 0x52, 0x71, 0x07, 0xed, 0x8a, 0xdb, 0xeb, 0xf5, 0x03, 0x37, 0x68, 0x64, 0x30, 0x38, 0xe9, 0x3a, 0x55, 0x7b, 0xd8, 0xa9, 0xda, 0xfd, 0xfe, 0xc0, 0xb7, 0xfd, 0xce,
0xf7, 0x7b, 0xbe, 0x98, 0xc5, 0x9f, 0x59, 0x50, 0x76, 0x88, 0x3f, 0xa0, 0x14, 0xf2, 0x3e, 0x71, 0xa0, 0xef, 0xf1, 0x59, 0xfc, 0x99, 0x01, 0x65, 0xcb, 0xf1, 0x86, 0x04, 0xe2, 0xbc, 0xef, 0xd8,
0x5b, 0xc4, 0x43, 0xb7, 0x00, 0x9a, 0x9d, 0xa1, 0x1f, 0x10, 0xef, 0xb0, 0xdd, 0x5a, 0xb4, 0x56, 0x6d, 0xc7, 0x45, 0xb7, 0x00, 0x5a, 0xdd, 0x91, 0xe7, 0x3b, 0xee, 0x51, 0xa7, 0x5d, 0x31, 0xd6,
0xad, 0x47, 0x13, 0x4e, 0x41, 0x52, 0xb6, 0x5a, 0xe8, 0x26, 0x14, 0xba, 0xa4, 0x7b, 0x24, 0x66, 0x8c, 0x47, 0x33, 0x56, 0x41, 0x40, 0xb6, 0xdb, 0xe8, 0x26, 0x14, 0x7a, 0x4e, 0xef, 0x98, 0xcf,
0x73, 0x7c, 0x76, 0x46, 0x10, 0xe8, 0xa4, 0x0d, 0x33, 0x1e, 0x39, 0x6b, 0xfb, 0x14, 0x61, 0x31, 0x66, 0xd8, 0xec, 0x1c, 0x07, 0x90, 0x49, 0x13, 0xe6, 0x5c, 0x67, 0xdc, 0xf1, 0x08, 0x87, 0x4a,
0x4f, 0xe7, 0xf2, 0x4e, 0x38, 0x66, 0x0b, 0x3d, 0xf7, 0x59, 0x70, 0x48, 0xc5, 0x74, 0x17, 0x27, 0x96, 0xcc, 0x65, 0xad, 0x60, 0x4c, 0x17, 0xba, 0xf6, 0x33, 0xff, 0x88, 0x90, 0xe9, 0x55, 0x66,
0xc4, 0x42, 0x46, 0x68, 0xd0, 0x31, 0xfe, 0x32, 0x0f, 0x25, 0xc7, 0xed, 0x1d, 0x13, 0x87, 0x7c, 0xf8, 0x42, 0x0a, 0x68, 0x92, 0x31, 0xfe, 0x2a, 0x0b, 0x25, 0xcb, 0xee, 0x9f, 0x38, 0x96, 0xf3,
0x32, 0x24, 0x7e, 0x80, 0xe6, 0x20, 0x7f, 0x4a, 0xce, 0x39, 0x7c, 0xc9, 0x61, 0x3f, 0xc5, 0x7a, 0xc9, 0xc8, 0xf1, 0x7c, 0xb4, 0x00, 0xd9, 0x33, 0xe7, 0x9c, 0xb1, 0x2f, 0x59, 0xf4, 0x93, 0xaf,
0xca, 0x71, 0x48, 0x7a, 0x02, 0xb8, 0xc4, 0xd6, 0x53, 0x42, 0xbd, 0xd7, 0x42, 0x0b, 0x30, 0xd9, 0x27, 0x18, 0x47, 0x4e, 0x9f, 0x33, 0x2e, 0xd1, 0xf5, 0x04, 0xd0, 0xe8, 0xb7, 0xd1, 0x12, 0xcc,
0x69, 0x77, 0xdb, 0x81, 0x44, 0x15, 0x83, 0x98, 0x3a, 0x13, 0x09, 0x75, 0x36, 0x01, 0xfc, 0xbe, 0x76, 0x3b, 0xbd, 0x8e, 0x2f, 0xb8, 0xf2, 0x41, 0x44, 0x9c, 0x99, 0x98, 0x38, 0x5b, 0x00, 0xde,
0x17, 0x1c, 0xf6, 0x3d, 0xba, 0xe9, 0xc5, 0x49, 0x3a, 0x5b, 0x5e, 0xbf, 0xb7, 0xa6, 0x1f, 0xc4, 0xc0, 0xf5, 0x8f, 0x06, 0x2e, 0xd9, 0x74, 0x65, 0x96, 0xcc, 0x96, 0x37, 0xee, 0xad, 0xab, 0x07,
0x9a, 0xae, 0xd0, 0xda, 0x3e, 0x65, 0xde, 0x63, 0xbc, 0x4e, 0xc1, 0x57, 0x3f, 0xd1, 0x7b, 0x50, 0xb1, 0xae, 0x0a, 0xb4, 0x7e, 0x40, 0x90, 0xf7, 0x29, 0xae, 0x55, 0xf0, 0xe4, 0x27, 0x7a, 0x0f,
0xe4, 0x42, 0x02, 0xd7, 0x3b, 0x26, 0xc1, 0xe2, 0x14, 0x97, 0x72, 0xff, 0x02, 0x29, 0x0d, 0xce, 0x8a, 0x8c, 0x88, 0x6f, 0xbb, 0x27, 0x8e, 0x5f, 0xc9, 0x31, 0x2a, 0xf7, 0x2f, 0xa0, 0xd2, 0x64,
0xec, 0x70, 0x78, 0xf1, 0x1b, 0x61, 0x28, 0x51, 0xfe, 0xb6, 0xdb, 0x69, 0xbf, 0x74, 0x8f, 0x3a, 0xc8, 0x16, 0x63, 0xcf, 0xbf, 0x11, 0x86, 0x12, 0xc1, 0xef, 0xd8, 0xdd, 0xce, 0x4b, 0xfb, 0xb8,
0x64, 0x71, 0x9a, 0x0a, 0x9a, 0x71, 0x62, 0x34, 0xb6, 0x7f, 0x6a, 0x06, 0xff, 0xb0, 0xdf, 0xeb, 0xeb, 0x54, 0xf2, 0x84, 0xd0, 0x9c, 0x15, 0x81, 0xd1, 0xfd, 0x13, 0x35, 0x78, 0x47, 0x83, 0x7e,
0x9c, 0x2f, 0xce, 0x70, 0x86, 0x19, 0x46, 0xd8, 0xa3, 0x63, 0x7e, 0x68, 0xfd, 0x61, 0x2f, 0x10, 0xf7, 0xbc, 0x32, 0xc7, 0x10, 0xe6, 0x28, 0x60, 0x9f, 0x8c, 0xd9, 0xa1, 0x0d, 0x46, 0x7d, 0x9f,
0xb3, 0x05, 0x3e, 0x5b, 0xe0, 0x14, 0x36, 0x8d, 0xd7, 0xa0, 0x10, 0xea, 0x8f, 0x66, 0x60, 0x62, 0xcf, 0x16, 0xd8, 0x6c, 0x81, 0x41, 0xe8, 0x34, 0x5e, 0x87, 0x42, 0x20, 0x3f, 0x9a, 0x83, 0x99,
0x77, 0x6f, 0xb7, 0x3e, 0x77, 0x05, 0x01, 0x4c, 0x55, 0xf7, 0x37, 0xeb, 0xbb, 0xb5, 0x39, 0x0b, 0xbd, 0xfd, 0xbd, 0xc6, 0xc2, 0x15, 0x04, 0x90, 0xab, 0x1d, 0x6c, 0x35, 0xf6, 0xea, 0x0b, 0x06,
0x15, 0x61, 0xba, 0x56, 0x17, 0x83, 0x1c, 0xde, 0x00, 0x88, 0x34, 0x45, 0xd3, 0x90, 0xdf, 0xae, 0x2a, 0x42, 0xbe, 0xde, 0xe0, 0x83, 0x0c, 0xde, 0x04, 0x08, 0x25, 0x45, 0x79, 0xc8, 0xee, 0x34,
0x7f, 0x9f, 0xf2, 0x53, 0x9e, 0x83, 0xba, 0xb3, 0xbf, 0xb5, 0xb7, 0x4b, 0x17, 0xd0, 0xc5, 0x9b, 0x7e, 0x48, 0xf0, 0x09, 0xce, 0x61, 0xc3, 0x3a, 0xd8, 0xde, 0xdf, 0x23, 0x0b, 0xc8, 0xe2, 0x2d,
0x4e, 0xbd, 0xda, 0xa8, 0xcf, 0xe5, 0x18, 0xc7, 0x07, 0x7b, 0xb5, 0xb9, 0x3c, 0x2a, 0xc0, 0xe4, 0xab, 0x51, 0x6b, 0x36, 0x16, 0x32, 0x14, 0xe3, 0x83, 0xfd, 0xfa, 0x42, 0x16, 0x15, 0x60, 0xf6,
0x41, 0x75, 0xe7, 0x69, 0x7d, 0x6e, 0x02, 0x7f, 0x61, 0xc1, 0xac, 0xdc, 0xbb, 0xb8, 0x5f, 0xe8, 0xb0, 0xb6, 0xfb, 0xb4, 0xb1, 0x30, 0x83, 0xbf, 0x30, 0x60, 0x5e, 0xec, 0x9d, 0xdb, 0x17, 0x7a,
0x1d, 0x98, 0x3a, 0xe1, 0x77, 0x8c, 0x1f, 0x6b, 0x71, 0x7d, 0x39, 0x61, 0xa8, 0xd8, 0x3d, 0x74, 0x07, 0x72, 0xa7, 0xcc, 0xc6, 0xd8, 0xb1, 0x16, 0x37, 0x56, 0x62, 0x8a, 0x8a, 0xd8, 0xa1, 0x25,
0x24, 0x2f, 0xb5, 0x4d, 0xfe, 0xf4, 0xcc, 0xa7, 0x27, 0x9e, 0xa7, 0x4b, 0xe6, 0xd6, 0xc4, 0xe5, 0x70, 0x89, 0x6e, 0xb2, 0x67, 0x63, 0x8f, 0x9c, 0x78, 0x96, 0x2c, 0x59, 0x58, 0xe7, 0xc6, 0xbf,
0x5f, 0xdb, 0x26, 0xe7, 0x07, 0x6e, 0x67, 0x48, 0x1c, 0x36, 0x89, 0x10, 0x4c, 0x74, 0xfb, 0x1e, 0xbe, 0xe3, 0x9c, 0x1f, 0xda, 0xdd, 0x91, 0x63, 0xd1, 0x49, 0x84, 0x60, 0xa6, 0x37, 0x70, 0x1d,
0xe1, 0xa7, 0x3f, 0xe3, 0xf0, 0xdf, 0xec, 0x4a, 0x70, 0x03, 0xc8, 0x93, 0x17, 0x03, 0xfc, 0x3d, 0x76, 0xfa, 0x73, 0x16, 0xfb, 0xa6, 0x26, 0xc1, 0x14, 0x20, 0x4e, 0x9e, 0x0f, 0xf0, 0x0f, 0x00,
0x80, 0x27, 0xc3, 0x20, 0xfd, 0x96, 0xd1, 0x55, 0x67, 0x4c, 0xae, 0xbc, 0x61, 0x62, 0xc0, 0xaf, 0x9e, 0x8c, 0xfc, 0x64, 0x2b, 0x23, 0xab, 0xc6, 0x94, 0xae, 0xb0, 0x30, 0x3e, 0x60, 0xe6, 0xe5,
0x17, 0x71, 0x7d, 0x12, 0x5e, 0x2f, 0x36, 0xc0, 0x9b, 0x50, 0xe4, 0xb2, 0xb2, 0x6c, 0x0f, 0x13, 0xd8, 0x9e, 0x13, 0x98, 0x17, 0x1d, 0xe0, 0x2d, 0x28, 0x32, 0x5a, 0x69, 0xb6, 0x87, 0x1d, 0x40,
0x40, 0x35, 0xd2, 0x21, 0x01, 0xc9, 0x72, 0xfd, 0x57, 0xa1, 0x38, 0xf0, 0x08, 0x87, 0xda, 0x3e, 0x75, 0xa7, 0xeb, 0xf8, 0x4e, 0x1a, 0xf3, 0x5f, 0x83, 0xe2, 0xd0, 0x75, 0x18, 0xab, 0x9d, 0x43,
0xf0, 0xa5, 0x19, 0x74, 0x12, 0xfe, 0xdc, 0x82, 0xf9, 0x18, 0x4e, 0xa6, 0x33, 0x59, 0x84, 0xe9, 0x4f, 0xa8, 0x41, 0x05, 0xe1, 0xcf, 0x0d, 0x58, 0x8c, 0xf0, 0x49, 0x75, 0x26, 0x15, 0xc8, 0xb7,
0x16, 0x17, 0x26, 0x54, 0xc9, 0x3b, 0x6a, 0xc8, 0x4e, 0x4b, 0x68, 0x90, 0x76, 0x5a, 0x54, 0x97, 0x19, 0x31, 0x2e, 0x4a, 0xd6, 0x92, 0x43, 0x7a, 0x5a, 0x5c, 0x82, 0xa4, 0xd3, 0x22, 0xb2, 0xfc,
0x7f, 0x5a, 0x50, 0x90, 0x1b, 0xdd, 0x1b, 0xa0, 0x2a, 0xcc, 0x7a, 0x62, 0x70, 0xc8, 0xf7, 0x23, 0xd3, 0x80, 0x82, 0xd8, 0xe8, 0xfe, 0x10, 0xd5, 0x60, 0xde, 0xe5, 0x83, 0x23, 0xb6, 0x1f, 0x21,
0x15, 0xb1, 0xd3, 0xbd, 0xe8, 0xfd, 0x2b, 0x4e, 0x49, 0x2e, 0xe1, 0x64, 0xf4, 0x1d, 0x28, 0x2a, 0x88, 0x99, 0xec, 0x45, 0xef, 0x5f, 0xb1, 0x4a, 0x62, 0x09, 0x03, 0xa3, 0xef, 0x41, 0x51, 0x92,
0x11, 0x83, 0x61, 0xc0, 0x55, 0x2a, 0xae, 0x2f, 0xc6, 0x05, 0x44, 0xa7, 0x4e, 0x97, 0x83, 0x64, 0x18, 0x8e, 0x7c, 0x26, 0x52, 0x71, 0xa3, 0x12, 0x25, 0x10, 0x9e, 0x3a, 0x59, 0x0e, 0x02, 0x9d,
0xa7, 0x44, 0xd4, 0x80, 0x05, 0xb5, 0x58, 0x6c, 0x42, 0xaa, 0x91, 0xe7, 0x52, 0x56, 0xe3, 0x52, 0x00, 0x51, 0x13, 0x96, 0xe4, 0x62, 0xbe, 0x09, 0x21, 0x46, 0x96, 0x51, 0x59, 0x8b, 0x52, 0x99,
0x46, 0x8f, 0x8a, 0x4a, 0x43, 0x72, 0xbd, 0x36, 0xb9, 0x51, 0x80, 0x69, 0x49, 0xc5, 0xff, 0xb2, 0x3c, 0x2a, 0x42, 0x0d, 0x89, 0xf5, 0xca, 0xe4, 0x66, 0x01, 0xf2, 0x02, 0x8a, 0xff, 0x65, 0x00,
0x00, 0x94, 0x1d, 0xe9, 0x7e, 0x6b, 0x50, 0xf6, 0xe4, 0x28, 0xb6, 0xe1, 0x9b, 0xc6, 0x0d, 0x4b, 0x48, 0x3d, 0x92, 0xfd, 0xd6, 0xa1, 0xec, 0x8a, 0x51, 0x64, 0xc3, 0x37, 0xb5, 0x1b, 0x16, 0xea,
0xf3, 0x5f, 0x71, 0x66, 0xd5, 0x22, 0xb1, 0xe5, 0x77, 0xa1, 0x14, 0x4a, 0x89, 0xf6, 0xbc, 0x64, 0xbf, 0x62, 0xcd, 0xcb, 0x45, 0x7c, 0xcb, 0xef, 0x42, 0x29, 0xa0, 0x12, 0xee, 0x79, 0x59, 0xb3,
0xd8, 0x73, 0x28, 0xa1, 0xa8, 0x16, 0xb0, 0x5d, 0x7f, 0x04, 0xd7, 0xc3, 0xf5, 0x86, 0x6d, 0xdf, 0xe7, 0x80, 0x42, 0x51, 0x2e, 0xa0, 0xbb, 0xfe, 0x08, 0xae, 0x07, 0xeb, 0x35, 0xdb, 0xbe, 0x33,
0x19, 0xb3, 0xed, 0x50, 0xe0, 0xbc, 0x92, 0xa0, 0x6f, 0x1c, 0x58, 0xcc, 0x15, 0x64, 0xfc, 0xeb, 0x65, 0xdb, 0x01, 0xc1, 0x45, 0x49, 0x41, 0xdd, 0x38, 0xd0, 0x98, 0xcb, 0xc1, 0xf8, 0xcb, 0x2c,
0x3c, 0x4c, 0x6f, 0xf6, 0xbb, 0x03, 0xd7, 0x63, 0x67, 0x34, 0x45, 0xe9, 0xc3, 0x4e, 0xc0, 0xb7, 0xe4, 0xb7, 0x06, 0xbd, 0xa1, 0xed, 0xd2, 0x33, 0xca, 0x11, 0xf8, 0xa8, 0xeb, 0xb3, 0xed, 0x96,
0x5b, 0x5e, 0xbf, 0x1b, 0x47, 0x90, 0x6c, 0xea, 0x5f, 0x87, 0xb3, 0x3a, 0x72, 0x09, 0x5b, 0x2c, 0x37, 0xee, 0x46, 0x39, 0x08, 0x34, 0xf9, 0xd7, 0x62, 0xa8, 0x96, 0x58, 0x42, 0x17, 0x8b, 0x10,
0x43, 0x6c, 0xee, 0x12, 0x8b, 0x65, 0x80, 0x95, 0x4b, 0x94, 0x2f, 0xe5, 0x23, 0x5f, 0xb2, 0x61, 0x9b, 0xb9, 0xc4, 0x62, 0x11, 0x60, 0xc5, 0x12, 0xe9, 0x4b, 0xd9, 0xd0, 0x97, 0x4c, 0xc8, 0x93,
0x9a, 0x2e, 0x8c, 0x9e, 0x05, 0xba, 0x17, 0x45, 0x40, 0xaf, 0xc2, 0xd5, 0xa6, 0x47, 0x5c, 0x66, 0x85, 0xe1, 0xb5, 0x40, 0xf6, 0x22, 0x01, 0xe8, 0x55, 0xb8, 0xda, 0x72, 0x1d, 0x9b, 0xea, 0x43,
0x0f, 0xf5, 0x74, 0x4c, 0x4a, 0x9e, 0xb2, 0x98, 0x70, 0xd4, 0x13, 0x72, 0x17, 0x4a, 0xdd, 0x7e, 0x5e, 0x1d, 0xb3, 0x02, 0xa7, 0xcc, 0x27, 0x2c, 0x79, 0x85, 0xdc, 0x85, 0x52, 0x6f, 0xd0, 0x0e,
0x2b, 0xe2, 0x9b, 0x92, 0x7c, 0x45, 0x4a, 0x0d, 0x99, 0x6e, 0xa8, 0x80, 0xc2, 0x62, 0x7a, 0x89, 0xf1, 0x72, 0x02, 0xaf, 0x48, 0xa0, 0x01, 0xd2, 0x0d, 0x19, 0x50, 0x68, 0x4c, 0x2f, 0x91, 0x59,
0xce, 0x8a, 0x21, 0x7e, 0x0b, 0x66, 0x63, 0x7b, 0x65, 0xa1, 0xb3, 0xfe, 0xe1, 0xd3, 0xea, 0x8e, 0x3e, 0xc4, 0x6f, 0xc1, 0x7c, 0x64, 0xaf, 0x34, 0x74, 0x36, 0x3e, 0x7c, 0x5a, 0xdb, 0xe5, 0x71,
0x88, 0xb3, 0x8f, 0x79, 0x68, 0x75, 0x68, 0x9c, 0xa5, 0xe1, 0x7a, 0xa7, 0xbe, 0xbf, 0x4f, 0xa3, 0xf6, 0x31, 0x0b, 0xad, 0x16, 0x89, 0xb3, 0x24, 0x5c, 0xef, 0x36, 0x0e, 0x0e, 0x48, 0x54, 0xfe,
0xf2, 0x77, 0xc3, 0x25, 0x32, 0x30, 0x6b, 0xf1, 0xf8, 0x8a, 0x16, 0x8f, 0x2d, 0x15, 0x8f, 0x73, 0x7e, 0xb0, 0x44, 0x04, 0x66, 0x25, 0x1e, 0x5f, 0x51, 0xe2, 0xb1, 0x21, 0xe3, 0x71, 0x26, 0x8c,
0x51, 0x3c, 0xce, 0x6f, 0x94, 0xa1, 0x24, 0x0c, 0x72, 0x38, 0xec, 0x51, 0xc5, 0xf0, 0x6f, 0xe9, 0xc7, 0xd9, 0xcd, 0x32, 0x94, 0xb8, 0x42, 0x8e, 0x46, 0x7d, 0x22, 0x18, 0xfe, 0x2d, 0x31, 0xcb,
0xb5, 0x6c, 0xbc, 0xe8, 0xa9, 0x88, 0x53, 0x81, 0xe9, 0xa6, 0x10, 0x4e, 0x0f, 0x88, 0x39, 0xef, 0xe6, 0x8b, 0xbe, 0x8c, 0x38, 0x55, 0xc8, 0xb7, 0x38, 0x71, 0x72, 0x40, 0xd4, 0x79, 0xaf, 0x6b,
0x75, 0xa3, 0x8d, 0x1d, 0xc5, 0x85, 0xde, 0x82, 0x69, 0x7f, 0xd8, 0x6c, 0x12, 0x5f, 0xc5, 0xe6, 0x75, 0x6c, 0x49, 0x2c, 0xf4, 0x16, 0xe4, 0xbd, 0x51, 0xab, 0xe5, 0x78, 0x32, 0x36, 0xbf, 0x12,
0x57, 0x92, 0xa1, 0x43, 0x7a, 0xb8, 0xa3, 0xf8, 0xd8, 0x92, 0x67, 0x6e, 0xbb, 0x33, 0xe4, 0x91, 0x0f, 0x1d, 0xc2, 0xc3, 0x2d, 0x89, 0x47, 0x97, 0x3c, 0xb3, 0x3b, 0xdd, 0x11, 0x8b, 0xd4, 0xd3,
0x7a, 0xfc, 0x12, 0xc9, 0x87, 0x7f, 0x65, 0x41, 0x91, 0x6b, 0x99, 0x29, 0x5e, 0x2d, 0x43, 0x81, 0x97, 0x08, 0x3c, 0xfc, 0x6b, 0x03, 0x8a, 0x4c, 0xca, 0x54, 0xf1, 0x6a, 0x05, 0x0a, 0x4c, 0x06,
0xeb, 0x40, 0x5a, 0x32, 0x62, 0xd1, 0xd7, 0x31, 0x24, 0xa0, 0x6f, 0xd1, 0xd0, 0x2a, 0xd7, 0xa9, 0xa7, 0x2d, 0x22, 0x16, 0xb9, 0x1d, 0x03, 0x00, 0xfa, 0x0e, 0x09, 0xad, 0x62, 0x9d, 0x8c, 0x5c,
0xc8, 0xb5, 0x68, 0x16, 0x4b, 0x35, 0x8b, 0x58, 0xf1, 0x36, 0x5c, 0xe3, 0x56, 0x69, 0xb2, 0x8c, 0x15, 0x3d, 0x59, 0x22, 0x59, 0x88, 0x8a, 0x77, 0xe0, 0x1a, 0xd3, 0x4a, 0x8b, 0x66, 0x54, 0x52,
0x4a, 0xd9, 0x51, 0xcf, 0x39, 0xac, 0x44, 0xce, 0x41, 0xe7, 0x06, 0x27, 0xe7, 0x7e, 0xbb, 0xe9, 0x8f, 0x6a, 0xce, 0x61, 0xc4, 0x72, 0x0e, 0x32, 0x37, 0x3c, 0x3d, 0xf7, 0x3a, 0x2d, 0xbb, 0x2b,
0x76, 0xa4, 0x16, 0xe1, 0x98, 0x3e, 0x4c, 0x48, 0x17, 0x96, 0xe9, 0x4d, 0x99, 0x85, 0xe2, 0xfb, 0xa4, 0x08, 0xc6, 0xe4, 0x62, 0x42, 0x2a, 0xb1, 0x54, 0x77, 0xca, 0x3c, 0x14, 0xdf, 0xb7, 0xbd,
0xae, 0x7f, 0x22, 0x55, 0xc2, 0x1f, 0x43, 0x49, 0x0c, 0x33, 0xd9, 0x90, 0xbe, 0xb1, 0x27, 0x54, 0x53, 0x21, 0x12, 0xfe, 0x18, 0x4a, 0x7c, 0x98, 0x4a, 0x87, 0xe4, 0x8e, 0x3d, 0x25, 0x54, 0x98,
0x0a, 0x57, 0x7c, 0xd6, 0xe1, 0xbf, 0xf1, 0x35, 0xb8, 0xba, 0xdf, 0x73, 0x07, 0xfe, 0x49, 0x5f, 0xe0, 0xf3, 0x16, 0xfb, 0xc6, 0xd7, 0xe0, 0xea, 0x41, 0xdf, 0x1e, 0x7a, 0xa7, 0x03, 0x19, 0x5c,
0x05, 0x57, 0x96, 0x51, 0xce, 0x45, 0xb4, 0x4c, 0x88, 0x0f, 0xe1, 0xaa, 0x47, 0xba, 0x6e, 0xbb, 0x69, 0x46, 0xb9, 0x10, 0xc2, 0x52, 0x71, 0x7c, 0x08, 0x57, 0x5d, 0xa7, 0x67, 0x77, 0xfa, 0x9d,
0xd7, 0xee, 0x1d, 0x1f, 0x1e, 0x9d, 0x07, 0xc4, 0x97, 0x09, 0x67, 0x39, 0x24, 0x6f, 0x30, 0x2a, 0xfe, 0xc9, 0xd1, 0xf1, 0xb9, 0xef, 0x78, 0x22, 0xe1, 0x2c, 0x07, 0xe0, 0x4d, 0x0a, 0xa5, 0xa2,
0x53, 0xed, 0xa8, 0xd3, 0x3f, 0x92, 0x2e, 0xce, 0x7f, 0xe3, 0xdf, 0x59, 0x50, 0xfa, 0xc8, 0x0d, 0x1d, 0x77, 0x07, 0xc7, 0xc2, 0xc5, 0xd9, 0x37, 0xfe, 0x9d, 0x01, 0xa5, 0x8f, 0x6c, 0xbf, 0x25,
0x9a, 0xca, 0x0a, 0x68, 0x0b, 0xca, 0xa1, 0x63, 0x73, 0x8a, 0xd4, 0x25, 0x11, 0xe1, 0xf9, 0x9a, 0xb5, 0x80, 0xb6, 0xa1, 0x1c, 0x38, 0x36, 0x83, 0x08, 0x59, 0x62, 0x11, 0x9e, 0xad, 0xd9, 0x12,
0x4d, 0xe9, 0xe8, 0x2a, 0xc2, 0xcf, 0x36, 0x75, 0x02, 0x17, 0xe5, 0xf6, 0x9a, 0xa4, 0x13, 0x8a, 0x8e, 0x2e, 0x23, 0xfc, 0x7c, 0x4b, 0x05, 0x30, 0x52, 0x76, 0xbf, 0xe5, 0x74, 0x03, 0x52, 0x99,
0xca, 0xa5, 0x8b, 0xe2, 0x8c, 0xba, 0x28, 0x9d, 0xb0, 0x71, 0x35, 0x7a, 0xfd, 0x84, 0x5b, 0xfe, 0x64, 0x52, 0x0c, 0x51, 0x25, 0xa5, 0x02, 0x36, 0xaf, 0x86, 0xb7, 0x1f, 0x77, 0xcb, 0x2f, 0x33,
0x2c, 0x07, 0x68, 0x54, 0x87, 0xaf, 0x9a, 0x10, 0xdc, 0x87, 0xb2, 0x4f, 0xbd, 0x3d, 0x38, 0x4c, 0x80, 0x26, 0x65, 0xf8, 0xba, 0x09, 0xc1, 0x7d, 0x28, 0x7b, 0xc4, 0xdb, 0xfd, 0xa3, 0x58, 0x3a,
0xa4, 0xe3, 0xb3, 0x9c, 0x1a, 0x06, 0x27, 0x6a, 0x61, 0x5a, 0x07, 0x1c, 0xd3, 0x2b, 0xed, 0x1f, 0x3e, 0xcf, 0xa0, 0x41, 0x70, 0x22, 0x1a, 0x26, 0x75, 0xc0, 0x09, 0x31, 0x69, 0xef, 0x88, 0x94,
0xd2, 0xd2, 0xa0, 0xfd, 0xec, 0x9c, 0x07, 0xc4, 0x19, 0xa7, 0xac, 0xc8, 0xbb, 0x9c, 0x8a, 0xea, 0x06, 0x9d, 0x67, 0xe7, 0x2c, 0x20, 0xce, 0x59, 0x65, 0x09, 0xde, 0x63, 0x50, 0xd4, 0x20, 0x9e,
0xd4, 0x73, 0xdb, 0x1d, 0x9a, 0xba, 0xfb, 0x34, 0x1a, 0xe6, 0x69, 0x04, 0x7e, 0xfd, 0x22, 0xab, 0xdb, 0xe9, 0x92, 0xd4, 0xdd, 0x23, 0xd1, 0x30, 0x4b, 0x22, 0xf0, 0xeb, 0x17, 0x69, 0x6d, 0xfd,
0xad, 0xbd, 0xc7, 0xf9, 0x1b, 0xe7, 0x03, 0x1a, 0x33, 0xe4, 0x5a, 0x7c, 0x1f, 0x20, 0x22, 0xb3, 0x3d, 0x86, 0xdf, 0x3c, 0x1f, 0x92, 0x98, 0x21, 0xd6, 0xa2, 0x57, 0x20, 0x4f, 0x92, 0x92, 0xf1,
0xe0, 0xb4, 0xbb, 0xf7, 0xe4, 0x69, 0x83, 0x06, 0xaf, 0x12, 0xcc, 0xec, 0xee, 0xd5, 0xea, 0x3b, 0xd1, 0xd9, 0x98, 0x05, 0xcb, 0x39, 0x2b, 0x47, 0x87, 0x3b, 0x63, 0x7c, 0x1f, 0x20, 0xc4, 0xa7,
0x75, 0x16, 0xbe, 0x70, 0x45, 0x99, 0x40, 0x37, 0x15, 0x5a, 0x82, 0x99, 0xe7, 0x8c, 0xaa, 0xca, 0x51, 0x6b, 0x6f, 0xff, 0xc9, 0xd3, 0x26, 0x89, 0x6a, 0x25, 0x98, 0xdb, 0xdb, 0xaf, 0x37, 0x76,
0x12, 0x9a, 0x75, 0xf0, 0xf1, 0x56, 0x0b, 0xff, 0x83, 0xe6, 0x9a, 0xf2, 0xb0, 0x33, 0xdd, 0x38, 0x1b, 0x34, 0xae, 0xe1, 0xaa, 0xd4, 0x8d, 0xaa, 0x43, 0xb4, 0x0c, 0x73, 0xcf, 0x29, 0x54, 0xd6,
0x1d, 0x22, 0x17, 0x83, 0x60, 0x29, 0x8f, 0xb8, 0x04, 0x2d, 0x99, 0x5e, 0xa9, 0x21, 0xf3, 0x6a, 0x2b, 0x24, 0x1d, 0x61, 0xe3, 0xed, 0x36, 0xfe, 0x07, 0x49, 0x42, 0x85, 0x15, 0xa4, 0x32, 0x45,
0x71, 0xa6, 0x74, 0x4a, 0x58, 0x2f, 0x1c, 0xd3, 0xd7, 0x64, 0xae, 0x29, 0xbc, 0x3a, 0xf1, 0x9c, 0x95, 0x45, 0x26, 0xc2, 0x82, 0xe6, 0x42, 0xdc, 0x3a, 0xda, 0x22, 0xef, 0x92, 0x43, 0xea, 0xee,
0x38, 0x57, 0x25, 0x3d, 0x3c, 0x8b, 0xfb, 0x30, 0x45, 0xce, 0x48, 0x2f, 0xf0, 0x17, 0x8b, 0x3c, 0xfc, 0xb0, 0xc9, 0x14, 0x57, 0x6b, 0x30, 0x26, 0xd7, 0xcc, 0x42, 0x8b, 0xbb, 0x7b, 0xec, 0x9e,
0x04, 0xcd, 0xaa, 0xe4, 0xa9, 0xce, 0xa8, 0x8e, 0x9c, 0xc4, 0xdf, 0x84, 0x6b, 0x3b, 0x2c, 0xfb, 0xb1, 0xae, 0x0a, 0x78, 0x70, 0x48, 0xf7, 0x21, 0xe7, 0x8c, 0x9d, 0xbe, 0xef, 0x55, 0x8a, 0x2c,
0x7c, 0x4c, 0xcf, 0x5a, 0xcf, 0x63, 0x1b, 0x8d, 0x1d, 0x69, 0x95, 0x7c, 0xd0, 0xd8, 0x41, 0x65, 0x36, 0xcd, 0xcb, 0xac, 0xaa, 0x41, 0xa1, 0x96, 0x98, 0xc4, 0xdf, 0x86, 0x6b, 0xbb, 0x34, 0x2d,
0xc8, 0x6d, 0xd5, 0xe4, 0x1e, 0x72, 0xed, 0x1a, 0xfe, 0xd4, 0x02, 0xa4, 0xaf, 0xcb, 0x64, 0xa6, 0x7d, 0x4c, 0x8c, 0x40, 0x4d, 0x70, 0x9b, 0xcd, 0x5d, 0xa1, 0x95, 0xac, 0xdf, 0xdc, 0x45, 0x65,
0x84, 0x70, 0x05, 0x9f, 0x8f, 0xe0, 0x69, 0xc2, 0x4c, 0x3c, 0xaf, 0xef, 0x71, 0x83, 0x14, 0x1c, 0xc8, 0x6c, 0xd7, 0xc5, 0x1e, 0x32, 0x9d, 0x3a, 0xfe, 0xd4, 0x00, 0xa4, 0xae, 0x4b, 0xa5, 0xa6,
0x31, 0xc0, 0xf7, 0xa4, 0x0e, 0x74, 0xcf, 0xfd, 0xd3, 0xf0, 0x6a, 0x0b, 0x69, 0x56, 0xa8, 0xea, 0x18, 0x71, 0xc9, 0x3e, 0x1b, 0xb2, 0x27, 0x99, 0xb4, 0xe3, 0xba, 0x03, 0x97, 0x29, 0xa4, 0x60,
0x36, 0xcc, 0xc7, 0xb8, 0x32, 0x85, 0xc2, 0x87, 0x70, 0x9d, 0x0b, 0xdb, 0x26, 0x64, 0x50, 0xed, 0xf1, 0x01, 0xbe, 0x27, 0x64, 0x20, 0x7b, 0x1e, 0x9c, 0x05, 0x36, 0xcf, 0xa9, 0x19, 0x81, 0xa8,
0xb4, 0xcf, 0x52, 0x51, 0x07, 0x70, 0x23, 0xc9, 0xf8, 0xf5, 0xda, 0x08, 0x9f, 0xc0, 0xd4, 0x07, 0x3b, 0xb0, 0x18, 0xc1, 0x4a, 0x15, 0x23, 0x1f, 0xc2, 0x75, 0x46, 0x6c, 0xc7, 0x71, 0x86, 0xb5,
0xbc, 0x70, 0xd6, 0x74, 0x99, 0xe0, 0xbc, 0x34, 0x9e, 0xf5, 0xdc, 0xae, 0xa8, 0x41, 0x0a, 0x0e, 0x6e, 0x67, 0x9c, 0xc8, 0x75, 0x08, 0x37, 0xe2, 0x88, 0xdf, 0xac, 0x8e, 0xf0, 0x29, 0xe4, 0x3e,
0xff, 0xcd, 0xdf, 0x0e, 0x42, 0xbc, 0xa7, 0xce, 0x8e, 0x78, 0xa3, 0x0a, 0x4e, 0x38, 0x46, 0x2b, 0x60, 0x15, 0xb5, 0x22, 0xcb, 0x0c, 0xc3, 0x25, 0x81, 0xae, 0x6f, 0xf7, 0x78, 0x71, 0x52, 0xb0,
0xac, 0x64, 0x6f, 0xd3, 0xeb, 0xc1, 0x67, 0x27, 0xf8, 0xac, 0x46, 0xa1, 0xe5, 0xdf, 0x9c, 0x40, 0xd8, 0x37, 0xbb, 0x54, 0x1c, 0xc7, 0x7d, 0x6a, 0xed, 0xf2, 0xcb, 0xab, 0x60, 0x05, 0x63, 0xb4,
0xaa, 0xb6, 0x5a, 0xda, 0x3b, 0x15, 0xca, 0xb3, 0xe2, 0xf2, 0xf0, 0x73, 0xb8, 0xa6, 0xf1, 0x67, 0x4a, 0x6b, 0xf9, 0x0e, 0x31, 0x0f, 0x36, 0x3b, 0xc3, 0x66, 0x15, 0x08, 0xa9, 0x0b, 0x17, 0x38,
0x32, 0xc3, 0x1b, 0x30, 0x25, 0xba, 0x03, 0x32, 0x44, 0x2e, 0xc4, 0x57, 0x09, 0x18, 0x47, 0xf2, 0xa7, 0x5a, 0xbb, 0xad, 0x5c, 0x60, 0x01, 0x3d, 0x23, 0x4a, 0x0f, 0x3f, 0x87, 0x6b, 0x0a, 0x7e,
0xd0, 0xf8, 0x30, 0x2f, 0x29, 0xa4, 0xdb, 0x37, 0x9d, 0x15, 0xb7, 0x0f, 0xde, 0x81, 0x85, 0x38, 0x2a, 0x35, 0xbc, 0x01, 0x39, 0xde, 0x36, 0x10, 0xb1, 0x73, 0x29, 0xba, 0x8a, 0xb3, 0xb1, 0x04,
0x5b, 0xa6, 0x2b, 0x52, 0x55, 0xa0, 0x4f, 0x07, 0x2d, 0x2d, 0xe2, 0x26, 0x0f, 0x45, 0x37, 0x58, 0x0e, 0x89, 0x0f, 0x8b, 0x02, 0xe2, 0xf4, 0x06, 0xba, 0xb3, 0x62, 0xfa, 0xc1, 0xbb, 0xb0, 0x14,
0x2e, 0x61, 0xb0, 0x50, 0x21, 0x25, 0x22, 0x93, 0x42, 0xf3, 0xca, 0xfc, 0x3b, 0x6d, 0x3f, 0x7c, 0x45, 0x4b, 0x65, 0x22, 0x35, 0xc9, 0xf4, 0xe9, 0xb0, 0xad, 0x84, 0xe2, 0xf8, 0xa1, 0xa8, 0x0a,
0x57, 0x5f, 0x02, 0xd2, 0x89, 0x99, 0x0e, 0x65, 0x0d, 0xa6, 0x85, 0xc1, 0x55, 0xea, 0x66, 0x3e, 0xcb, 0xc4, 0x14, 0x16, 0x08, 0x24, 0x49, 0xa4, 0x12, 0x68, 0x51, 0xaa, 0x7f, 0xb7, 0xe3, 0x05,
0x15, 0xc5, 0xc4, 0x14, 0xaa, 0x91, 0x67, 0x9e, 0x7b, 0xdc, 0x25, 0x61, 0xcc, 0x61, 0x09, 0x8b, 0x17, 0xee, 0x4b, 0x40, 0x2a, 0x30, 0xd5, 0xa1, 0xac, 0x43, 0x9e, 0x2b, 0x5c, 0xe6, 0x74, 0xfa,
0x4e, 0xcc, 0xb4, 0xe3, 0x3f, 0xd1, 0xc7, 0xba, 0xda, 0x71, 0xbd, 0xae, 0x32, 0xfe, 0xbb, 0x30, 0x53, 0x91, 0x48, 0x54, 0xa0, 0xba, 0xf3, 0xcc, 0xb5, 0x4f, 0x7a, 0x4e, 0x10, 0x73, 0x68, 0x26,
0x25, 0x32, 0x21, 0x59, 0x2d, 0x3c, 0x88, 0x8b, 0xd1, 0x79, 0xc5, 0xa0, 0x2a, 0xf2, 0x26, 0xb9, 0xa3, 0x02, 0x53, 0xed, 0xf8, 0x4f, 0xe4, 0x16, 0xaf, 0x75, 0x6d, 0xb7, 0x27, 0x95, 0xff, 0x2e,
0x8a, 0x1d, 0x96, 0x6c, 0x4a, 0xd5, 0x12, 0x4d, 0xaa, 0x1a, 0x7a, 0x13, 0x26, 0x5d, 0xb6, 0x84, 0xe4, 0x78, 0x8a, 0x24, 0xca, 0x88, 0x07, 0x51, 0x32, 0x2a, 0x2e, 0x1f, 0xd4, 0x78, 0x42, 0x25,
0xfb, 0x62, 0x39, 0x99, 0x83, 0x72, 0x69, 0xfc, 0xd5, 0x12, 0x5c, 0xf8, 0x1d, 0x28, 0x6a, 0x08, 0x56, 0xd1, 0xc3, 0x12, 0xdd, 0xaa, 0x7a, 0xac, 0x7b, 0x55, 0x47, 0x6f, 0xc2, 0xac, 0x4d, 0x97,
0x2c, 0xb5, 0x7e, 0x5c, 0x97, 0x4f, 0x56, 0x75, 0xb3, 0xb1, 0x75, 0x20, 0x32, 0xee, 0x32, 0x40, 0x30, 0x5f, 0x2c, 0xc7, 0x93, 0x53, 0x46, 0x8d, 0x5d, 0x67, 0x1c, 0x0b, 0xbf, 0x03, 0x45, 0x85,
0xad, 0x1e, 0x8e, 0x73, 0x34, 0xe7, 0x12, 0xab, 0xa4, 0x87, 0xeb, 0xfa, 0x58, 0x69, 0xfa, 0xe4, 0x03, 0xcd, 0xb9, 0x1f, 0x37, 0xc4, 0x95, 0x55, 0xdb, 0x6a, 0x6e, 0x1f, 0xf2, 0x54, 0xbc, 0x0c,
0x2e, 0xa5, 0xcf, 0x0b, 0x98, 0x95, 0xdb, 0xcf, 0x74, 0x07, 0xde, 0xa2, 0x16, 0x66, 0x62, 0xd4, 0x50, 0x6f, 0x04, 0xe3, 0x0c, 0x49, 0xc6, 0xf8, 0x2a, 0xe1, 0xe1, 0xaa, 0x3c, 0x46, 0x92, 0x3c,
0x15, 0x58, 0x32, 0xc0, 0x2a, 0xef, 0x14, 0x8c, 0x98, 0xe6, 0x2a, 0xfb, 0x81, 0x1b, 0x0c, 0x7d, 0x99, 0x4b, 0xc9, 0xf3, 0x02, 0xe6, 0xc5, 0xf6, 0x53, 0xd9, 0xc0, 0x5b, 0x44, 0xc3, 0x94, 0x8c,
0x75, 0x05, 0xfe, 0x68, 0x41, 0x59, 0x51, 0xb2, 0xf6, 0x13, 0x54, 0x41, 0x26, 0x62, 0x5e, 0x58, 0x34, 0x81, 0x65, 0x0d, 0x5b, 0xe9, 0x9d, 0x1c, 0x11, 0x93, 0x24, 0xe6, 0xc0, 0xb7, 0xfd, 0x91,
0x8e, 0xdd, 0x80, 0xa9, 0xd6, 0xd1, 0x7e, 0xfb, 0xa5, 0x6a, 0xbd, 0xc8, 0x11, 0xa3, 0x77, 0x04, 0x27, 0x4d, 0xe0, 0x8f, 0x06, 0x94, 0x25, 0x24, 0x6d, 0xa3, 0x41, 0x56, 0x6a, 0x3c, 0xe6, 0x05,
0x8e, 0x68, 0x25, 0xca, 0x11, 0xcb, 0xf4, 0x59, 0x53, 0x71, 0xab, 0xd7, 0x22, 0x2f, 0xf8, 0x4b, 0x75, 0xda, 0x0d, 0xc8, 0xb5, 0x8f, 0x0f, 0x3a, 0x2f, 0x65, 0x4f, 0x46, 0x8c, 0x28, 0xbc, 0xcb,
0x3b, 0xe1, 0x44, 0x04, 0x9e, 0x9c, 0xcb, 0x96, 0x23, 0xaf, 0xd6, 0xf4, 0x16, 0x24, 0xbd, 0xe4, 0xf9, 0xf0, 0x1e, 0xa3, 0x18, 0xd1, 0x12, 0x80, 0x76, 0x1b, 0xb7, 0xfb, 0x6d, 0xe7, 0x05, 0xbb,
0xd5, 0x61, 0x70, 0x52, 0xef, 0xb1, 0x6e, 0x9b, 0xda, 0xe1, 0x02, 0x20, 0x46, 0xac, 0xb5, 0x7d, 0x69, 0x67, 0xac, 0x10, 0xc0, 0xb2, 0x76, 0xd1, 0x8b, 0x64, 0x99, 0x89, 0xda, 0x9b, 0x24, 0x46,
0x9d, 0x5a, 0x87, 0x79, 0x46, 0xa5, 0xf7, 0x9e, 0xa6, 0xee, 0x51, 0xc4, 0x50, 0x61, 0xdb, 0x4a, 0x5e, 0x1b, 0xf9, 0xa7, 0x8d, 0x3e, 0x6d, 0xc3, 0xc9, 0x1d, 0x2e, 0x01, 0xa2, 0xc0, 0x7a, 0xc7,
0x84, 0x6d, 0xd7, 0xf7, 0x9f, 0xf7, 0xbd, 0x96, 0xdc, 0x5a, 0x38, 0xc6, 0x35, 0x21, 0xfc, 0xa9, 0x53, 0xa1, 0x0d, 0x58, 0xa4, 0x50, 0x62, 0xf7, 0x24, 0xa7, 0x0f, 0x23, 0x86, 0x0c, 0xdb, 0x46,
0x1f, 0x0b, 0xcc, 0x5f, 0x55, 0xca, 0xa3, 0x48, 0xca, 0x63, 0x12, 0x8c, 0x91, 0x82, 0x5f, 0x87, 0x2c, 0x6c, 0xdb, 0x9e, 0xf7, 0x7c, 0xe0, 0xb6, 0xc5, 0xd6, 0x82, 0x31, 0xae, 0x73, 0xe2, 0x4f,
0xeb, 0x8a, 0x53, 0x56, 0xec, 0x63, 0x98, 0xf7, 0xe0, 0x96, 0x62, 0xde, 0x3c, 0x61, 0x69, 0xe5, 0xbd, 0x48, 0x60, 0xfe, 0xba, 0x54, 0x1e, 0x85, 0x54, 0x1e, 0x3b, 0xfe, 0x14, 0x2a, 0xf8, 0x75,
0x13, 0x09, 0xf8, 0xbf, 0xea, 0xb9, 0x01, 0x8b, 0xa1, 0x9e, 0x3c, 0x07, 0xe9, 0x77, 0x74, 0x05, 0xb8, 0x2e, 0x31, 0x45, 0x29, 0x3f, 0x05, 0x79, 0x1f, 0x6e, 0x49, 0xe4, 0xad, 0x53, 0x9a, 0x6f,
0x86, 0xbe, 0xbc, 0x33, 0x54, 0x16, 0xfb, 0xcd, 0x68, 0x1e, 0x65, 0x51, 0x8f, 0x20, 0xfb, 0x8d, 0x3e, 0x11, 0x0c, 0xff, 0x57, 0x39, 0x37, 0xa1, 0x12, 0xc8, 0xc9, 0x72, 0x90, 0x41, 0x57, 0x15,
0x37, 0x61, 0x49, 0xc9, 0x90, 0xd9, 0x41, 0x5c, 0xc8, 0x88, 0x42, 0x26, 0x21, 0xd2, 0x60, 0x6c, 0x60, 0xe4, 0x09, 0x9b, 0x21, 0xb4, 0xe8, 0x37, 0x85, 0xb9, 0x04, 0x45, 0x5e, 0x82, 0xf4, 0x1b,
0xe9, 0x78, 0xb3, 0xeb, 0x9c, 0x71, 0xd3, 0x72, 0x99, 0x96, 0x26, 0xf3, 0xba, 0xb8, 0x11, 0x4c, 0x6f, 0xc1, 0xb2, 0xa4, 0x21, 0xb2, 0x83, 0x28, 0x91, 0x09, 0x81, 0x74, 0x44, 0x84, 0xc2, 0xe8,
0x31, 0x3d, 0x68, 0x4b, 0x32, 0x13, 0xa0, 0x93, 0xe5, 0x41, 0x30, 0xf2, 0xc8, 0x41, 0x8c, 0x88, 0xd2, 0xe9, 0x6a, 0x57, 0x31, 0xa3, 0xaa, 0x65, 0x34, 0x0d, 0x85, 0xe6, 0x75, 0x6e, 0x11, 0x54,
0xfe, 0x01, 0xac, 0x84, 0x4a, 0x30, 0xbb, 0x3d, 0xa1, 0x97, 0xb5, 0xed, 0xfb, 0x5a, 0xc9, 0x69, 0x30, 0x35, 0x68, 0x0b, 0x30, 0x25, 0xa0, 0x82, 0xc5, 0x41, 0x50, 0xf0, 0xc4, 0x41, 0x4c, 0x90,
0xda, 0xf8, 0x03, 0x98, 0x18, 0x10, 0x19, 0x53, 0x8a, 0xeb, 0x68, 0x4d, 0x7c, 0x18, 0x58, 0xd3, 0xfe, 0x11, 0xac, 0x06, 0x42, 0x50, 0xbd, 0x3d, 0x21, 0xc6, 0xda, 0xf1, 0x3c, 0xa5, 0x16, 0xd5,
0x16, 0xf3, 0x79, 0xdc, 0x82, 0xdb, 0x4a, 0xba, 0xb0, 0xa8, 0x51, 0x7c, 0x52, 0x29, 0x55, 0x8e, 0x6d, 0xfc, 0x01, 0xcc, 0x0c, 0x1d, 0x11, 0x53, 0x8a, 0x1b, 0x68, 0x9d, 0xbf, 0x18, 0xac, 0x2b,
0x08, 0xb3, 0x8e, 0x96, 0x23, 0x79, 0x71, 0xf6, 0xaa, 0x1c, 0x61, 0x6f, 0x85, 0xee, 0x5b, 0x99, 0x8b, 0xd9, 0x3c, 0x6e, 0xc3, 0x6d, 0x49, 0x9d, 0x6b, 0x54, 0x4b, 0x3e, 0x2e, 0x94, 0xac, 0x53,
0xde, 0x8a, 0x6d, 0x61, 0xd3, 0xd0, 0x25, 0x33, 0x09, 0x3b, 0x82, 0x85, 0xb8, 0x27, 0x67, 0x0a, 0xb8, 0x5a, 0x27, 0xeb, 0x94, 0x2c, 0x3f, 0x7b, 0x59, 0xa7, 0xd0, 0xbb, 0x42, 0xf5, 0xad, 0x54,
0x63, 0x34, 0xeb, 0x0d, 0xa8, 0x09, 0x55, 0x10, 0x13, 0x03, 0xa5, 0x70, 0xe8, 0xe6, 0x99, 0x14, 0x77, 0xc5, 0x0e, 0xd7, 0x69, 0xe0, 0x92, 0xa9, 0x88, 0x1d, 0xc3, 0x52, 0xd4, 0x93, 0x53, 0x85,
0x76, 0x23, 0x61, 0xfc, 0x4a, 0x66, 0xd5, 0x97, 0x9d, 0xa6, 0xca, 0x67, 0xc4, 0x00, 0xef, 0xc2, 0x31, 0x92, 0xf5, 0xfa, 0x44, 0x85, 0x32, 0x88, 0xf1, 0x81, 0x14, 0x38, 0x70, 0xf3, 0x54, 0x02,
0x8d, 0x64, 0x98, 0xc8, 0xa4, 0xf2, 0x81, 0xb8, 0xc0, 0xa6, 0x48, 0x92, 0x49, 0xee, 0x87, 0x51, 0xdb, 0x21, 0x31, 0x66, 0x92, 0x69, 0xe5, 0xa5, 0xa7, 0x29, 0xf3, 0x19, 0x3e, 0xc0, 0x7b, 0x70,
0x30, 0xd0, 0x02, 0x4a, 0x26, 0x91, 0x0e, 0xd8, 0xa6, 0xf8, 0xf2, 0xff, 0xb8, 0xaf, 0x61, 0xb8, 0x23, 0x1e, 0x26, 0x52, 0x89, 0x7c, 0xc8, 0x0d, 0x58, 0x17, 0x49, 0x52, 0xd1, 0xfd, 0x30, 0x0c,
0xc9, 0x24, 0xcc, 0x8f, 0x84, 0x65, 0x3f, 0xfe, 0x28, 0x46, 0xe4, 0xc7, 0xc6, 0x08, 0xe9, 0x24, 0x06, 0x4a, 0x40, 0x49, 0x45, 0xd2, 0x02, 0x53, 0x17, 0x5f, 0xfe, 0x1f, 0xf6, 0x1a, 0x84, 0x9b,
0x51, 0x14, 0xfb, 0x1a, 0x2e, 0x9d, 0xc4, 0x88, 0x02, 0x68, 0x56, 0x0c, 0xf6, 0x86, 0x84, 0x18, 0x54, 0xc4, 0xbc, 0x90, 0x58, 0xfa, 0xe3, 0x0f, 0x63, 0x44, 0x76, 0x6a, 0x8c, 0x10, 0x4e, 0x12,
0x7c, 0xa0, 0x2e, 0xb6, 0x1e, 0x76, 0x33, 0x1d, 0xc6, 0x47, 0x51, 0xec, 0x1c, 0x89, 0xcc, 0x99, 0x46, 0xb1, 0x6f, 0xc0, 0xe8, 0x04, 0x8f, 0x30, 0x80, 0xa6, 0xe5, 0x41, 0xef, 0x90, 0x80, 0x07,
0x04, 0x7f, 0x0c, 0xab, 0xe9, 0x41, 0x39, 0x8b, 0xe4, 0xd7, 0x30, 0x14, 0xc2, 0x84, 0x52, 0xfb, 0x1b, 0x48, 0xc3, 0x56, 0xc3, 0x6e, 0xaa, 0xc3, 0xf8, 0x28, 0x8c, 0x9d, 0x13, 0x91, 0x39, 0x15,
0x10, 0x58, 0x84, 0xe9, 0xdd, 0xbd, 0xfd, 0x27, 0xd5, 0x4d, 0x9a, 0xca, 0xae, 0xff, 0x25, 0x0f, 0xe1, 0x8f, 0x61, 0x2d, 0x39, 0x28, 0xa7, 0xa1, 0xfc, 0x1a, 0x86, 0x42, 0x90, 0x50, 0x2a, 0x2f,
0xb9, 0xed, 0x03, 0xf4, 0x43, 0x98, 0x14, 0x9f, 0x1a, 0xc6, 0x7c, 0x89, 0xb1, 0xc7, 0x7d, 0xb4, 0x84, 0x45, 0xc8, 0xef, 0xed, 0x1f, 0x3c, 0xa9, 0x6d, 0x91, 0x54, 0x76, 0xe3, 0x2f, 0x59, 0xc8,
0xc0, 0xcb, 0x9f, 0xfe, 0xf9, 0xef, 0x5f, 0xe4, 0x6e, 0xe0, 0x6b, 0x95, 0xb3, 0xb7, 0xdd, 0xce, 0xec, 0x1c, 0xa2, 0x1f, 0xc3, 0x2c, 0x7f, 0x83, 0x98, 0xf2, 0x44, 0x63, 0x4e, 0x7b, 0xcd, 0xc0,
0xe0, 0xc4, 0xad, 0x9c, 0x9e, 0x55, 0xf8, 0x9b, 0xf0, 0x6d, 0xeb, 0x35, 0x74, 0x00, 0x79, 0xf6, 0x2b, 0x9f, 0xfe, 0xf9, 0xef, 0x5f, 0x64, 0x6e, 0xe0, 0x6b, 0xd5, 0xf1, 0xdb, 0x76, 0x77, 0x78,
0x21, 0x22, 0xf5, 0x33, 0x8d, 0x9d, 0xfe, 0x31, 0x03, 0xdb, 0x5c, 0xf2, 0x02, 0xbe, 0xaa, 0x4b, 0x6a, 0x57, 0xcf, 0xc6, 0x55, 0x76, 0x27, 0x7c, 0xd7, 0x78, 0x0d, 0x1d, 0x42, 0x96, 0xbe, 0x50,
0x1e, 0x0c, 0x03, 0x26, 0xb7, 0x01, 0x45, 0xed, 0x7b, 0x04, 0xba, 0xf0, 0x03, 0x8e, 0x7d, 0xf1, 0x24, 0xbe, 0xdf, 0x98, 0xc9, 0xaf, 0x1c, 0xd8, 0x64, 0x94, 0x97, 0xf0, 0x55, 0x95, 0xf2, 0x70,
0xb7, 0x0e, 0x7c, 0x85, 0x69, 0xdb, 0x78, 0xd1, 0x4b, 0x6a, 0x1b, 0xf5, 0xcf, 0x93, 0xda, 0x6a, 0xe4, 0x53, 0xba, 0x4d, 0x28, 0x2a, 0x0f, 0x15, 0xe8, 0xc2, 0x97, 0x1d, 0xf3, 0xe2, 0x47, 0x10,
0x3d, 0x6b, 0xb3, 0xb6, 0xc1, 0x8b, 0x1e, 0xd3, 0xb6, 0x2f, 0xbf, 0x90, 0x34, 0x03, 0x74, 0xdb, 0x7c, 0x85, 0x4a, 0xdb, 0x7c, 0xd1, 0x8f, 0x4b, 0x1b, 0x36, 0xd6, 0xe3, 0xd2, 0x2a, 0xcd, 0x6c,
0xd0, 0x70, 0xd7, 0x5b, 0xcb, 0xf6, 0x6a, 0x3a, 0x83, 0x44, 0xba, 0xc3, 0x91, 0x6e, 0xe2, 0x1b, 0xbd, 0xb4, 0xfe, 0x8b, 0x3e, 0x95, 0x76, 0x20, 0x9e, 0x4e, 0x5a, 0x3e, 0xba, 0xad, 0xe9, 0xc4,
0x3a, 0x52, 0x33, 0xe4, 0xa3, 0x80, 0xeb, 0x27, 0x30, 0xc9, 0x3b, 0x65, 0xe8, 0x50, 0xfd, 0xb0, 0xab, 0x3d, 0x67, 0x73, 0x2d, 0x19, 0x41, 0x70, 0xba, 0xc3, 0x38, 0xdd, 0xc4, 0x37, 0x54, 0x4e,
0x0d, 0xad, 0xbc, 0x94, 0xf3, 0x8d, 0xf5, 0xd8, 0xf0, 0x12, 0x47, 0x9b, 0xc7, 0xe5, 0x10, 0x8d, 0xad, 0x00, 0x8f, 0x30, 0xdc, 0x38, 0x85, 0x59, 0xd6, 0x29, 0x43, 0x47, 0xf2, 0xc3, 0xd4, 0xf4,
0x37, 0xcb, 0x28, 0xca, 0x23, 0xeb, 0x1b, 0xd6, 0xfa, 0xbf, 0x73, 0x30, 0xc9, 0x5b, 0x2a, 0x68, 0xf8, 0x12, 0xce, 0x37, 0xd2, 0x63, 0xc3, 0xcb, 0x8c, 0xdb, 0x22, 0x2e, 0x07, 0xdc, 0x58, 0xb3,
0x00, 0x10, 0xf5, 0x9e, 0x92, 0xfb, 0x1c, 0xe9, 0x66, 0x25, 0xf7, 0x39, 0xda, 0xb6, 0xc2, 0xb7, 0x8c, 0x70, 0x79, 0x64, 0x7c, 0xcb, 0xd8, 0xf8, 0x77, 0x06, 0x66, 0x59, 0x4b, 0x05, 0x0d, 0x01,
0x39, 0xf2, 0x12, 0x5e, 0x08, 0x91, 0xf9, 0x17, 0xd9, 0xca, 0x31, 0xe3, 0x62, 0x66, 0x7d, 0x0e, 0xc2, 0xde, 0x53, 0x7c, 0x9f, 0x13, 0xdd, 0xac, 0xf8, 0x3e, 0x27, 0xdb, 0x56, 0xf8, 0x36, 0xe3,
0x45, 0xad, 0x87, 0x84, 0x4c, 0x12, 0x63, 0x4d, 0xa8, 0xe4, 0x25, 0x30, 0x34, 0xa0, 0xf0, 0x5d, 0xbc, 0x8c, 0x97, 0x02, 0xce, 0xec, 0xa9, 0xb6, 0x7a, 0x42, 0xb1, 0xa8, 0x5a, 0x9f, 0x43, 0x51,
0x0e, 0x7a, 0x0b, 0x2f, 0xea, 0xc6, 0x15, 0xb8, 0x1e, 0xe7, 0x64, 0xc0, 0x3f, 0xa7, 0x25, 0x51, 0xe9, 0x21, 0x21, 0x1d, 0xc5, 0x48, 0x13, 0x2a, 0x6e, 0x04, 0x9a, 0x06, 0x14, 0xbe, 0xcb, 0x98,
0xbc, 0x8f, 0x84, 0xee, 0x1a, 0x44, 0x27, 0xdb, 0x51, 0xf6, 0xbd, 0xf1, 0x4c, 0xa9, 0x2a, 0x08, 0xde, 0xc2, 0x15, 0x55, 0xb9, 0x9c, 0xaf, 0xcb, 0x30, 0x29, 0xe3, 0x5f, 0x90, 0x92, 0x28, 0xda,
0xfc, 0x53, 0xca, 0xe9, 0x32, 0x4e, 0x65, 0xfb, 0xff, 0xb0, 0x2f, 0x6f, 0xe2, 0x6f, 0x36, 0x50, 0x47, 0x42, 0x77, 0x35, 0xa4, 0xe3, 0xed, 0x28, 0xf3, 0xde, 0x74, 0xa4, 0x44, 0x11, 0x38, 0xff,
0x00, 0x85, 0xb0, 0x9b, 0x83, 0x56, 0x4c, 0x95, 0x7e, 0x94, 0x06, 0xdb, 0xb7, 0x53, 0xe7, 0xa5, 0x33, 0x82, 0x69, 0x53, 0x4c, 0xa9, 0xfb, 0xff, 0xd0, 0x27, 0x39, 0xfe, 0x63, 0x0e, 0xe4, 0x43,
0x0a, 0x0f, 0xb8, 0x0a, 0xab, 0xf8, 0x66, 0xa8, 0x82, 0xfc, 0xdb, 0x90, 0x8a, 0x28, 0x68, 0x2b, 0x21, 0xe8, 0xe6, 0xa0, 0x55, 0x5d, 0xa5, 0x1f, 0xa6, 0xc1, 0xe6, 0xed, 0xc4, 0x79, 0x21, 0xc2,
0x6e, 0xab, 0xc5, 0x0c, 0xf1, 0x53, 0x5a, 0xd2, 0xeb, 0x4d, 0x1a, 0x74, 0xc7, 0xd8, 0x63, 0xd0, 0x03, 0x26, 0xc2, 0x1a, 0xbe, 0x19, 0x88, 0x20, 0x7e, 0x34, 0x52, 0xe5, 0x05, 0x6d, 0xd5, 0x6e,
0xfb, 0x3c, 0x36, 0x1e, 0xc7, 0x22, 0xf1, 0x5f, 0xe5, 0xf8, 0x77, 0xf1, 0x4a, 0x1a, 0xbe, 0xc7, 0xb7, 0xa9, 0x22, 0x7e, 0x4e, 0x4a, 0x7a, 0xb5, 0x49, 0x83, 0xee, 0x68, 0x7b, 0x0c, 0x6a, 0x9f,
0xf9, 0xe3, 0x2a, 0x88, 0xb6, 0x8c, 0x59, 0x85, 0x58, 0xd7, 0xc7, 0xac, 0x42, 0xbc, 0xab, 0x73, 0xc7, 0xc4, 0xd3, 0x50, 0x04, 0xff, 0x57, 0x19, 0xff, 0xbb, 0x78, 0x35, 0x89, 0xbf, 0xcb, 0xf0,
0xb1, 0x0a, 0x43, 0xce, 0xcf, 0x54, 0x78, 0x01, 0x10, 0x75, 0x6d, 0x90, 0xd1, 0xb8, 0x5a, 0x61, 0xa3, 0x22, 0xf0, 0xb6, 0x8c, 0x5e, 0x84, 0x48, 0xd7, 0x47, 0x2f, 0x42, 0xb4, 0xab, 0x73, 0xb1,
0x90, 0xbc, 0xf9, 0xa3, 0x0d, 0x1f, 0xfc, 0x90, 0x63, 0xdf, 0xc1, 0xcb, 0x69, 0xd8, 0x1d, 0xca, 0x08, 0x23, 0x86, 0x4f, 0x45, 0x78, 0x01, 0x10, 0x76, 0x6d, 0x90, 0x56, 0xb9, 0x4a, 0x61, 0x10,
0xcd, 0xfc, 0xfc, 0xf7, 0x13, 0x50, 0xfc, 0xc0, 0x6d, 0xf7, 0x02, 0xd2, 0x63, 0xcd, 0x68, 0x74, 0xb7, 0xfc, 0xc9, 0x86, 0x0f, 0x7e, 0xc8, 0x78, 0xdf, 0xc1, 0x2b, 0x49, 0xbc, 0xbb, 0x04, 0x9b,
0x0c, 0x93, 0x3c, 0xf2, 0x27, 0xdd, 0x5d, 0x6f, 0xa5, 0x24, 0xdd, 0x3d, 0xd6, 0x67, 0xc0, 0xf7, 0xfa, 0xf9, 0xef, 0x67, 0xa0, 0xf8, 0x81, 0xdd, 0xe9, 0xfb, 0x4e, 0x9f, 0x36, 0xa3, 0xd1, 0x09,
0x39, 0xf4, 0x6d, 0x6c, 0x87, 0xd0, 0xdd, 0x48, 0x7e, 0x85, 0xf7, 0x08, 0xd8, 0x96, 0x4f, 0x61, 0xcc, 0xb2, 0xc8, 0x1f, 0x77, 0x77, 0xb5, 0x95, 0x12, 0x77, 0xf7, 0x48, 0x9f, 0x01, 0xdf, 0x67,
0x4a, 0xf4, 0x04, 0x50, 0x42, 0x5a, 0xac, 0x77, 0x60, 0x2f, 0x9b, 0x27, 0x53, 0x6f, 0x99, 0x8e, 0xac, 0x6f, 0x63, 0x33, 0x60, 0xdd, 0x0b, 0xe9, 0x57, 0x59, 0x8f, 0x80, 0x6e, 0xf9, 0x0c, 0x72,
0xe5, 0x73, 0x66, 0x06, 0xf6, 0x23, 0x80, 0xa8, 0x09, 0x95, 0xb4, 0xef, 0x48, 0xcf, 0xca, 0x5e, 0xbc, 0x27, 0x80, 0x62, 0xd4, 0x22, 0xbd, 0x03, 0x73, 0x45, 0x3f, 0x99, 0x68, 0x65, 0x2a, 0x2f,
0x4d, 0x67, 0x90, 0xc0, 0xaf, 0x71, 0xe0, 0x7b, 0xf8, 0xb6, 0x11, 0xb8, 0x15, 0x2e, 0x60, 0xe0, 0x8f, 0x21, 0x53, 0x66, 0x3f, 0x01, 0x08, 0x9b, 0x50, 0x71, 0xfd, 0x4e, 0xf4, 0xac, 0xcc, 0xb5,
0x4d, 0x98, 0x60, 0xdf, 0xd5, 0x50, 0x22, 0xf4, 0x6b, 0x9f, 0xde, 0x6c, 0xdb, 0x34, 0x25, 0xa1, 0x64, 0x04, 0xc1, 0xf8, 0x35, 0xc6, 0xf8, 0x1e, 0xbe, 0xad, 0x65, 0xdc, 0x0e, 0x16, 0x50, 0xe6,
0xee, 0x71, 0xa8, 0x15, 0xbc, 0x64, 0x84, 0x62, 0xdf, 0xd7, 0x18, 0xc8, 0x10, 0x66, 0xd4, 0xe7, 0x2d, 0x98, 0xa1, 0x0f, 0x6e, 0x28, 0x16, 0xfa, 0x95, 0x37, 0x39, 0xd3, 0xd4, 0x4d, 0x09, 0x56,
0x34, 0x74, 0x2b, 0x61, 0xb3, 0xf8, 0xa7, 0x37, 0x7b, 0x25, 0x6d, 0x5a, 0x02, 0x3e, 0xe2, 0x80, 0xf7, 0x18, 0xab, 0x55, 0xbc, 0xac, 0x65, 0x45, 0x1f, 0xde, 0x28, 0x93, 0x11, 0xcc, 0xc9, 0x77,
0x18, 0xdf, 0x32, 0x1b, 0x55, 0xb2, 0x53, 0x50, 0x1a, 0x40, 0x7e, 0x31, 0x07, 0x13, 0x2c, 0x07, 0x36, 0x74, 0x2b, 0xa6, 0xb3, 0xe8, 0x9b, 0x9c, 0xb9, 0x9a, 0x34, 0x2d, 0x18, 0x3e, 0x62, 0x0c,
0x61, 0xb1, 0x3b, 0x2a, 0xdd, 0x92, 0x16, 0x1e, 0x69, 0x98, 0x24, 0x2d, 0x3c, 0x5a, 0xf5, 0x19, 0x31, 0xbe, 0xa5, 0x57, 0xaa, 0x40, 0x27, 0x4c, 0x49, 0x00, 0xf9, 0xe5, 0x02, 0xcc, 0xd0, 0x1c,
0x62, 0x37, 0xff, 0xcb, 0x35, 0xc2, 0xb9, 0xd8, 0x8e, 0x03, 0x28, 0x6a, 0x05, 0x1e, 0x32, 0x48, 0x84, 0xc6, 0xee, 0xb0, 0x74, 0x8b, 0x6b, 0x78, 0xa2, 0x61, 0x12, 0xd7, 0xf0, 0x64, 0xd5, 0xa7,
0x8c, 0xb7, 0x63, 0x92, 0xb1, 0xdb, 0x50, 0x1d, 0xe2, 0x55, 0x0e, 0x6a, 0xe3, 0xeb, 0x71, 0xd0, 0x89, 0xdd, 0xec, 0x27, 0x6d, 0x0e, 0xc3, 0xa2, 0x3b, 0xf6, 0xa1, 0xa8, 0x14, 0x78, 0x48, 0x43,
0x96, 0x60, 0x63, 0xa8, 0x3f, 0x86, 0x92, 0x5e, 0x09, 0x22, 0x83, 0xd0, 0x44, 0xbf, 0x27, 0x19, 0x31, 0xda, 0x8e, 0x89, 0xc7, 0x6e, 0x4d, 0x75, 0x88, 0xd7, 0x18, 0x53, 0x13, 0x5f, 0x8f, 0x32,
0x2b, 0x4c, 0x85, 0xa4, 0xc1, 0x69, 0xc2, 0xbf, 0xd3, 0x53, 0xbc, 0x0c, 0xfd, 0x13, 0x98, 0x96, 0x6d, 0x73, 0x34, 0xca, 0xf5, 0xa7, 0x50, 0x52, 0x2b, 0x41, 0xa4, 0x21, 0x1a, 0xeb, 0xf7, 0xc4,
0xf5, 0xa1, 0x69, 0xbf, 0xf1, 0x0e, 0x91, 0x69, 0xbf, 0x89, 0xe2, 0xd2, 0x90, 0x08, 0x70, 0x58, 0x63, 0x85, 0xae, 0x90, 0xd4, 0x38, 0x4d, 0xf0, 0x03, 0x3e, 0x89, 0x4b, 0xb9, 0x7f, 0x02, 0x79,
0x96, 0x07, 0xab, 0x00, 0x2d, 0x21, 0x69, 0x19, 0x91, 0x06, 0x19, 0xf5, 0x3c, 0xd2, 0x20, 0xb5, 0x51, 0x1f, 0xea, 0xf6, 0x1b, 0xed, 0x10, 0xe9, 0xf6, 0x1b, 0x2b, 0x2e, 0x35, 0x89, 0x00, 0x63,
0x1a, 0x64, 0x2c, 0xe4, 0x31, 0x09, 0xe4, 0x5d, 0x56, 0x09, 0x3e, 0x4a, 0x91, 0xa8, 0x47, 0x43, 0x4b, 0xf3, 0x60, 0x19, 0xa0, 0x05, 0x4b, 0x52, 0x46, 0x24, 0xb1, 0x0c, 0x7b, 0x1e, 0x49, 0x2c,
0x3c, 0x8e, 0x45, 0xa2, 0x62, 0x8e, 0xba, 0x8c, 0x5f, 0x31, 0xa0, 0xca, 0x50, 0x88, 0x7e, 0x02, 0x95, 0x1a, 0x64, 0x2a, 0xcb, 0x13, 0xc7, 0x17, 0xb6, 0x2c, 0x13, 0x7c, 0x94, 0x40, 0x51, 0x8d,
0x10, 0x15, 0xb3, 0xc9, 0xe7, 0xd8, 0xd8, 0x11, 0x4b, 0x3e, 0xc7, 0xe6, 0x7a, 0xd8, 0xe0, 0xc1, 0x86, 0x78, 0x1a, 0x8a, 0xe0, 0x8a, 0x19, 0xd7, 0x15, 0xfc, 0x8a, 0x86, 0xab, 0x08, 0x85, 0xe8,
0x11, 0xb8, 0xf8, 0xa3, 0x1a, 0x06, 0xff, 0x4b, 0x0b, 0xd0, 0x68, 0xf1, 0x8b, 0x5e, 0x37, 0x43, 0x67, 0x00, 0x61, 0x31, 0x1b, 0xbf, 0x8e, 0xb5, 0x1d, 0xb1, 0xf8, 0x75, 0xac, 0xaf, 0x87, 0x35,
0x18, 0x9b, 0x6d, 0xf6, 0x1b, 0x97, 0x63, 0x4e, 0x8d, 0x9e, 0x91, 0x5e, 0x4d, 0xbe, 0x64, 0xf0, 0x1e, 0x1c, 0x32, 0xe7, 0xbf, 0xb6, 0xa1, 0xec, 0x7f, 0x65, 0x00, 0x9a, 0x2c, 0x7e, 0xd1, 0xeb,
0x9c, 0x69, 0xf6, 0x99, 0x05, 0xb3, 0xb1, 0xf2, 0x19, 0x3d, 0x48, 0x39, 0xe7, 0x44, 0xc3, 0xce, 0x7a, 0x16, 0xda, 0x66, 0x9b, 0xf9, 0xc6, 0xe5, 0x90, 0x13, 0xa3, 0x67, 0x28, 0x57, 0x8b, 0x2d,
0x7e, 0x78, 0x21, 0x5f, 0x6a, 0xc6, 0xa2, 0xdd, 0x0a, 0x95, 0xad, 0x7d, 0x4e, 0x93, 0xa6, 0x78, 0x19, 0x3e, 0xa7, 0x92, 0x7d, 0x66, 0xc0, 0x7c, 0xa4, 0x7c, 0x46, 0x0f, 0x12, 0xce, 0x39, 0xd6,
0xcd, 0x8d, 0x52, 0x00, 0x46, 0xba, 0x7e, 0xf6, 0xa3, 0x8b, 0x19, 0x2f, 0x71, 0x5a, 0x51, 0x02, 0xb0, 0x33, 0x1f, 0x5e, 0x88, 0x97, 0x98, 0xb1, 0x28, 0x56, 0x21, 0xb3, 0xb5, 0xcf, 0x49, 0xd2,
0x47, 0xdd, 0x42, 0x96, 0xea, 0x26, 0xb7, 0x88, 0x37, 0x0d, 0x4d, 0x6e, 0x91, 0xa8, 0xf3, 0xd3, 0x14, 0xad, 0xb9, 0x51, 0x02, 0x83, 0x89, 0xae, 0x9f, 0xf9, 0xe8, 0x62, 0xc4, 0x4b, 0x9c, 0x56,
0xdc, 0x82, 0x55, 0xbd, 0x9a, 0x27, 0xca, 0x82, 0x3e, 0x0d, 0x72, 0xbc, 0x27, 0x26, 0xba, 0x01, 0x98, 0xc0, 0x11, 0xb7, 0x10, 0xa5, 0xba, 0xce, 0x2d, 0xa2, 0x4d, 0x43, 0x9d, 0x5b, 0xc4, 0xea,
0x63, 0x21, 0x23, 0x4f, 0x54, 0xe5, 0x3c, 0x4a, 0x91, 0x78, 0x81, 0x27, 0x26, 0xbb, 0x01, 0x69, 0xfc, 0x24, 0xb7, 0xa0, 0x55, 0xaf, 0xe2, 0x89, 0xa2, 0xa0, 0x4f, 0x62, 0x39, 0xdd, 0x13, 0x63,
0x9e, 0xc8, 0x51, 0x35, 0x4f, 0x8c, 0xaa, 0x6f, 0x93, 0x27, 0x8e, 0xb4, 0x44, 0x4d, 0x9e, 0x38, 0xdd, 0x80, 0xa9, 0x2c, 0x43, 0x4f, 0x94, 0xe5, 0x3c, 0x4a, 0xa0, 0x78, 0x81, 0x27, 0xc6, 0xbb,
0x5a, 0xc0, 0xa7, 0x9d, 0x2d, 0x07, 0x8f, 0x79, 0xe2, 0xbc, 0xa1, 0x5a, 0x47, 0x6f, 0xa4, 0xd8, 0x01, 0x49, 0x9e, 0xc8, 0xb8, 0x2a, 0x9e, 0x18, 0x56, 0xdf, 0x3a, 0x4f, 0x9c, 0x68, 0x89, 0xea,
0xd4, 0xd8, 0x6e, 0xb5, 0xdf, 0xbc, 0x24, 0xf7, 0x78, 0x0f, 0x10, 0xa7, 0xa1, 0x3c, 0xe0, 0x37, 0x3c, 0x71, 0xb2, 0x80, 0x4f, 0x3a, 0x5b, 0xc6, 0x3c, 0xe2, 0x89, 0x8b, 0x9a, 0x6a, 0x1d, 0xbd,
0x16, 0x2c, 0x98, 0xca, 0x7d, 0x94, 0x02, 0x96, 0xd2, 0xab, 0xb5, 0xd7, 0x2e, 0xcb, 0x7e, 0x09, 0x91, 0xa0, 0x53, 0x6d, 0xbb, 0xd5, 0x7c, 0xf3, 0x92, 0xd8, 0xd3, 0x3d, 0x80, 0x9f, 0x86, 0xf4,
0xbb, 0x85, 0x3e, 0xb1, 0x51, 0xfa, 0xc3, 0xdf, 0x56, 0xac, 0x2f, 0xe9, 0x7f, 0x7f, 0xa5, 0xff, 0x80, 0xdf, 0x18, 0xb0, 0xa4, 0x2b, 0xf7, 0x51, 0x02, 0xb3, 0x84, 0x5e, 0xad, 0xb9, 0x7e, 0x59,
0x1d, 0x4d, 0xf1, 0x3f, 0x1d, 0x7f, 0xfb, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x38, 0xf6, 0x99, 0xf4, 0x4b, 0xe8, 0x2d, 0xf0, 0x89, 0xcd, 0xd2, 0x1f, 0xfe, 0xb6, 0x6a, 0x7c, 0x45, 0xfe, 0xfd,
0x0f, 0xc1, 0x2e, 0x00, 0x00, 0x95, 0xfc, 0x3b, 0xce, 0xb1, 0xdf, 0x94, 0xbf, 0xfd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x29,
0x32, 0x55, 0x3b, 0xda, 0x2e, 0x00, 0x00,
} }

View File

@ -574,6 +574,10 @@ message WatchCreateRequest {
} }
// filters filter the events at server side before it sends back to the watcher. // filters filter the events at server side before it sends back to the watcher.
repeated FilterType filters = 5; repeated FilterType filters = 5;
// If prev_kv is set, created watcher gets the previous KV before the event happens.
// If the previous KV is already compacted, nothing will be returned.
bool prev_kv = 6;
} }
message WatchCancelRequest { message WatchCancelRequest {

View File

@ -551,4 +551,4 @@ func (s *EtcdServer) processInternalRaftRequest(ctx context.Context, r pb.Intern
} }
// Watchable returns a watchable interface attached to the etcdserver. // Watchable returns a watchable interface attached to the etcdserver.
func (s *EtcdServer) Watchable() mvcc.Watchable { return s.KV() } func (s *EtcdServer) Watchable() mvcc.WatchableKV { return s.KV() }

View File

@ -89,6 +89,8 @@ type Event struct {
// A DELETE/EXPIRE event contains the deleted key with // A DELETE/EXPIRE event contains the deleted key with
// its modification revision set to the revision of deletion. // its modification revision set to the revision of deletion.
Kv *KeyValue `protobuf:"bytes,2,opt,name=kv" json:"kv,omitempty"` Kv *KeyValue `protobuf:"bytes,2,opt,name=kv" json:"kv,omitempty"`
// prev_kv holds the key-value pair before the event happens.
PrevKv *KeyValue `protobuf:"bytes,3,opt,name=prev_kv,json=prevKv" json:"prev_kv,omitempty"`
} }
func (m *Event) Reset() { *m = Event{} } func (m *Event) Reset() { *m = Event{} }
@ -181,6 +183,16 @@ func (m *Event) MarshalTo(data []byte) (int, error) {
} }
i += n1 i += n1
} }
if m.PrevKv != nil {
data[i] = 0x1a
i++
i = encodeVarintKv(data, i, uint64(m.PrevKv.Size()))
n2, err := m.PrevKv.MarshalTo(data[i:])
if err != nil {
return 0, err
}
i += n2
}
return i, nil return i, nil
} }
@ -247,6 +259,10 @@ func (m *Event) Size() (n int) {
l = m.Kv.Size() l = m.Kv.Size()
n += 1 + l + sovKv(uint64(l)) n += 1 + l + sovKv(uint64(l))
} }
if m.PrevKv != nil {
l = m.PrevKv.Size()
n += 1 + l + sovKv(uint64(l))
}
return n return n
} }
@ -532,6 +548,39 @@ func (m *Event) Unmarshal(data []byte) error {
return err return err
} }
iNdEx = postIndex iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowKv
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := data[iNdEx]
iNdEx++
msglen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthKv
}
postIndex := iNdEx + msglen
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.PrevKv == nil {
m.PrevKv = &KeyValue{}
}
if err := m.PrevKv.Unmarshal(data[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipKv(data[iNdEx:]) skippy, err := skipKv(data[iNdEx:])
@ -659,23 +708,24 @@ var (
) )
var fileDescriptorKv = []byte{ var fileDescriptorKv = []byte{
// 274 bytes of a gzipped FileDescriptorProto // 292 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x44, 0x90, 0xc1, 0x4a, 0xc3, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x90, 0xc1, 0x4a, 0xc3, 0x40,
0x10, 0x86, 0xbb, 0x4d, 0x93, 0xd6, 0x69, 0xa9, 0x61, 0x09, 0xb8, 0x78, 0x28, 0x31, 0x17, 0x05, 0x10, 0x86, 0xbb, 0x4d, 0x9b, 0xd4, 0x69, 0xa9, 0x61, 0x09, 0x18, 0x3c, 0x94, 0x98, 0x8b, 0x8a,
0x21, 0x42, 0x7d, 0x03, 0x31, 0x27, 0x3d, 0xc8, 0x12, 0xbd, 0x4a, 0x1a, 0x87, 0x52, 0xd2, 0x76, 0x10, 0xa1, 0xbe, 0x81, 0x98, 0x53, 0x3d, 0x48, 0x88, 0x5e, 0x4b, 0x1a, 0x87, 0x52, 0xd2, 0x76,
0x43, 0x1a, 0x17, 0xf3, 0x52, 0x3e, 0x47, 0x8f, 0x7d, 0x04, 0xf5, 0x49, 0xdc, 0xcc, 0x9a, 0x7a, 0x43, 0x1a, 0x17, 0xf2, 0x3c, 0xde, 0x7d, 0x8e, 0x1e, 0xfb, 0x08, 0xea, 0x93, 0xb8, 0x3b, 0x6b,
0x98, 0x65, 0xe6, 0xff, 0xfe, 0x65, 0xff, 0x59, 0x18, 0x15, 0x3a, 0x2e, 0x2b, 0x55, 0x2b, 0xee, 0xea, 0xc9, 0xc3, 0x2c, 0x33, 0xff, 0xff, 0xb1, 0xfb, 0xcf, 0xc2, 0xa0, 0x90, 0x51, 0x59, 0x89,
0x6d, 0x74, 0x9e, 0x97, 0x8b, 0xf3, 0x60, 0xa9, 0x96, 0x8a, 0xa4, 0x9b, 0xb6, 0xb3, 0x34, 0xfa, 0x5a, 0x70, 0x7b, 0x23, 0xf3, 0xbc, 0x5c, 0x9c, 0x7b, 0x4b, 0xb1, 0x14, 0x24, 0xdd, 0xea, 0xce,
0x64, 0x30, 0x7a, 0xc0, 0xe6, 0x25, 0x5b, 0xbf, 0x23, 0xf7, 0xc1, 0x29, 0xb0, 0x11, 0x2c, 0x64, 0xb8, 0xe1, 0x07, 0x83, 0xc1, 0x0c, 0x9b, 0x97, 0x6c, 0xfd, 0x86, 0xdc, 0x05, 0xab, 0xc0, 0xc6,
0x57, 0x13, 0xd9, 0xb6, 0xfc, 0x12, 0x4e, 0xf3, 0x0a, 0xb3, 0x1a, 0x5f, 0x2b, 0xd4, 0xab, 0xdd, 0x67, 0x01, 0xbb, 0x1a, 0x25, 0xba, 0xe5, 0x97, 0x70, 0x9a, 0x57, 0x98, 0xd5, 0x38, 0xaf, 0x50,
0x4a, 0x6d, 0x45, 0xdf, 0x50, 0x47, 0x4e, 0xad, 0x2c, 0xff, 0x54, 0x7e, 0x01, 0x93, 0x8d, 0x7a, 0xae, 0x76, 0x2b, 0xb1, 0xf5, 0xbb, 0xca, 0xb5, 0x92, 0xb1, 0x91, 0x93, 0x5f, 0x95, 0x5f, 0xc0,
0xfb, 0x77, 0x39, 0xe4, 0x1a, 0x1b, 0xed, 0x68, 0x11, 0x30, 0xd4, 0x58, 0x11, 0x1d, 0x10, 0xed, 0x68, 0x23, 0x5e, 0xff, 0x28, 0x8b, 0xa8, 0xa1, 0xd2, 0x8e, 0x88, 0x0f, 0x8e, 0xc4, 0x8a, 0xdc,
0x46, 0x1e, 0x80, 0xab, 0xdb, 0x00, 0xc2, 0xa5, 0x97, 0xed, 0xd0, 0xaa, 0x6b, 0xcc, 0x76, 0x28, 0x1e, 0xb9, 0xed, 0xc8, 0x3d, 0xe8, 0x4b, 0x1d, 0xc0, 0xef, 0xd3, 0xcb, 0x66, 0xd0, 0xea, 0x1a,
0x3c, 0x72, 0xdb, 0x21, 0xfa, 0x00, 0x37, 0xd1, 0xb8, 0xad, 0xf9, 0x35, 0x0c, 0xea, 0xa6, 0x44, 0xb3, 0x1d, 0xfa, 0x36, 0xd1, 0x66, 0x08, 0xdf, 0x19, 0xf4, 0x63, 0x89, 0xdb, 0x9a, 0xdf, 0x40,
0x4a, 0x3b, 0x9d, 0x9f, 0xc5, 0x76, 0xcd, 0x98, 0xa0, 0x3d, 0x53, 0x83, 0x25, 0x99, 0x78, 0x08, 0xaf, 0x6e, 0x4a, 0xa4, 0xb8, 0xe3, 0xe9, 0x59, 0x64, 0xf6, 0x8c, 0xc8, 0x34, 0x67, 0xaa, 0xec,
0xfd, 0x42, 0x53, 0xf4, 0xf1, 0xdc, 0xef, 0xac, 0xdd, 0xde, 0xd2, 0xb0, 0x28, 0x84, 0x93, 0xe3, 0x84, 0x20, 0x1e, 0x40, 0xb7, 0x90, 0x94, 0x7d, 0x38, 0x75, 0x5b, 0xb4, 0x5d, 0x3c, 0x51, 0x1e,
0x25, 0x3e, 0x04, 0xe7, 0xe9, 0x39, 0xf5, 0x7b, 0x1c, 0xc0, 0xbb, 0x4f, 0x1e, 0x93, 0x34, 0xf1, 0xbf, 0x06, 0xa7, 0x54, 0xf1, 0xe7, 0x0a, 0xb3, 0xfe, 0xc1, 0x6c, 0x0d, 0xcc, 0x64, 0x18, 0xc0,
0xd9, 0x5d, 0xb0, 0xff, 0x9e, 0xf5, 0x0e, 0xa6, 0xf6, 0x3f, 0x33, 0x76, 0x30, 0xf5, 0x65, 0x6a, 0xc9, 0xf1, 0x7e, 0xee, 0x80, 0xf5, 0xf4, 0x9c, 0xba, 0x1d, 0x0e, 0x60, 0x3f, 0xc4, 0x8f, 0x71,
0xe1, 0xd1, 0x3f, 0xde, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0x71, 0xd2, 0x34, 0xa9, 0x71, 0x01, 0x1a, 0xbb, 0xec, 0xde, 0xdb, 0x7f, 0x4d, 0x3a, 0x07, 0x55, 0xfb, 0xef, 0x09, 0x3b, 0xa8, 0xfa,
0x00, 0x00, 0x54, 0xb5, 0xb0, 0xe9, 0xcf, 0xef, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0xbb, 0x86, 0x36, 0x07,
0x9d, 0x01, 0x00, 0x00,
} }

View File

@ -43,4 +43,7 @@ message Event {
// A DELETE/EXPIRE event contains the deleted key with // A DELETE/EXPIRE event contains the deleted key with
// its modification revision set to the revision of deletion. // its modification revision set to the revision of deletion.
KeyValue kv = 2; KeyValue kv = 2;
// prev_kv holds the key-value pair before the event happens.
KeyValue prev_kv = 3;
} }