Commit bd668bac authored by harrylee's avatar harrylee

add data swap method

parent 44887f8c
...@@ -301,77 +301,84 @@ func (client *JSONClient) QueryBlockInfo(start, end int64, isDetail bool) (*Bloc ...@@ -301,77 +301,84 @@ func (client *JSONClient) QueryBlockInfo(start, end int64, isDetail bool) (*Bloc
return &res, nil return &res, nil
} }
// 调用chaincode // 发布跨链事件
func (client *JSONClient) Invoke(requst *Request, privateKey string) (*Response, error) { func (client *JSONClient) EmitDataSwapInterchainEvent(dstServiceID, args, argscb, argsrb string, privateKey string) (*Response, error) {
// FIXME 这里需完善 // FIXME 这里需完善 funcName="interchainGet,interchainSet," txType=0 表示是存在类数据交换
if requst.Exec == storage.StorageX { tx, err := broker.EmitInterchainEvent("", dstServiceID, "interchainGet,interchainSet,", args, argsrb, argsrb, 0)
switch requst.Fcn {
case "set", "ContentStorage":
tx, err := storage.CreateContentStorageTx(client.prefix, 0, string(requst.Args[0]), nil, string(requst.Args[1]))
if err != nil { if err != nil {
return nil, err return nil, err
} }
return client.SendTransactionSync(privateKey, tx) return client.SendTransactionSync(privateKey, tx)
}
}
return nil, fmt.Errorf("not matching execution or method!")
} }
// TODO 执行请求 // TODO 执行请求
func (client *JSONClient) Execute(requst *Request,privateKey string) (*Response, error) { func (client *JSONClient) Execute(requst *Request, privateKey string) (*Response, error) {
if requst.Exec == broker.BrokerX{ if requst.Exec == broker.BrokerX {
switch requst.Fcn { switch requst.Fcn {
case "invokeInterchain": case "invokeInterchain":
srcChainServiceID := string(requst.Args[0]) srcChainServiceID := string(requst.Args[0])
sequenceNum,err := strconv.ParseUint(string(requst.Args[1]), 10, 64) sequenceNum, err := strconv.ParseUint(string(requst.Args[1]), 10, 64)
if err != nil { if err != nil {
return nil,fmt.Errorf("cannot parse %s to uint64", string(requst.Args[1])) return nil, fmt.Errorf("cannot parse %s to uint64", string(requst.Args[1]))
} }
targetCID := string(requst.Args[2]) targetCID := string(requst.Args[2])
reqType, err := strconv.ParseUint(string(requst.Args[3]), 10, 64) reqType, err := strconv.ParseUint(string(requst.Args[3]), 10, 64)
if err != nil { if err != nil {
return nil,fmt.Errorf("cannot parse %s to uint64", string(requst.Args[3])) return nil, fmt.Errorf("cannot parse %s to uint64", string(requst.Args[3]))
} }
if tx, err := broker.UpdateIndex("",srcChainServiceID, targetCID,sequenceNum, reqType,nil); err == nil { if tx, err := broker.UpdateIndex("", srcChainServiceID, targetCID, sequenceNum, reqType, nil); err == nil {
resp,err:=client.SendTransactionSync(privateKey,tx) resp, err := client.SendTransactionSync(privateKey, tx)
if err !=nil { if err != nil {
return resp,err return resp, err
} }
//splitedCID[1]就是合约名称 //splitedCID[1]就是合约名称
splitedCID := strings.Split(targetCID, "&") splitedCID := strings.Split(targetCID, "&")
if len(splitedCID) != 2 { if len(splitedCID) != 2 {
return nil,fmt.Errorf("Target chaincode id %s is not valid", targetCID) return nil, fmt.Errorf("Target chaincode id %s is not valid", targetCID)
} }
callFunc := &CallFunc{} callFunc := &CallFunc{}
if err := json.Unmarshal(requst.Args[4], callFunc); err != nil { if err := json.Unmarshal(requst.Args[4], callFunc); err != nil {
return nil,fmt.Errorf("unmarshal call func failed for %s", requst.Args[4]) return nil, fmt.Errorf("unmarshal call func failed for %s", requst.Args[4])
} }
// 调用相应链码, (链码名称,参数,通道名称) // 调用相应链码, (链码名称,参数,通道名称)
if splitedCID[1] == storage.StorageX{ if splitedCID[1] == storage.StorageX {
//interchainGet方法是在sdk封装的,用于支持跨链之前数据的查询 //interchainGet方法是在sdk封装的,用于支持跨链之前数据的查询
switch callFunc.Func { switch callFunc.Func {
case "interchainGet": case "interchainGet":
return client.InterChainGet(string(callFunc.Args[0])) response, err := client.InterChainGet(string(callFunc.Args[0]))
if err != nil {
return resp, err
}
//携带TXhash
response.Message = resp.Message
return response, err
case "interchainSet":
//跨链set kv
return client.InterChainSet(string(callFunc.Args[0]), string(callFunc.Args[1]), privateKey)
} }
}else{ } else {
return nil,fmt.Errorf("can't support exec %s",splitedCID[1]) return nil, fmt.Errorf("can't support exec %s", splitedCID[1])
} }
} }
} }
} }
return nil, nil return nil, fmt.Errorf("not matching execution or method!")
} }
//包装适配跨链插件调用
func (client *JSONClient) InterChainSet(key,value string) (*Response, error) {
//包装适配跨链插件调用
return nil, nil func (client *JSONClient) InterChainSet(key, value, privateKey string) (*Response, error) {
tx, err := storage.CreateContentStorageTx("", 0, key, nil, value)
if err != nil {
return nil, err
}
resp, err := client.SendTransactionSync(privateKey, tx)
return resp, err
} }
//包装适配跨链插件调用 //包装适配跨链插件调用
func (client *JSONClient) InterChainGet(key string) (*Response, error) { func (client *JSONClient) InterChainGet(key string) (*Response, error) {
jsonraw, err := json.Marshal(&types.QueryStorage{TxHash: key}) jsonraw, err := json.Marshal(&types.QueryStorage{TxHash: key})
...@@ -388,9 +395,9 @@ func (client *JSONClient) InterChainGet(key string) (*Response, error) { ...@@ -388,9 +395,9 @@ func (client *JSONClient) InterChainGet(key string) (*Response, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
storage :=data.(*types.Storage) storage := data.(*types.Storage)
//这里暂时就去明文存证内容 //这里暂时就去明文存证内容
resp := &Response{OK:true,Message:key,Data:storage.GetContentStorage().GetContent()} resp := &Response{OK: true, Message: key, Data: []byte(storage.GetContentStorage().GetValue())}
return resp, nil return resp, nil
} }
......
...@@ -9,18 +9,8 @@ import ( ...@@ -9,18 +9,8 @@ import (
) )
// 构造发布跨链交易事件交易 // 构造发布跨链交易事件交易
func EmitInterchainEvent(paraName, dstServiceID, funcName string, args []string, txType uint64) (*types.Transaction, error) { func EmitInterchainEvent(paraName, dstServiceID, funcName string, args,argscb,argsrb string, txType uint64) (*types.Transaction, error) {
//目的链ID,固定格式0x000001 payload := &types.BrokerAction{Ty: TyEmitInterchainEventAction, Value: &types.BrokerAction_EmitInterchainEvent{EmitInterchainEvent: &types.InterchainEvent{DstServiceID: dstServiceID, Type: txType, Func: funcName, Args: args,Argscb:argscb,Argsrb:argsrb}}}
//string dstServiceID = 2;
////源链ID,固定格式0x000002
//string srcServiceID = 3;
////跨链交易类型 0表示storage,1表示coins,2表示token......
//uint64 type =4;
////调用方法
//string func = 5;
////参数列表
//repeated string args = 6;
payload := &types.BrokerAction{Ty: TyEmitInterchainEventAction, Value: &types.BrokerAction_EmitInterchainEvent{EmitInterchainEvent: &types.InterchainEvent{DstServiceID: dstServiceID, Type: txType, Func: funcName, Args: args}}}
if paraName == "" { if paraName == "" {
tx := &types.Transaction{Execer: []byte(BrokerX), Payload: types.Encode(payload), Fee: 1e5, Nonce: rand.Int63n(time.Now().UnixNano()), To: Addr} tx := &types.Transaction{Execer: []byte(BrokerX), Payload: types.Encode(payload), Fee: 1e5, Nonce: rand.Int63n(time.Now().UnixNano()), To: Addr}
return tx, nil return tx, nil
...@@ -32,16 +22,6 @@ func EmitInterchainEvent(paraName, dstServiceID, funcName string, args []string, ...@@ -32,16 +22,6 @@ func EmitInterchainEvent(paraName, dstServiceID, funcName string, args []string,
// 构造更新Index交易 // 构造更新Index交易
func UpdateIndex(paraName, srcServiceID, dstServiceID string, sequenceNum, reqType uint64, response *types.Response) (*types.Transaction, error) { func UpdateIndex(paraName, srcServiceID, dstServiceID string, sequenceNum, reqType uint64, response *types.Response) (*types.Transaction, error) {
////当前链已经处理到的位置
//uint64 sequenceNum = 1;
////目的链服务ID,固定格式0x000001
//string dstServiceID = 2;
////源链ID,固定格式0x000002
//string srcServiceID = 3;
////请求类型 0表示信息流入 1表示信息流出 2表示回滚
//uint64 reqType =4;
////响应信息
//Response response = 5;
payload := &types.BrokerAction{Ty: TyUpdateIndexAction, Value: &types.BrokerAction_UpdateIndex{UpdateIndex: &types.UpdateIndex{DstServiceID: dstServiceID, SrcServiceID: srcServiceID, ReqType: reqType, SequenceNum: sequenceNum, Response: response}}} payload := &types.BrokerAction{Ty: TyUpdateIndexAction, Value: &types.BrokerAction_UpdateIndex{UpdateIndex: &types.UpdateIndex{DstServiceID: dstServiceID, SrcServiceID: srcServiceID, ReqType: reqType, SequenceNum: sequenceNum, Response: response}}}
if paraName == "" { if paraName == "" {
tx := &types.Transaction{Execer: []byte(BrokerX), Payload: types.Encode(payload), Fee: 1e5, Nonce: rand.Int63n(time.Now().UnixNano()), To: Addr} tx := &types.Transaction{Execer: []byte(BrokerX), Payload: types.Encode(payload), Fee: 1e5, Nonce: rand.Int63n(time.Now().UnixNano()), To: Addr}
...@@ -52,6 +32,3 @@ func UpdateIndex(paraName, srcServiceID, dstServiceID string, sequenceNum, reqTy ...@@ -52,6 +32,3 @@ func UpdateIndex(paraName, srcServiceID, dstServiceID string, sequenceNum, reqTy
} }
} }
func EmitInterchainSetEvent(){
}
...@@ -52,7 +52,6 @@ message UpdateIndex { ...@@ -52,7 +52,6 @@ message UpdateIndex {
//响应信息 //响应信息
Response response = 5; Response response = 5;
} }
// 跨链事件 // 跨链事件
message InterchainEvent { message InterchainEvent {
//索引值,这个有系统自动生成 //索引值,这个有系统自动生成
...@@ -63,12 +62,16 @@ message InterchainEvent { ...@@ -63,12 +62,16 @@ message InterchainEvent {
string srcServiceID = 3; string srcServiceID = 3;
//跨链交易类型 0表示storage,1表示coins,2表示token...... //跨链交易类型 0表示storage,1表示coins,2表示token......
uint64 type =4; uint64 type =4;
//调用方法 //方法集合分别表示 当前,回调,回滚方法 用,号分割 比如: "interchainGet,interchainSet,interchainRollback"
string func = 5; string func = 5;
//参数列表 //参数列表
repeated string args = 6; string args = 6;
//回调参数
string argscb =7;
//回滚参数
string argsrb =8;
//状态 0表示开始处理 1表示跨链成功 2表示跨链失败 //状态 0表示开始处理 1表示跨链成功 2表示跨链失败
int32 status = 7; // int32 status = 7;
} }
//ReceiptBrokerLog //ReceiptBrokerLog
message ReceiptBrokerLog{ message ReceiptBrokerLog{
......
...@@ -422,12 +422,14 @@ type InterchainEvent struct { ...@@ -422,12 +422,14 @@ type InterchainEvent struct {
SrcServiceID string `protobuf:"bytes,3,opt,name=srcServiceID,proto3" json:"srcServiceID,omitempty"` SrcServiceID string `protobuf:"bytes,3,opt,name=srcServiceID,proto3" json:"srcServiceID,omitempty"`
//跨链交易类型 0表示storage,1表示coins,2表示token...... //跨链交易类型 0表示storage,1表示coins,2表示token......
Type uint64 `protobuf:"varint,4,opt,name=type,proto3" json:"type,omitempty"` Type uint64 `protobuf:"varint,4,opt,name=type,proto3" json:"type,omitempty"`
//调用方法 //方法集合分别表示 当前,回调,回滚方法 用,号分割 比如: "interchainGet,interchainSet,interchainRollback"
Func string `protobuf:"bytes,5,opt,name=func,proto3" json:"func,omitempty"` Func string `protobuf:"bytes,5,opt,name=func,proto3" json:"func,omitempty"`
//参数列表 //参数列表
Args []string `protobuf:"bytes,6,rep,name=args,proto3" json:"args,omitempty"` Args string `protobuf:"bytes,6,opt,name=args,proto3" json:"args,omitempty"`
//状态 0表示开始处理 1表示跨链成功 2表示跨链失败 //回调参数
Status int32 `protobuf:"varint,7,opt,name=status,proto3" json:"status,omitempty"` Argscb string `protobuf:"bytes,7,opt,name=argscb,proto3" json:"argscb,omitempty"`
//回滚参数
Argsrb string `protobuf:"bytes,8,opt,name=argsrb,proto3" json:"argsrb,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -493,18 +495,25 @@ func (m *InterchainEvent) GetFunc() string { ...@@ -493,18 +495,25 @@ func (m *InterchainEvent) GetFunc() string {
return "" return ""
} }
func (m *InterchainEvent) GetArgs() []string { func (m *InterchainEvent) GetArgs() string {
if m != nil { if m != nil {
return m.Args return m.Args
} }
return nil return ""
} }
func (m *InterchainEvent) GetStatus() int32 { func (m *InterchainEvent) GetArgscb() string {
if m != nil { if m != nil {
return m.Status return m.Argscb
} }
return 0 return ""
}
func (m *InterchainEvent) GetArgsrb() string {
if m != nil {
return m.Argsrb
}
return ""
} }
//ReceiptBrokerLog //ReceiptBrokerLog
...@@ -1084,52 +1093,53 @@ func init() { ...@@ -1084,52 +1093,53 @@ func init() {
} }
var fileDescriptor_f209535e190f2bed = []byte{ var fileDescriptor_f209535e190f2bed = []byte{
// 711 bytes of a gzipped FileDescriptorProto // 724 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x4f, 0x4f, 0xdb, 0x4a, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x5f, 0x4f, 0xdb, 0x48,
0x10, 0x8f, 0x1d, 0x3b, 0x90, 0x49, 0x20, 0xbc, 0x85, 0x87, 0xac, 0x77, 0x78, 0x2f, 0xcf, 0xe2, 0x10, 0x8f, 0x1d, 0x3b, 0x24, 0x93, 0x40, 0xb8, 0x85, 0x43, 0xd6, 0x3d, 0xdc, 0x71, 0x16, 0x0f,
0x40, 0x5b, 0x89, 0x4a, 0x20, 0xb5, 0x55, 0xd5, 0x4b, 0x42, 0x91, 0x92, 0x0a, 0x28, 0xdd, 0xfe, 0xdc, 0x9d, 0xc4, 0x49, 0x20, 0xb5, 0x55, 0xd5, 0x97, 0x84, 0x22, 0x25, 0x15, 0x50, 0xba, 0xfd,
0x51, 0x7b, 0x5c, 0x9c, 0x21, 0x6c, 0x49, 0xd6, 0x66, 0xbd, 0x46, 0xf8, 0xa3, 0xf4, 0x9b, 0xf4, 0xa3, 0xf6, 0x71, 0xe3, 0x0c, 0x61, 0x4b, 0x62, 0x9b, 0xf5, 0x1a, 0xe1, 0x8f, 0xd2, 0x6f, 0xd2,
0xd4, 0x4b, 0xbf, 0x58, 0xb5, 0xeb, 0x4d, 0xe2, 0x04, 0xaa, 0xaa, 0x08, 0xf5, 0x12, 0xed, 0xfc, 0xa7, 0x7e, 0x91, 0x7e, 0x99, 0x6a, 0xff, 0x24, 0x71, 0x02, 0x55, 0x55, 0x84, 0xfa, 0x02, 0x3b,
0x66, 0x76, 0x67, 0xf2, 0x9b, 0xf9, 0x8d, 0xa1, 0x79, 0x2a, 0xe3, 0x0b, 0x94, 0x3b, 0x89, 0x8c, 0xbf, 0x99, 0xdd, 0x99, 0xfc, 0x66, 0x7e, 0x63, 0x68, 0x0d, 0x44, 0x72, 0x89, 0x62, 0x2f, 0x15,
0x55, 0x4c, 0x7c, 0x95, 0x27, 0x98, 0x86, 0x5f, 0x5d, 0x68, 0x76, 0x0d, 0xde, 0x89, 0x14, 0x8f, 0x89, 0x4c, 0x88, 0x2f, 0x8b, 0x14, 0xb3, 0xf0, 0xb3, 0x0b, 0xad, 0xae, 0xc6, 0x3b, 0x91, 0xe4,
0x05, 0xf9, 0x1f, 0x3c, 0x2e, 0xb8, 0x0a, 0x9c, 0xb6, 0xb3, 0xdd, 0xd8, 0x6d, 0xec, 0x98, 0xb0, 0x49, 0x4c, 0xfe, 0x06, 0x8f, 0xc7, 0x5c, 0x06, 0xce, 0xb6, 0xb3, 0xdb, 0xdc, 0x6f, 0xee, 0xe9,
0x9d, 0xbe, 0xe0, 0xaa, 0x57, 0xa1, 0xc6, 0x45, 0xba, 0xd0, 0x92, 0x38, 0xe4, 0xa9, 0x42, 0x79, 0xb0, 0xbd, 0x7e, 0xcc, 0x65, 0xaf, 0x42, 0xb5, 0x8b, 0x74, 0xa1, 0x2d, 0x70, 0xc4, 0x33, 0x89,
0x70, 0x8d, 0x91, 0x8a, 0x65, 0xe0, 0x9a, 0xe8, 0x4d, 0x1b, 0x4d, 0xe7, 0xbd, 0xbd, 0x0a, 0x5d, 0xe2, 0xe8, 0x06, 0x23, 0x99, 0x88, 0xc0, 0xd5, 0xd1, 0x5b, 0x36, 0x9a, 0x2e, 0x7a, 0x7b, 0x15,
0xbc, 0x40, 0xb6, 0xc0, 0x67, 0xd9, 0x80, 0xab, 0xa0, 0x6a, 0x6e, 0x36, 0xed, 0xcd, 0x8e, 0xc6, 0xba, 0x7c, 0x81, 0xec, 0x80, 0xcf, 0xf2, 0x21, 0x97, 0x41, 0x55, 0xdf, 0x6c, 0xd9, 0x9b, 0x1d,
0x7a, 0x15, 0x5a, 0x38, 0xc9, 0x2b, 0x58, 0xc7, 0x31, 0x57, 0x7d, 0xa1, 0x50, 0x46, 0xe7, 0x8c, 0x85, 0xf5, 0x2a, 0xd4, 0x38, 0xc9, 0x0b, 0xd8, 0xc0, 0x09, 0x97, 0xfd, 0x58, 0xa2, 0x88, 0x2e,
0x8b, 0x83, 0x2b, 0x14, 0x2a, 0xf0, 0xe6, 0xb2, 0x2d, 0x78, 0x7b, 0x15, 0x7a, 0xdb, 0x25, 0xf2, 0x18, 0x8f, 0x8f, 0xae, 0x31, 0x96, 0x81, 0xb7, 0x90, 0x6d, 0xc9, 0xdb, 0xab, 0xd0, 0xbb, 0x2e,
0x04, 0x1a, 0x59, 0x32, 0x60, 0x0a, 0xfb, 0x62, 0x80, 0xd7, 0x81, 0x6f, 0xde, 0x20, 0xf6, 0x8d, 0x91, 0x47, 0xd0, 0xcc, 0xd3, 0x21, 0x93, 0xd8, 0x8f, 0x87, 0x78, 0x13, 0xf8, 0xfa, 0x0d, 0x62,
0xf7, 0x33, 0x4f, 0xaf, 0x42, 0xcb, 0x81, 0x64, 0x15, 0x5c, 0x95, 0x07, 0xb5, 0xb6, 0xb3, 0xed, 0xdf, 0x78, 0x3b, 0xf7, 0xf4, 0x2a, 0xb4, 0x1c, 0x48, 0xd6, 0xc0, 0x95, 0x45, 0x50, 0xdb, 0x76,
0x53, 0x57, 0xe5, 0xdd, 0x25, 0xf0, 0xaf, 0xd8, 0x28, 0xc3, 0xf0, 0x05, 0x78, 0x9a, 0x16, 0xb2, 0x76, 0x7d, 0xea, 0xca, 0xa2, 0xbb, 0x02, 0xfe, 0x35, 0x1b, 0xe7, 0x18, 0x3e, 0x03, 0x4f, 0xd1,
0x01, 0xfe, 0xe9, 0xf5, 0x79, 0x7f, 0x60, 0x28, 0xab, 0xd3, 0xc2, 0x20, 0xff, 0x02, 0xb0, 0x24, 0x42, 0x36, 0xc1, 0x1f, 0xdc, 0x5c, 0xf4, 0x87, 0x9a, 0xb2, 0x06, 0x35, 0x06, 0xf9, 0x13, 0x80,
0xd9, 0xd7, 0xf9, 0xfb, 0x03, 0xc3, 0x4f, 0x9d, 0x96, 0x90, 0x70, 0x0f, 0x5a, 0x0b, 0x34, 0x91, 0xa5, 0xe9, 0xa1, 0xca, 0xdf, 0x1f, 0x6a, 0x7e, 0x1a, 0xb4, 0x84, 0x84, 0x07, 0xd0, 0x5e, 0xa2,
0x36, 0x34, 0xb0, 0x38, 0x1e, 0xb3, 0x31, 0xda, 0xe7, 0xca, 0x50, 0xd8, 0x01, 0xdf, 0x30, 0xf4, 0x89, 0x6c, 0x43, 0x13, 0xcd, 0xf1, 0x94, 0x4d, 0xd0, 0x3e, 0x57, 0x86, 0xc2, 0x0e, 0xf8, 0x9a,
0xeb, 0x50, 0xb2, 0x09, 0xb5, 0x54, 0x31, 0x95, 0xa5, 0x36, 0xb7, 0xb5, 0xc2, 0xc7, 0xd0, 0x3c, 0xa1, 0x1f, 0x87, 0x92, 0x2d, 0xa8, 0x65, 0x92, 0xc9, 0x3c, 0xb3, 0xb9, 0xad, 0x15, 0xfe, 0x0f,
0x89, 0x47, 0x23, 0x2e, 0x86, 0x05, 0x2d, 0xff, 0x81, 0x37, 0x46, 0xc5, 0x16, 0xfa, 0x7d, 0x84, 0xad, 0xb3, 0x64, 0x3c, 0xe6, 0xf1, 0xc8, 0xd0, 0xf2, 0x17, 0x78, 0x13, 0x94, 0x6c, 0xa9, 0xdf,
0x8a, 0x51, 0xe3, 0x08, 0xbf, 0x39, 0xd0, 0x28, 0xd1, 0xa3, 0x53, 0xa7, 0x78, 0x99, 0xa1, 0x88, 0x27, 0x28, 0x19, 0xd5, 0x8e, 0xf0, 0x8b, 0x03, 0xcd, 0x12, 0x3d, 0x2a, 0x75, 0x86, 0x57, 0x39,
0xf0, 0x38, 0x1b, 0x9b, 0x7b, 0x1e, 0x2d, 0x43, 0x24, 0x84, 0xe6, 0x20, 0x55, 0x6f, 0x51, 0x5e, 0xc6, 0x11, 0x9e, 0xe6, 0x13, 0x7d, 0xcf, 0xa3, 0x65, 0x88, 0x84, 0xd0, 0x1a, 0x66, 0xf2, 0x35,
0xf1, 0x08, 0xfb, 0x2f, 0x6d, 0x01, 0x73, 0x98, 0x8e, 0x49, 0x65, 0x34, 0x8b, 0xa9, 0x16, 0x31, 0x8a, 0x6b, 0x1e, 0x61, 0xff, 0xb9, 0x2d, 0x60, 0x01, 0x53, 0x31, 0x99, 0x88, 0xe6, 0x31, 0x55,
0x65, 0x8c, 0x04, 0xb0, 0x24, 0xf1, 0xf2, 0x5d, 0x9e, 0xa0, 0xe9, 0xb8, 0x47, 0x27, 0x26, 0x79, 0x13, 0x53, 0xc6, 0x48, 0x00, 0x2b, 0x02, 0xaf, 0xde, 0x14, 0x29, 0xea, 0x8e, 0x7b, 0x74, 0x6a,
0x04, 0xcb, 0x12, 0xd3, 0x24, 0x16, 0x29, 0xda, 0x46, 0xb6, 0xa6, 0xa3, 0x57, 0xc0, 0x74, 0x1a, 0x92, 0xff, 0xa0, 0x2e, 0x30, 0x4b, 0x93, 0x38, 0x43, 0xdb, 0xc8, 0xf6, 0x6c, 0xf4, 0x0c, 0x4c,
0x10, 0x7e, 0x77, 0xa0, 0xb5, 0x38, 0x0c, 0x1b, 0xe0, 0x73, 0x33, 0x06, 0x45, 0xf9, 0x85, 0x71, 0x67, 0x01, 0xe1, 0x57, 0x07, 0xda, 0xcb, 0xc3, 0xb0, 0x09, 0x3e, 0xd7, 0x63, 0x60, 0xca, 0x37,
0x6f, 0x85, 0x13, 0xf0, 0xd4, 0xac, 0x6a, 0x73, 0xd6, 0xd8, 0x59, 0x26, 0x22, 0x53, 0x6e, 0x9d, 0xc6, 0x83, 0x15, 0x4e, 0xc0, 0x93, 0xf3, 0xaa, 0xf5, 0x59, 0x61, 0xe7, 0x79, 0x1c, 0xe9, 0x72,
0x9a, 0xb3, 0xc6, 0x98, 0x1c, 0xa6, 0x41, 0xad, 0x5d, 0xd5, 0x98, 0x3e, 0x97, 0xfa, 0xb6, 0x64, 0x1b, 0x54, 0x9f, 0x15, 0xc6, 0xc4, 0x28, 0xd3, 0xc3, 0xd5, 0xa0, 0xfa, 0xac, 0xfa, 0xa6, 0xfe,
0x46, 0x6e, 0xd2, 0xb7, 0x2f, 0x2e, 0xac, 0x51, 0x8c, 0x90, 0x27, 0xaa, 0xd0, 0xeb, 0x61, 0x3c, 0x47, 0x83, 0x60, 0xc5, 0xf4, 0xcd, 0x58, 0x53, 0x5c, 0x0c, 0x82, 0xfa, 0x1c, 0x17, 0x83, 0xf0,
0xbc, 0x4d, 0x89, 0xce, 0x9d, 0x95, 0xe8, 0xde, 0x41, 0x89, 0xd5, 0x7b, 0x50, 0xa2, 0xf7, 0x7b, 0x93, 0x0b, 0xeb, 0x14, 0x23, 0xe4, 0xa9, 0x34, 0x3a, 0x3e, 0x4e, 0x46, 0x77, 0x29, 0xd4, 0xb9,
0x4a, 0xf4, 0x6f, 0x2a, 0x51, 0xc1, 0xc6, 0x9b, 0x0c, 0x65, 0xfe, 0x47, 0xbb, 0x1c, 0x76, 0x60, 0xb7, 0x42, 0xdd, 0x7b, 0x28, 0xb4, 0xfa, 0x00, 0x0a, 0xf5, 0x7e, 0x4e, 0xa1, 0xfe, 0x6d, 0x85,
0xdd, 0x24, 0xdc, 0x9f, 0x26, 0x3c, 0xe4, 0xa9, 0x22, 0x0f, 0xc1, 0x1b, 0xf1, 0x54, 0x2f, 0xd0, 0x4a, 0xd8, 0x7c, 0x95, 0xa3, 0x28, 0x7e, 0x69, 0xf7, 0xc3, 0x0e, 0x6c, 0xe8, 0x84, 0x87, 0xb3,
0xea, 0xcf, 0xa9, 0xa1, 0x26, 0x26, 0x6c, 0xc1, 0x8a, 0x29, 0xfc, 0x98, 0x8f, 0x4e, 0x98, 0x64, 0x84, 0xc7, 0x3c, 0x93, 0xe4, 0x5f, 0xf0, 0xc6, 0x3c, 0x53, 0x8b, 0xb5, 0xfa, 0x7d, 0x6a, 0xa8,
0xe3, 0xf0, 0x2f, 0x68, 0x19, 0xe0, 0x75, 0xa6, 0x14, 0x4a, 0xad, 0xc2, 0x70, 0x0d, 0x56, 0xed, 0x8e, 0x09, 0xdb, 0xb0, 0xaa, 0x0b, 0x3f, 0xe5, 0xe3, 0x33, 0x26, 0xd8, 0x24, 0xfc, 0x0d, 0xda,
0x9f, 0x13, 0x16, 0xf9, 0x38, 0x45, 0x8e, 0x30, 0x4d, 0xd9, 0x10, 0xc9, 0x16, 0xac, 0x70, 0x61, 0x1a, 0x78, 0x99, 0x4b, 0x89, 0x42, 0xa9, 0x33, 0x5c, 0x87, 0x35, 0xfb, 0xe3, 0x62, 0x8b, 0xbc,
0x2b, 0x3b, 0x61, 0x5c, 0xda, 0x85, 0x30, 0x0f, 0x2e, 0x2a, 0xd7, 0xbd, 0xa1, 0xdc, 0xf0, 0xd3, 0x9f, 0x21, 0x27, 0x98, 0x65, 0x6c, 0x84, 0x64, 0x07, 0x56, 0x79, 0x6c, 0x2b, 0x3b, 0x63, 0x5c,
0x2c, 0xfd, 0x7d, 0x3f, 0xdd, 0x05, 0x28, 0xe6, 0xb6, 0x2f, 0xce, 0xe2, 0x3b, 0xee, 0xcc, 0xcf, 0xd8, 0x45, 0xb1, 0x08, 0x2e, 0x2b, 0xda, 0xbd, 0xa5, 0xe8, 0xf0, 0xc3, 0x3c, 0xfd, 0x43, 0x3f,
0xe0, 0x69, 0x02, 0xc8, 0x83, 0xe9, 0xce, 0xd2, 0x14, 0xff, 0x5d, 0xda, 0x59, 0xe6, 0xe7, 0x40, 0xdd, 0x05, 0x30, 0x73, 0xdb, 0x8f, 0xcf, 0x93, 0x7b, 0xee, 0xd2, 0x8f, 0xe0, 0x29, 0x02, 0xc8,
0x28, 0x99, 0x17, 0xdb, 0xeb, 0x9f, 0xa7, 0x50, 0x9f, 0x42, 0x64, 0x0d, 0xaa, 0x17, 0x98, 0xdb, 0x3f, 0xb3, 0x5d, 0xa6, 0x28, 0xfe, 0xbd, 0xb4, 0xcb, 0xf4, 0x9f, 0xa3, 0x58, 0x8a, 0xc2, 0x6c,
0x9c, 0xfa, 0xa8, 0xeb, 0x30, 0x23, 0x64, 0x2b, 0x2e, 0x8c, 0xe7, 0xee, 0x33, 0x27, 0xfc, 0x00, 0xb5, 0x3f, 0x1e, 0x43, 0x63, 0x06, 0x91, 0x75, 0xa8, 0x5e, 0x62, 0x61, 0x73, 0xaa, 0xa3, 0xaa,
0xcb, 0x93, 0x5d, 0x52, 0xd2, 0xa4, 0x53, 0xd6, 0xa4, 0x5e, 0x50, 0xe3, 0x82, 0x26, 0x5b, 0xec, 0x43, 0x8f, 0x90, 0xad, 0xd8, 0x18, 0x4f, 0xdd, 0x27, 0x4e, 0xf8, 0x0e, 0xea, 0xd3, 0x1d, 0x53,
0xc4, 0xd4, 0x9e, 0x84, 0xe5, 0xa3, 0x98, 0x0d, 0xcc, 0xe8, 0x34, 0xe9, 0xc4, 0xdc, 0x5d, 0x86, 0xda, 0xb1, 0x8e, 0x1e, 0x3e, 0x6b, 0xa9, 0xc5, 0x35, 0x31, 0x34, 0xd9, 0x62, 0xa7, 0xa6, 0xf2,
0x5a, 0xf1, 0x1d, 0x3e, 0xad, 0x99, 0x0f, 0xf1, 0xde, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xa4, 0xac, 0x18, 0x27, 0x6c, 0xa8, 0x47, 0xa7, 0x45, 0xa7, 0xe6, 0x7e, 0x1d, 0x6a, 0xe6, 0xfb,
0x16, 0xb7, 0x18, 0x98, 0x07, 0x00, 0x00, 0x3c, 0xa8, 0xe9, 0x0f, 0xf4, 0xc1, 0xb7, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x11, 0xe4, 0xb4,
0xb0, 0x07, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment