Commit ce15f935 authored by madengji's avatar madengji Committed by vipwzw

add role

parent 6e5bf601
...@@ -38,7 +38,7 @@ func (a *action) authParamCheck(input *mixTy.AuthorizePublicInput) error { ...@@ -38,7 +38,7 @@ func (a *action) authParamCheck(input *mixTy.AuthorizePublicInput) error {
//authorize pubkey hash should be configured already //authorize pubkey hash should be configured already
var found bool var found bool
for _, k := range authPubKeys.Data { for _, k := range authPubKeys.Pks {
if input.AuthorizePubKey == k { if input.AuthorizePubKey == k {
found = true found = true
break break
......
...@@ -87,7 +87,7 @@ func getNewTree() *merkletree.Tree { ...@@ -87,7 +87,7 @@ func getNewTree() *merkletree.Tree {
func calcTreeRoot(leaves *mixTy.CommitTreeLeaves) []byte { func calcTreeRoot(leaves *mixTy.CommitTreeLeaves) []byte {
tree := getNewTree() tree := getNewTree()
for _, leaf := range leaves.Data { for _, leaf := range leaves.Leaves {
tree.Push(leaf) tree.Push(leaf)
} }
return tree.Root() return tree.Root()
...@@ -100,8 +100,8 @@ func getNewCommitLeaves() (*mixTy.CommitTreeLeaves, *mixTy.CommitTreeRoots) { ...@@ -100,8 +100,8 @@ func getNewCommitLeaves() (*mixTy.CommitTreeLeaves, *mixTy.CommitTreeRoots) {
//第一个叶子节点都是固定的"00"字节 //第一个叶子节点都是固定的"00"字节
leaf := []byte("00") leaf := []byte("00")
leaves.Data = append(leaves.Data, leaf) leaves.Leaves = append(leaves.Leaves, leaf)
roots.Data = append(roots.Data, calcTreeRoot(leaves)) roots.Roots = append(roots.Roots, calcTreeRoot(leaves))
return leaves, roots return leaves, roots
} }
...@@ -109,8 +109,8 @@ func getNewCommitLeaves() (*mixTy.CommitTreeLeaves, *mixTy.CommitTreeRoots) { ...@@ -109,8 +109,8 @@ func getNewCommitLeaves() (*mixTy.CommitTreeLeaves, *mixTy.CommitTreeRoots) {
func initNewLeaves(leaf [][]byte) *types.Receipt { func initNewLeaves(leaf [][]byte) *types.Receipt {
leaves, roots := getNewCommitLeaves() leaves, roots := getNewCommitLeaves()
if len(leaf) > 0 { if len(leaf) > 0 {
leaves.Data = append(leaves.Data, leaf...) leaves.Leaves = append(leaves.Leaves, leaf...)
roots.Data = append(roots.Data, calcTreeRoot(leaves)) roots.Roots = append(roots.Roots, calcTreeRoot(leaves))
} }
return makeCurrentTreeReceipt(leaves, roots) return makeCurrentTreeReceipt(leaves, roots)
...@@ -127,7 +127,7 @@ func archiveRoots(db dbm.KV, root []byte, leaves *mixTy.CommitTreeLeaves) (*type ...@@ -127,7 +127,7 @@ func archiveRoots(db dbm.KV, root []byte, leaves *mixTy.CommitTreeLeaves) (*type
if err != nil { if err != nil {
return nil, err return nil, err
} }
archiveRoots.Data = append(archiveRoots.Data, root) archiveRoots.Roots = append(archiveRoots.Roots, root)
receiptArch := makeTreeArchiveRootsReceipt(archiveRoots) receiptArch := makeTreeArchiveRootsReceipt(archiveRoots)
return mergeReceipt(receiptRootLeaves, receiptArch), nil return mergeReceipt(receiptRootLeaves, receiptArch), nil
} }
...@@ -158,13 +158,13 @@ func pushTree(db dbm.KV, leaf [][]byte) (*types.Receipt, error) { ...@@ -158,13 +158,13 @@ func pushTree(db dbm.KV, leaf [][]byte) (*types.Receipt, error) {
return nil, err return nil, err
} }
leaves.Data = append(leaves.Data, leaf...) leaves.Leaves = append(leaves.Leaves, leaf...)
currentRoot := calcTreeRoot(leaves) currentRoot := calcTreeRoot(leaves)
roots.Data = append(roots.Data, currentRoot) roots.Roots = append(roots.Roots, currentRoot)
r := makeCurrentTreeReceipt(leaves, roots) r := makeCurrentTreeReceipt(leaves, roots)
//归档 //归档
if len(leaves.Data) >= mixTy.MaxTreeLeaves { if len(leaves.Leaves) >= mixTy.MaxTreeLeaves {
receiptArch, err := archiveRoots(db, currentRoot, leaves) receiptArch, err := archiveRoots(db, currentRoot, leaves)
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -184,12 +184,12 @@ func checkTreeRootHashExist(db dbm.KV, hash []byte) bool { ...@@ -184,12 +184,12 @@ func checkTreeRootHashExist(db dbm.KV, hash []byte) bool {
var roots [][]byte var roots [][]byte
currentRoots, err := getCurrentCommitTreeRoots(db) currentRoots, err := getCurrentCommitTreeRoots(db)
if err == nil { if err == nil {
roots = append(roots, currentRoots.Data...) roots = append(roots, currentRoots.Roots...)
} }
archiveRoots, err := getArchiveCommitRoots(db) archiveRoots, err := getArchiveCommitRoots(db)
if err == nil { if err == nil {
roots = append(roots, archiveRoots.Data...) roots = append(roots, archiveRoots.Roots...)
} }
for _, k := range roots { for _, k := range roots {
...@@ -250,7 +250,7 @@ func CalcTreeProve(db dbm.KV, rootHash, leaf string) (*mixTy.CommitTreeProve, er ...@@ -250,7 +250,7 @@ func CalcTreeProve(db dbm.KV, rootHash, leaf string) (*mixTy.CommitTreeProve, er
} }
leaves, err := getCurrentCommitTreeLeaves(db) leaves, err := getCurrentCommitTreeLeaves(db)
if err == nil { if err == nil {
p, err := getProveData(transferFr2Bytes(leaf), leaves.Data) p, err := getProveData(transferFr2Bytes(leaf), leaves.Leaves)
if err == nil { if err == nil {
return p, nil return p, nil
} }
...@@ -261,7 +261,7 @@ func CalcTreeProve(db dbm.KV, rootHash, leaf string) (*mixTy.CommitTreeProve, er ...@@ -261,7 +261,7 @@ func CalcTreeProve(db dbm.KV, rootHash, leaf string) (*mixTy.CommitTreeProve, er
if err != nil { if err != nil {
return nil, err return nil, err
} }
p, err := getProveData(transferFr2Bytes(leaf), leaves.Data) p, err := getProveData(transferFr2Bytes(leaf), leaves.Leaves)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "hash=%s,leaf=%s", rootHash, leaf) return nil, errors.Wrapf(err, "hash=%s,leaf=%s", rootHash, leaf)
} }
...@@ -270,10 +270,10 @@ func CalcTreeProve(db dbm.KV, rootHash, leaf string) (*mixTy.CommitTreeProve, er ...@@ -270,10 +270,10 @@ func CalcTreeProve(db dbm.KV, rootHash, leaf string) (*mixTy.CommitTreeProve, er
roots, err := getArchiveCommitRoots(db) roots, err := getArchiveCommitRoots(db)
if err == nil { if err == nil {
for _, root := range roots.Data { for _, root := range roots.Roots {
leaves, err := getCommitRootLeaves(db, transferFr2String(root)) leaves, err := getCommitRootLeaves(db, transferFr2String(root))
if err == nil { if err == nil {
p, err := getProveData(transferFr2Bytes(leaf), leaves.Data) p, err := getProveData(transferFr2Bytes(leaf), leaves.Leaves)
if err == nil { if err == nil {
return p, nil return p, nil
} }
......
...@@ -129,14 +129,14 @@ func (a *action) ConfigAddAuthPubKey(key string) (*types.Receipt, error) { ...@@ -129,14 +129,14 @@ func (a *action) ConfigAddAuthPubKey(key string) (*types.Receipt, error) {
keys, err := a.getAuthKeys() keys, err := a.getAuthKeys()
if isNotFound(errors.Cause(err)) { if isNotFound(errors.Cause(err)) {
keys := &mixTy.AuthPubKeys{} keys := &mixTy.AuthPubKeys{}
keys.Data = append(keys.Data, key) keys.Pks = append(keys.Pks, key)
return makeConfigAuthKeyReceipt(keys), nil return makeConfigAuthKeyReceipt(keys), nil
} }
if err != nil { if err != nil {
return nil, err return nil, err
} }
keys.Data = append(keys.Data, key) keys.Pks = append(keys.Pks, key)
return makeConfigAuthKeyReceipt(keys), nil return makeConfigAuthKeyReceipt(keys), nil
} }
...@@ -147,11 +147,11 @@ func (a *action) ConfigDeleteAuthPubKey(key string) (*types.Receipt, error) { ...@@ -147,11 +147,11 @@ func (a *action) ConfigDeleteAuthPubKey(key string) (*types.Receipt, error) {
} }
var newKeys mixTy.AuthPubKeys var newKeys mixTy.AuthPubKeys
for _, v := range keys.Data { for _, v := range keys.Pks {
if key == v { if key == v {
continue continue
} }
newKeys.Data = append(newKeys.Data, v) newKeys.Pks = append(newKeys.Pks, v)
} }
return makeConfigAuthKeyReceipt(&newKeys), nil return makeConfigAuthKeyReceipt(&newKeys), nil
......
...@@ -34,8 +34,8 @@ func (m *Mix) Query_GetLeavesList(in *mixTy.TreeInfoReq) (types.Message, error) ...@@ -34,8 +34,8 @@ func (m *Mix) Query_GetLeavesList(in *mixTy.TreeInfoReq) (types.Message, error)
return nil, err return nil, err
} }
var resp mixTy.TreeListResp var resp mixTy.TreeListResp
for _, k := range leaves.Data { for _, k := range leaves.Leaves {
resp.Datas = append(resp.Datas, transferFr2String(k)) resp.Leaves = append(resp.Leaves, transferFr2String(k))
} }
return &resp, nil return &resp, nil
...@@ -49,8 +49,8 @@ func (m *Mix) Query_GetRootList(in *types.ReqNil) (types.Message, error) { ...@@ -49,8 +49,8 @@ func (m *Mix) Query_GetRootList(in *types.ReqNil) (types.Message, error) {
return nil, err return nil, err
} }
var resp mixTy.TreeListResp var resp mixTy.TreeListResp
for _, k := range roots.Data { for _, k := range roots.Roots {
resp.Datas = append(resp.Datas, transferFr2String(k)) resp.Leaves = append(resp.Leaves, transferFr2String(k))
} }
return &resp, nil return &resp, nil
......
...@@ -27,7 +27,7 @@ message ZkVerifyKeys{ ...@@ -27,7 +27,7 @@ message ZkVerifyKeys{
} }
message AuthPubKeys{ message AuthPubKeys{
repeated string data = 1; repeated string pks = 1;
} }
message PaymentKey{ message PaymentKey{
...@@ -167,11 +167,11 @@ message ExistValue { ...@@ -167,11 +167,11 @@ message ExistValue {
} }
message CommitTreeLeaves { message CommitTreeLeaves {
repeated bytes data = 1; repeated bytes leaves = 1;
} }
message CommitTreeRoots { message CommitTreeRoots {
repeated bytes data = 1; repeated bytes roots = 1;
} }
...@@ -189,7 +189,7 @@ message TreeInfoReq{ ...@@ -189,7 +189,7 @@ message TreeInfoReq{
} }
message TreeListResp{ message TreeListResp{
repeated string datas = 1; repeated string leaves = 1;
} }
// mix wallet part // mix wallet part
...@@ -289,8 +289,8 @@ message WithdrawProofResp{ ...@@ -289,8 +289,8 @@ message WithdrawProofResp{
string authorizeSpendHash = 3; string authorizeSpendHash = 3;
string noteHash = 4; string noteHash = 4;
string spendPrivKey = 5; string spendPrivKey = 5;
uint32 spendFlag = 6; string spendFlag = 6;
uint32 authorizeFlag = 7; string authorizeFlag = 7;
TreePathProof treeProof = 8; TreePathProof treeProof = 8;
} }
...@@ -306,7 +306,7 @@ message AuthProofResp{ ...@@ -306,7 +306,7 @@ message AuthProofResp{
string authHash = 4; string authHash = 4;
string authorizeSpendHash = 5; string authorizeSpendHash = 5;
string noteHash = 6; string noteHash = 6;
uint32 spendFlag = 7; string spendFlag = 7;
TreePathProof treeProof = 8; TreePathProof treeProof = 8;
} }
...@@ -331,8 +331,8 @@ message TransferInputProof{ ...@@ -331,8 +331,8 @@ message TransferInputProof{
string authorizeSpendHash = 3; string authorizeSpendHash = 3;
string noteHash = 4; string noteHash = 4;
string spendPrivKey = 5; string spendPrivKey = 5;
uint32 spendFlag = 6; string spendFlag = 6;
uint32 authorizeFlag = 7; string authorizeFlag = 7;
TreePathProof treeProof = 8; TreePathProof treeProof = 8;
ShieldAmount shieldAmount = 9; ShieldAmount shieldAmount = 9;
string amountRandom = 10; string amountRandom = 10;
...@@ -372,14 +372,20 @@ enum NoteStatus{ ...@@ -372,14 +372,20 @@ enum NoteStatus{
USED = 3; //已使用 USED = 3; //已使用
} }
enum Role{
SPENDER = 0;
RETURNER = 1;
AUTHORIZER = 2;
}
message WalletIndexInfo { message WalletIndexInfo {
string noteHash = 1; string noteHash = 1;
string nullifier = 2; string nullifier = 2;
string authorizeSpendHash = 3; string authorizeSpendHash = 3;
bool isReturner = 4; Role role = 4;
string account = 5; //账户地址 string account = 5; //账户地址
NoteStatus status = 6; NoteStatus status = 6;
SecretData secret = 7; SecretData secret = 7;
} }
......
...@@ -147,6 +147,34 @@ func (NoteStatus) EnumDescriptor() ([]byte, []int) { ...@@ -147,6 +147,34 @@ func (NoteStatus) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{3} return fileDescriptor_5c21d519a9be369a, []int{3}
} }
type Role int32
const (
Role_SPENDER Role = 0
Role_RETURNER Role = 1
Role_AUTHORIZER Role = 2
)
var Role_name = map[int32]string{
0: "SPENDER",
1: "RETURNER",
2: "AUTHORIZER",
}
var Role_value = map[string]int32{
"SPENDER": 0,
"RETURNER": 1,
"AUTHORIZER": 2,
}
func (x Role) String() string {
return proto.EnumName(Role_name, int32(x))
}
func (Role) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{4}
}
type MixWalletRescanStatus int32 type MixWalletRescanStatus int32
const ( const (
...@@ -172,7 +200,7 @@ func (x MixWalletRescanStatus) String() string { ...@@ -172,7 +200,7 @@ func (x MixWalletRescanStatus) String() string {
} }
func (MixWalletRescanStatus) EnumDescriptor() ([]byte, []int) { func (MixWalletRescanStatus) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{4} return fileDescriptor_5c21d519a9be369a, []int{5}
} }
type ZkVerifyKey struct { type ZkVerifyKey struct {
...@@ -262,7 +290,7 @@ func (m *ZkVerifyKeys) GetData() []*ZkVerifyKey { ...@@ -262,7 +290,7 @@ func (m *ZkVerifyKeys) GetData() []*ZkVerifyKey {
} }
type AuthPubKeys struct { type AuthPubKeys struct {
Data []string `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` Pks []string `protobuf:"bytes,1,rep,name=pks,proto3" json:"pks,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:"-"`
...@@ -293,9 +321,9 @@ func (m *AuthPubKeys) XXX_DiscardUnknown() { ...@@ -293,9 +321,9 @@ func (m *AuthPubKeys) XXX_DiscardUnknown() {
var xxx_messageInfo_AuthPubKeys proto.InternalMessageInfo var xxx_messageInfo_AuthPubKeys proto.InternalMessageInfo
func (m *AuthPubKeys) GetData() []string { func (m *AuthPubKeys) GetPks() []string {
if m != nil { if m != nil {
return m.Data return m.Pks
} }
return nil return nil
} }
...@@ -1288,7 +1316,7 @@ func (m *ExistValue) GetData() bool { ...@@ -1288,7 +1316,7 @@ func (m *ExistValue) GetData() bool {
} }
type CommitTreeLeaves struct { type CommitTreeLeaves struct {
Data [][]byte `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` Leaves [][]byte `protobuf:"bytes,1,rep,name=leaves,proto3" json:"leaves,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:"-"`
...@@ -1319,15 +1347,15 @@ func (m *CommitTreeLeaves) XXX_DiscardUnknown() { ...@@ -1319,15 +1347,15 @@ func (m *CommitTreeLeaves) XXX_DiscardUnknown() {
var xxx_messageInfo_CommitTreeLeaves proto.InternalMessageInfo var xxx_messageInfo_CommitTreeLeaves proto.InternalMessageInfo
func (m *CommitTreeLeaves) GetData() [][]byte { func (m *CommitTreeLeaves) GetLeaves() [][]byte {
if m != nil { if m != nil {
return m.Data return m.Leaves
} }
return nil return nil
} }
type CommitTreeRoots struct { type CommitTreeRoots struct {
Data [][]byte `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` Roots [][]byte `protobuf:"bytes,1,rep,name=roots,proto3" json:"roots,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:"-"`
...@@ -1358,9 +1386,9 @@ func (m *CommitTreeRoots) XXX_DiscardUnknown() { ...@@ -1358,9 +1386,9 @@ func (m *CommitTreeRoots) XXX_DiscardUnknown() {
var xxx_messageInfo_CommitTreeRoots proto.InternalMessageInfo var xxx_messageInfo_CommitTreeRoots proto.InternalMessageInfo
func (m *CommitTreeRoots) GetData() [][]byte { func (m *CommitTreeRoots) GetRoots() [][]byte {
if m != nil { if m != nil {
return m.Data return m.Roots
} }
return nil return nil
} }
...@@ -1484,7 +1512,7 @@ func (m *TreeInfoReq) GetLeafHash() string { ...@@ -1484,7 +1512,7 @@ func (m *TreeInfoReq) GetLeafHash() string {
} }
type TreeListResp struct { type TreeListResp struct {
Datas []string `protobuf:"bytes,1,rep,name=datas,proto3" json:"datas,omitempty"` Leaves []string `protobuf:"bytes,1,rep,name=leaves,proto3" json:"leaves,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:"-"`
...@@ -1515,9 +1543,9 @@ func (m *TreeListResp) XXX_DiscardUnknown() { ...@@ -1515,9 +1543,9 @@ func (m *TreeListResp) XXX_DiscardUnknown() {
var xxx_messageInfo_TreeListResp proto.InternalMessageInfo var xxx_messageInfo_TreeListResp proto.InternalMessageInfo
func (m *TreeListResp) GetDatas() []string { func (m *TreeListResp) GetLeaves() []string {
if m != nil { if m != nil {
return m.Datas return m.Leaves
} }
return nil return nil
} }
...@@ -2250,8 +2278,8 @@ type WithdrawProofResp struct { ...@@ -2250,8 +2278,8 @@ type WithdrawProofResp struct {
AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"` AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"`
NoteHash string `protobuf:"bytes,4,opt,name=noteHash,proto3" json:"noteHash,omitempty"` NoteHash string `protobuf:"bytes,4,opt,name=noteHash,proto3" json:"noteHash,omitempty"`
SpendPrivKey string `protobuf:"bytes,5,opt,name=spendPrivKey,proto3" json:"spendPrivKey,omitempty"` SpendPrivKey string `protobuf:"bytes,5,opt,name=spendPrivKey,proto3" json:"spendPrivKey,omitempty"`
SpendFlag uint32 `protobuf:"varint,6,opt,name=spendFlag,proto3" json:"spendFlag,omitempty"` SpendFlag string `protobuf:"bytes,6,opt,name=spendFlag,proto3" json:"spendFlag,omitempty"`
AuthorizeFlag uint32 `protobuf:"varint,7,opt,name=authorizeFlag,proto3" json:"authorizeFlag,omitempty"` AuthorizeFlag string `protobuf:"bytes,7,opt,name=authorizeFlag,proto3" json:"authorizeFlag,omitempty"`
TreeProof *TreePathProof `protobuf:"bytes,8,opt,name=treeProof,proto3" json:"treeProof,omitempty"` TreeProof *TreePathProof `protobuf:"bytes,8,opt,name=treeProof,proto3" json:"treeProof,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
...@@ -2318,18 +2346,18 @@ func (m *WithdrawProofResp) GetSpendPrivKey() string { ...@@ -2318,18 +2346,18 @@ func (m *WithdrawProofResp) GetSpendPrivKey() string {
return "" return ""
} }
func (m *WithdrawProofResp) GetSpendFlag() uint32 { func (m *WithdrawProofResp) GetSpendFlag() string {
if m != nil { if m != nil {
return m.SpendFlag return m.SpendFlag
} }
return 0 return ""
} }
func (m *WithdrawProofResp) GetAuthorizeFlag() uint32 { func (m *WithdrawProofResp) GetAuthorizeFlag() string {
if m != nil { if m != nil {
return m.AuthorizeFlag return m.AuthorizeFlag
} }
return 0 return ""
} }
func (m *WithdrawProofResp) GetTreeProof() *TreePathProof { func (m *WithdrawProofResp) GetTreeProof() *TreePathProof {
...@@ -2393,7 +2421,7 @@ type AuthProofResp struct { ...@@ -2393,7 +2421,7 @@ type AuthProofResp struct {
AuthHash string `protobuf:"bytes,4,opt,name=authHash,proto3" json:"authHash,omitempty"` AuthHash string `protobuf:"bytes,4,opt,name=authHash,proto3" json:"authHash,omitempty"`
AuthorizeSpendHash string `protobuf:"bytes,5,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"` AuthorizeSpendHash string `protobuf:"bytes,5,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"`
NoteHash string `protobuf:"bytes,6,opt,name=noteHash,proto3" json:"noteHash,omitempty"` NoteHash string `protobuf:"bytes,6,opt,name=noteHash,proto3" json:"noteHash,omitempty"`
SpendFlag uint32 `protobuf:"varint,7,opt,name=spendFlag,proto3" json:"spendFlag,omitempty"` SpendFlag string `protobuf:"bytes,7,opt,name=spendFlag,proto3" json:"spendFlag,omitempty"`
TreeProof *TreePathProof `protobuf:"bytes,8,opt,name=treeProof,proto3" json:"treeProof,omitempty"` TreeProof *TreePathProof `protobuf:"bytes,8,opt,name=treeProof,proto3" json:"treeProof,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
...@@ -2467,11 +2495,11 @@ func (m *AuthProofResp) GetNoteHash() string { ...@@ -2467,11 +2495,11 @@ func (m *AuthProofResp) GetNoteHash() string {
return "" return ""
} }
func (m *AuthProofResp) GetSpendFlag() uint32 { func (m *AuthProofResp) GetSpendFlag() string {
if m != nil { if m != nil {
return m.SpendFlag return m.SpendFlag
} }
return 0 return ""
} }
func (m *AuthProofResp) GetTreeProof() *TreePathProof { func (m *AuthProofResp) GetTreeProof() *TreePathProof {
...@@ -2606,8 +2634,8 @@ type TransferInputProof struct { ...@@ -2606,8 +2634,8 @@ type TransferInputProof struct {
AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"` AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"`
NoteHash string `protobuf:"bytes,4,opt,name=noteHash,proto3" json:"noteHash,omitempty"` NoteHash string `protobuf:"bytes,4,opt,name=noteHash,proto3" json:"noteHash,omitempty"`
SpendPrivKey string `protobuf:"bytes,5,opt,name=spendPrivKey,proto3" json:"spendPrivKey,omitempty"` SpendPrivKey string `protobuf:"bytes,5,opt,name=spendPrivKey,proto3" json:"spendPrivKey,omitempty"`
SpendFlag uint32 `protobuf:"varint,6,opt,name=spendFlag,proto3" json:"spendFlag,omitempty"` SpendFlag string `protobuf:"bytes,6,opt,name=spendFlag,proto3" json:"spendFlag,omitempty"`
AuthorizeFlag uint32 `protobuf:"varint,7,opt,name=authorizeFlag,proto3" json:"authorizeFlag,omitempty"` AuthorizeFlag string `protobuf:"bytes,7,opt,name=authorizeFlag,proto3" json:"authorizeFlag,omitempty"`
TreeProof *TreePathProof `protobuf:"bytes,8,opt,name=treeProof,proto3" json:"treeProof,omitempty"` TreeProof *TreePathProof `protobuf:"bytes,8,opt,name=treeProof,proto3" json:"treeProof,omitempty"`
ShieldAmount *ShieldAmount `protobuf:"bytes,9,opt,name=shieldAmount,proto3" json:"shieldAmount,omitempty"` ShieldAmount *ShieldAmount `protobuf:"bytes,9,opt,name=shieldAmount,proto3" json:"shieldAmount,omitempty"`
AmountRandom string `protobuf:"bytes,10,opt,name=amountRandom,proto3" json:"amountRandom,omitempty"` AmountRandom string `protobuf:"bytes,10,opt,name=amountRandom,proto3" json:"amountRandom,omitempty"`
...@@ -2676,18 +2704,18 @@ func (m *TransferInputProof) GetSpendPrivKey() string { ...@@ -2676,18 +2704,18 @@ func (m *TransferInputProof) GetSpendPrivKey() string {
return "" return ""
} }
func (m *TransferInputProof) GetSpendFlag() uint32 { func (m *TransferInputProof) GetSpendFlag() string {
if m != nil { if m != nil {
return m.SpendFlag return m.SpendFlag
} }
return 0 return ""
} }
func (m *TransferInputProof) GetAuthorizeFlag() uint32 { func (m *TransferInputProof) GetAuthorizeFlag() string {
if m != nil { if m != nil {
return m.AuthorizeFlag return m.AuthorizeFlag
} }
return 0 return ""
} }
func (m *TransferInputProof) GetTreeProof() *TreePathProof { func (m *TransferInputProof) GetTreeProof() *TreePathProof {
...@@ -2920,7 +2948,7 @@ type WalletIndexInfo struct { ...@@ -2920,7 +2948,7 @@ type WalletIndexInfo struct {
NoteHash string `protobuf:"bytes,1,opt,name=noteHash,proto3" json:"noteHash,omitempty"` NoteHash string `protobuf:"bytes,1,opt,name=noteHash,proto3" json:"noteHash,omitempty"`
Nullifier string `protobuf:"bytes,2,opt,name=nullifier,proto3" json:"nullifier,omitempty"` Nullifier string `protobuf:"bytes,2,opt,name=nullifier,proto3" json:"nullifier,omitempty"`
AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"` AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"`
IsReturner bool `protobuf:"varint,4,opt,name=isReturner,proto3" json:"isReturner,omitempty"` Role Role `protobuf:"varint,4,opt,name=role,proto3,enum=types.Role" json:"role,omitempty"`
Account string `protobuf:"bytes,5,opt,name=account,proto3" json:"account,omitempty"` Account string `protobuf:"bytes,5,opt,name=account,proto3" json:"account,omitempty"`
Status NoteStatus `protobuf:"varint,6,opt,name=status,proto3,enum=types.NoteStatus" json:"status,omitempty"` Status NoteStatus `protobuf:"varint,6,opt,name=status,proto3,enum=types.NoteStatus" json:"status,omitempty"`
Secret *SecretData `protobuf:"bytes,7,opt,name=secret,proto3" json:"secret,omitempty"` Secret *SecretData `protobuf:"bytes,7,opt,name=secret,proto3" json:"secret,omitempty"`
...@@ -2975,11 +3003,11 @@ func (m *WalletIndexInfo) GetAuthorizeSpendHash() string { ...@@ -2975,11 +3003,11 @@ func (m *WalletIndexInfo) GetAuthorizeSpendHash() string {
return "" return ""
} }
func (m *WalletIndexInfo) GetIsReturner() bool { func (m *WalletIndexInfo) GetRole() Role {
if m != nil { if m != nil {
return m.IsReturner return m.Role
} }
return false return Role_SPENDER
} }
func (m *WalletIndexInfo) GetAccount() string { func (m *WalletIndexInfo) GetAccount() string {
...@@ -3581,6 +3609,7 @@ func init() { ...@@ -3581,6 +3609,7 @@ func init() {
proto.RegisterEnum("types.MixConfigType", MixConfigType_name, MixConfigType_value) proto.RegisterEnum("types.MixConfigType", MixConfigType_name, MixConfigType_value)
proto.RegisterEnum("types.MixConfigAct", MixConfigAct_name, MixConfigAct_value) proto.RegisterEnum("types.MixConfigAct", MixConfigAct_name, MixConfigAct_value)
proto.RegisterEnum("types.NoteStatus", NoteStatus_name, NoteStatus_value) proto.RegisterEnum("types.NoteStatus", NoteStatus_name, NoteStatus_value)
proto.RegisterEnum("types.Role", Role_name, Role_value)
proto.RegisterEnum("types.MixWalletRescanStatus", MixWalletRescanStatus_name, MixWalletRescanStatus_value) proto.RegisterEnum("types.MixWalletRescanStatus", MixWalletRescanStatus_name, MixWalletRescanStatus_value)
proto.RegisterType((*ZkVerifyKey)(nil), "types.ZkVerifyKey") proto.RegisterType((*ZkVerifyKey)(nil), "types.ZkVerifyKey")
proto.RegisterType((*ZkVerifyKeys)(nil), "types.ZkVerifyKeys") proto.RegisterType((*ZkVerifyKeys)(nil), "types.ZkVerifyKeys")
...@@ -3648,164 +3677,167 @@ func init() { ...@@ -3648,164 +3677,167 @@ func init() {
} }
var fileDescriptor_5c21d519a9be369a = []byte{ var fileDescriptor_5c21d519a9be369a = []byte{
// 2504 bytes of a gzipped FileDescriptorProto // 2556 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xcd, 0x6e, 0x1b, 0xc9, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xcd, 0x6e, 0x1b, 0xc9,
0xf1, 0xd7, 0xf0, 0x53, 0x2c, 0x91, 0x12, 0xd9, 0xf6, 0x6a, 0xb9, 0xc2, 0x7f, 0xfd, 0x57, 0x7a, 0xf1, 0xd7, 0xf0, 0x53, 0x2c, 0x91, 0xd4, 0xb0, 0xed, 0xd5, 0xd2, 0xc2, 0x7f, 0xd7, 0x42, 0xaf,
0xbd, 0x5e, 0x45, 0x0e, 0xb4, 0x1b, 0xda, 0x71, 0x92, 0x43, 0x76, 0xc1, 0x98, 0x94, 0xc9, 0xb5, 0xff, 0xb6, 0x22, 0x07, 0xda, 0x5d, 0xda, 0x71, 0x92, 0x43, 0x76, 0xc1, 0x98, 0x94, 0xc9, 0xb5,
0x45, 0x11, 0x4d, 0xfa, 0x33, 0x48, 0x80, 0x31, 0xd9, 0x12, 0x07, 0x26, 0x39, 0xe3, 0x99, 0xa1, 0x45, 0x11, 0x4d, 0xca, 0x5f, 0x41, 0x02, 0x8c, 0xc9, 0x96, 0x38, 0x30, 0xc9, 0x19, 0xcf, 0x0c,
0x4c, 0xe5, 0x14, 0x20, 0x01, 0xf6, 0x10, 0xe4, 0x14, 0xe4, 0x1a, 0x20, 0xa7, 0xe4, 0x01, 0x16, 0x65, 0x2a, 0xa7, 0x00, 0x09, 0xb0, 0x97, 0xe4, 0x14, 0xe4, 0x1a, 0x20, 0xa7, 0xe4, 0x01, 0x16,
0x39, 0xe4, 0x19, 0x72, 0xcc, 0x03, 0x04, 0xc8, 0x21, 0xd7, 0x3c, 0x42, 0xd0, 0x5f, 0x33, 0xdd, 0x39, 0xe4, 0x19, 0x72, 0xcc, 0x03, 0x04, 0xc8, 0x21, 0xd7, 0x3c, 0x42, 0xd0, 0x5f, 0x33, 0x3d,
0x43, 0xd2, 0x92, 0x9c, 0xcd, 0x2d, 0xb7, 0xa9, 0xea, 0x5f, 0x77, 0x57, 0xfd, 0xaa, 0xba, 0xbb, 0x43, 0xd2, 0x92, 0x9c, 0xcd, 0x2d, 0xb7, 0xa9, 0xea, 0x5f, 0x77, 0x57, 0xfd, 0xaa, 0xba, 0xbb,
0xba, 0x07, 0x0a, 0x13, 0x67, 0x7e, 0xe0, 0xf9, 0x6e, 0xe8, 0xa2, 0x6c, 0x78, 0xee, 0xd1, 0x60, 0xba, 0x07, 0x0a, 0x13, 0x7b, 0xbe, 0xef, 0x7a, 0x4e, 0xe0, 0xa0, 0x6c, 0x70, 0xee, 0x52, 0x7f,
0xa7, 0x38, 0x70, 0x27, 0x13, 0x77, 0x2a, 0x94, 0x3b, 0x95, 0xd0, 0xb7, 0xa7, 0x81, 0x3d, 0x08, 0xbb, 0x38, 0x70, 0x26, 0x13, 0x67, 0x2a, 0x94, 0xdb, 0x95, 0xc0, 0xb3, 0xa6, 0xbe, 0x35, 0x08,
0x1d, 0xa5, 0xc2, 0x5f, 0xc2, 0xc6, 0x8b, 0x57, 0x4f, 0xa8, 0xef, 0x9c, 0x9c, 0x3f, 0xa4, 0xe7, 0x6c, 0xa5, 0xc2, 0x5f, 0xc1, 0xc6, 0xcb, 0xd7, 0x4f, 0xa9, 0x67, 0x9f, 0x9c, 0x3f, 0xa6, 0xe7,
0xe8, 0x63, 0xc8, 0xb0, 0x8e, 0x55, 0x6b, 0xd7, 0xda, 0xdb, 0xac, 0x55, 0x0e, 0xf8, 0x28, 0x07, 0xe8, 0xff, 0x21, 0xc3, 0x3a, 0x56, 0x8d, 0x1d, 0x63, 0xb7, 0x5c, 0xab, 0xec, 0xf3, 0x51, 0xf6,
0xa2, 0xbd, 0x7f, 0xee, 0x51, 0xc2, 0x9b, 0xd1, 0x75, 0xc8, 0x9e, 0xd9, 0xe3, 0x19, 0xad, 0xa6, 0x45, 0x7b, 0xff, 0xdc, 0xa5, 0x84, 0x37, 0xa3, 0xeb, 0x90, 0x3d, 0xb3, 0xc6, 0x33, 0x5a, 0x4d,
0x76, 0xad, 0xbd, 0x02, 0x11, 0x02, 0xbe, 0x07, 0x45, 0x6d, 0xac, 0x00, 0xdd, 0x82, 0xcc, 0xd0, 0xed, 0x18, 0xbb, 0x05, 0x22, 0x04, 0xfc, 0x00, 0x8a, 0xda, 0x58, 0x3e, 0xba, 0x0d, 0x99, 0xa1,
0x0e, 0xed, 0xaa, 0xb5, 0x9b, 0xde, 0xdb, 0xa8, 0x21, 0x39, 0x98, 0x06, 0x21, 0xbc, 0x1d, 0x7f, 0x15, 0x58, 0x55, 0x63, 0x27, 0xbd, 0xbb, 0x51, 0x43, 0x72, 0x30, 0x0d, 0x42, 0x78, 0x3b, 0xbe,
0x0b, 0x36, 0xea, 0xb3, 0x70, 0xd4, 0x9d, 0xbd, 0xe4, 0xdd, 0x90, 0xd6, 0xad, 0x20, 0x21, 0x2e, 0x09, 0x1b, 0xf5, 0x59, 0x30, 0xea, 0xce, 0x5e, 0xf1, 0x6e, 0x26, 0xa4, 0xdd, 0xd7, 0x3e, 0xef,
0x40, 0xd7, 0x3e, 0x9f, 0xd0, 0x69, 0xc8, 0xac, 0x44, 0x90, 0xb1, 0x87, 0x43, 0x9f, 0x5b, 0x59, 0x55, 0x20, 0xec, 0x13, 0x3b, 0x00, 0x5d, 0xeb, 0x7c, 0x42, 0xa7, 0x01, 0xb3, 0x11, 0x41, 0xc6,
0x20, 0xfc, 0x1b, 0xed, 0xc2, 0x86, 0x4f, 0x07, 0xd4, 0x39, 0xa3, 0xfe, 0x43, 0x7a, 0x2e, 0x0d, 0x1a, 0x0e, 0x3d, 0x6e, 0x63, 0x81, 0xf0, 0x6f, 0xb4, 0x03, 0x1b, 0x1e, 0x1d, 0x50, 0xfb, 0x8c,
0xd3, 0x55, 0xe8, 0x36, 0x14, 0x02, 0x3a, 0xf0, 0x29, 0x1b, 0xa2, 0x9a, 0xde, 0xb5, 0xf6, 0x36, 0x7a, 0x8f, 0xe9, 0xb9, 0x34, 0x4b, 0x57, 0xa1, 0xbb, 0x50, 0xf0, 0xe9, 0xc0, 0xa3, 0x6c, 0x88,
0x6a, 0x25, 0x69, 0x93, 0x98, 0x9a, 0xc4, 0xed, 0xf8, 0x5f, 0x16, 0x6c, 0x1d, 0x39, 0xf3, 0xfb, 0x6a, 0x7a, 0xc7, 0xd8, 0xdd, 0xa8, 0x95, 0xa4, 0x45, 0x62, 0x62, 0x12, 0xb5, 0xe3, 0x7f, 0x19,
0xee, 0xf4, 0xc4, 0x39, 0xad, 0x73, 0xc6, 0xd0, 0x4d, 0x48, 0xf5, 0xcf, 0x25, 0x35, 0xd7, 0x65, 0xb0, 0x79, 0x68, 0xcf, 0x1f, 0x3a, 0xd3, 0x13, 0xfb, 0xb4, 0xce, 0xf9, 0x42, 0xb7, 0x20, 0xd5,
0xcf, 0x08, 0xc3, 0xd9, 0x49, 0xf5, 0xd9, 0x34, 0x39, 0x81, 0xe7, 0x36, 0x6c, 0xd6, 0xae, 0x25, 0x3f, 0x97, 0xc4, 0x5c, 0x97, 0x3d, 0x43, 0x0c, 0xe7, 0x26, 0xd5, 0x67, 0xd3, 0xe4, 0x04, 0x9e,
0x91, 0xf5, 0x41, 0x48, 0x24, 0x04, 0xd5, 0xa0, 0x70, 0xa6, 0xd8, 0x90, 0x36, 0x2d, 0xe1, 0xa9, 0xdb, 0x50, 0xae, 0x5d, 0x4b, 0x22, 0xeb, 0x83, 0x80, 0x48, 0x08, 0xaa, 0x41, 0xe1, 0x4c, 0x71,
0xb5, 0x46, 0x62, 0x18, 0xaa, 0x42, 0xce, 0x66, 0x74, 0xbd, 0xaa, 0x66, 0x98, 0x93, 0xad, 0x35, 0x21, 0x6d, 0x5a, 0xc2, 0x52, 0x6b, 0x8d, 0x44, 0x30, 0x54, 0x85, 0x9c, 0xc5, 0xc8, 0x7a, 0x5d,
0x22, 0x65, 0x74, 0x07, 0xc0, 0x8b, 0x58, 0xaa, 0x66, 0xf9, 0x70, 0x2a, 0x86, 0x31, 0x7d, 0xad, 0xcd, 0x30, 0x27, 0x5b, 0x6b, 0x44, 0xca, 0xe8, 0x1e, 0x80, 0x1b, 0xb2, 0x54, 0xcd, 0xf2, 0xe1,
0x35, 0xa2, 0xc1, 0x7e, 0x9c, 0x97, 0xb1, 0xc4, 0xf7, 0x61, 0xbd, 0xd1, 0xea, 0x71, 0x06, 0xd0, 0x54, 0x04, 0x23, 0xfa, 0x5a, 0x6b, 0x44, 0x83, 0xfd, 0x38, 0x2f, 0x23, 0x89, 0x1f, 0xc2, 0x7a,
0xff, 0x43, 0x9a, 0x7a, 0xaf, 0xb8, 0xaf, 0x0b, 0x2c, 0xb1, 0x16, 0xb4, 0x0d, 0x39, 0x41, 0x16, 0xa3, 0xd5, 0xe3, 0x0c, 0xa0, 0x9b, 0x90, 0xa6, 0xee, 0x6b, 0xee, 0xeb, 0x02, 0x4b, 0xac, 0x05,
0xb7, 0xba, 0x40, 0xa4, 0x84, 0x29, 0x94, 0xd4, 0x20, 0x0f, 0x7c, 0x77, 0xe6, 0xa1, 0x1d, 0x58, 0x6d, 0x41, 0x4e, 0x90, 0xc5, 0xad, 0x2e, 0x10, 0x29, 0x61, 0x0a, 0x25, 0x35, 0xc8, 0x23, 0xcf,
0x57, 0x41, 0x90, 0xf1, 0x8a, 0x64, 0xd1, 0x16, 0xce, 0xfc, 0x29, 0xf5, 0x65, 0xc0, 0x22, 0x19, 0x99, 0xb9, 0x68, 0x1b, 0xd6, 0x55, 0x10, 0x64, 0xbc, 0x42, 0x59, 0xb4, 0x05, 0x33, 0x6f, 0x4a,
0xfd, 0x1f, 0x14, 0x98, 0x57, 0xae, 0xef, 0xfc, 0x9c, 0xca, 0x39, 0x62, 0x05, 0x9e, 0xb1, 0xb4, 0x3d, 0x19, 0xb0, 0x50, 0x46, 0xff, 0x07, 0x05, 0xe6, 0x95, 0xe3, 0xd9, 0x3f, 0xa7, 0x72, 0x8e,
0xed, 0xfa, 0xae, 0x7b, 0xd2, 0x9e, 0x9e, 0xb8, 0x2c, 0x1f, 0x3d, 0x26, 0xc8, 0x19, 0x84, 0xc0, 0x48, 0x81, 0x67, 0x2c, 0x69, 0xbb, 0x9e, 0xe3, 0x9c, 0xb4, 0xa7, 0x27, 0x0e, 0xcb, 0x46, 0x97,
0x52, 0xc2, 0x9b, 0xbd, 0x1c, 0x3b, 0x83, 0xf6, 0xd4, 0x9b, 0x85, 0x2a, 0x25, 0x34, 0x15, 0x3a, 0x09, 0x72, 0x06, 0x21, 0xb0, 0x94, 0x70, 0x67, 0xaf, 0xc6, 0xf6, 0xa0, 0x3d, 0x75, 0x67, 0x81,
0x80, 0xbc, 0xb0, 0x3b, 0x90, 0xe4, 0xab, 0xb0, 0x1a, 0x3e, 0x10, 0x05, 0xc2, 0x7d, 0x28, 0x1f, 0x4a, 0x09, 0x4d, 0x85, 0xf6, 0x21, 0x2f, 0xec, 0xf6, 0x25, 0xf9, 0x2a, 0xac, 0x31, 0x1f, 0x88,
0x39, 0xf3, 0x06, 0xf5, 0xdc, 0xc0, 0x09, 0x65, 0x08, 0xb7, 0x21, 0x67, 0x4f, 0xdc, 0xd9, 0x34, 0x02, 0xe1, 0x3e, 0x98, 0x87, 0xf6, 0xbc, 0x41, 0x5d, 0xc7, 0xb7, 0x03, 0x19, 0xc2, 0x2d, 0xc8,
0xe4, 0x93, 0x67, 0x88, 0x94, 0xd0, 0x9e, 0xb2, 0x29, 0x95, 0x08, 0x6b, 0x64, 0xb6, 0xb4, 0x13, 0x59, 0x13, 0x67, 0x36, 0x0d, 0xf8, 0xe4, 0x19, 0x22, 0x25, 0xb4, 0xab, 0x6c, 0x4a, 0x25, 0xc2,
0xff, 0xce, 0x82, 0xca, 0x91, 0x33, 0xef, 0xb3, 0xc5, 0x79, 0x42, 0x7d, 0x39, 0xee, 0x1e, 0x64, 0x1a, 0x9a, 0x2d, 0xed, 0xc4, 0xbf, 0x33, 0xa0, 0x72, 0x68, 0xcf, 0xfb, 0x6c, 0x69, 0x9e, 0x50,
0x1d, 0x6e, 0xb7, 0xb5, 0xba, 0x3f, 0x07, 0xa0, 0x7d, 0xc8, 0xb9, 0xb3, 0x50, 0xb9, 0xb8, 0x1c, 0x4f, 0x8e, 0xbb, 0x0b, 0x59, 0x9b, 0xdb, 0x6d, 0xac, 0xee, 0xcf, 0x01, 0x68, 0x0f, 0x72, 0xce,
0x2a, 0x11, 0x0c, 0x3b, 0x18, 0xd9, 0xd3, 0x53, 0xba, 0x90, 0x6d, 0x1a, 0x56, 0x20, 0xf0, 0x80, 0x2c, 0x50, 0x2e, 0x2e, 0x87, 0x4a, 0x04, 0xc3, 0x0e, 0x46, 0xd6, 0xf4, 0x94, 0x2e, 0x64, 0x9b,
0x9b, 0xf5, 0xd4, 0x09, 0x47, 0x43, 0xdf, 0x7e, 0x73, 0x81, 0xbb, 0xf7, 0xa0, 0x18, 0x78, 0x74, 0x86, 0x15, 0x08, 0x3c, 0xe0, 0x66, 0x3d, 0xb3, 0x83, 0xd1, 0xd0, 0xb3, 0xde, 0x5e, 0xe0, 0xee,
0x3a, 0xbc, 0xef, 0x4e, 0x26, 0x4e, 0x18, 0x54, 0x53, 0x89, 0x45, 0x1f, 0x0f, 0x6f, 0xe0, 0xf0, 0x03, 0x28, 0xfa, 0x2e, 0x9d, 0x0e, 0x1f, 0x3a, 0x93, 0x89, 0x1d, 0xf8, 0xd5, 0x54, 0x62, 0xc9,
0x97, 0x80, 0x8e, 0x9c, 0x79, 0x5d, 0x45, 0x56, 0xce, 0x72, 0x17, 0x36, 0x58, 0xb0, 0xd5, 0x60, 0x47, 0xc3, 0xc7, 0x70, 0xf8, 0x2b, 0x40, 0x87, 0xf6, 0xbc, 0xae, 0x22, 0x2b, 0x67, 0xb9, 0x0f,
0xd6, 0xca, 0xc1, 0x74, 0x18, 0xfe, 0x73, 0x0a, 0x0a, 0x6c, 0x30, 0x31, 0xc6, 0x26, 0xa4, 0x42, 0x1b, 0x2c, 0xd8, 0x6a, 0x30, 0x63, 0xe5, 0x60, 0x3a, 0x0c, 0xff, 0x39, 0x05, 0x05, 0x36, 0x98,
0xb1, 0x5c, 0xb3, 0x24, 0x15, 0x9e, 0xa3, 0xcf, 0x20, 0x37, 0xe0, 0x0b, 0x50, 0xd2, 0xb4, 0xbd, 0x18, 0xa3, 0x0c, 0xa9, 0x40, 0x2c, 0xd7, 0x2c, 0x49, 0x05, 0xe7, 0xe8, 0x33, 0xc8, 0x0d, 0xf8,
0x64, 0x61, 0x3a, 0xee, 0x94, 0xad, 0x27, 0x81, 0x43, 0x77, 0x20, 0x3f, 0x14, 0xb1, 0x96, 0x6c, 0x02, 0x94, 0x34, 0x6d, 0x2d, 0x59, 0x98, 0xb6, 0x33, 0x65, 0xeb, 0x49, 0xe0, 0xd0, 0x3d, 0xc8,
0xbd, 0x1f, 0x77, 0x31, 0x92, 0xa0, 0xb5, 0x46, 0x14, 0x12, 0xdd, 0x83, 0xf5, 0x37, 0x92, 0x32, 0x0f, 0x45, 0xac, 0x25, 0x5b, 0x1f, 0x46, 0x5d, 0x62, 0x49, 0xd0, 0x5a, 0x23, 0x0a, 0x89, 0x1e,
0xbe, 0x40, 0x37, 0x6a, 0xd5, 0xb8, 0x97, 0x49, 0x66, 0x6b, 0x8d, 0x44, 0x58, 0xd6, 0x2f, 0x94, 0xc0, 0xfa, 0x5b, 0x49, 0x19, 0x5f, 0xa0, 0x1b, 0xb5, 0x6a, 0xd4, 0x2b, 0x4e, 0x66, 0x6b, 0x8d,
0x19, 0x20, 0x97, 0xae, 0xd6, 0xcf, 0xcc, 0x0d, 0xd6, 0x4f, 0x61, 0xd1, 0x0f, 0xf5, 0x85, 0x92, 0x84, 0x58, 0xd6, 0x2f, 0x90, 0x19, 0x20, 0x97, 0xae, 0xd6, 0x2f, 0x9e, 0x1b, 0xac, 0x9f, 0xc2,
0xe3, 0x1d, 0x3f, 0x88, 0x3b, 0x26, 0x88, 0x65, 0x3b, 0x49, 0x84, 0x8e, 0x97, 0x7e, 0x0b, 0x90, 0xa2, 0x1f, 0xea, 0x0b, 0x25, 0xc7, 0x3b, 0xde, 0x88, 0x3a, 0x26, 0x88, 0x65, 0x3b, 0x49, 0x88,
0xf4, 0xa7, 0xab, 0xad, 0x8e, 0x1d, 0x58, 0x9f, 0xba, 0x21, 0x6d, 0xd9, 0xc1, 0x48, 0x2d, 0x5d, 0x8e, 0x96, 0x7e, 0x0b, 0x90, 0xf4, 0xa7, 0xab, 0xad, 0x8e, 0x6d, 0x58, 0x9f, 0x3a, 0x01, 0x6d,
0x25, 0x6b, 0x69, 0x20, 0x96, 0x95, 0x94, 0xf0, 0x1f, 0x2d, 0xb8, 0xa6, 0x9c, 0xd4, 0xc7, 0xc2, 0x59, 0xfe, 0x48, 0x2d, 0x5d, 0x25, 0x6b, 0x69, 0x20, 0x96, 0x95, 0x94, 0xf0, 0x1f, 0x0d, 0xb8,
0x50, 0x0c, 0x7d, 0x4a, 0x89, 0xeb, 0x86, 0xda, 0x78, 0x86, 0x0e, 0xdd, 0x84, 0xd2, 0x74, 0x36, 0xa6, 0x9c, 0xd4, 0xc7, 0xc2, 0x50, 0x0c, 0x3c, 0x4a, 0x89, 0xe3, 0x04, 0xda, 0x78, 0x31, 0x1d,
0x1e, 0x3b, 0x27, 0x0e, 0xf5, 0x39, 0x48, 0x0c, 0x6d, 0x2a, 0xd1, 0x01, 0xa0, 0xc8, 0x83, 0x1e, 0xba, 0x05, 0xa5, 0xe9, 0x6c, 0x3c, 0xb6, 0x4f, 0x6c, 0xea, 0x71, 0x90, 0x18, 0x3a, 0xae, 0x44,
0xcb, 0x24, 0x0e, 0x15, 0x3b, 0xc4, 0x92, 0x16, 0xcd, 0xd2, 0x8c, 0x61, 0xe9, 0xdf, 0x2d, 0xa8, 0xfb, 0x80, 0x42, 0x0f, 0x7a, 0x2c, 0x93, 0x38, 0x54, 0xec, 0x10, 0x4b, 0x5a, 0x34, 0x4b, 0x33,
0x2a, 0x5a, 0xb9, 0x8d, 0xef, 0x60, 0x6e, 0x30, 0x72, 0xe8, 0x78, 0x58, 0xe7, 0x03, 0x3e, 0x53, 0x31, 0x4b, 0xff, 0x6e, 0x40, 0x55, 0xd1, 0xca, 0x6d, 0x7c, 0x0f, 0x73, 0xfd, 0x91, 0x4d, 0xc7,
0xe6, 0x1a, 0xca, 0x24, 0xea, 0xb9, 0xb4, 0xd4, 0x54, 0xae, 0x70, 0x2a, 0xb3, 0xd2, 0xa9, 0x05, 0xc3, 0x3a, 0x1f, 0xf0, 0xb9, 0x32, 0x37, 0xa6, 0x4c, 0xa2, 0x5e, 0x48, 0x4b, 0xe3, 0xca, 0x15,
0xaa, 0xb2, 0x4b, 0xa8, 0xc2, 0xbf, 0xb4, 0xe0, 0x03, 0xe5, 0xe2, 0x31, 0x5f, 0xff, 0x97, 0x0d, 0x4e, 0x65, 0x56, 0x3a, 0xb5, 0x40, 0x55, 0x76, 0x09, 0x55, 0xf8, 0x97, 0x06, 0xdc, 0x50, 0x2e,
0xef, 0x37, 0xe8, 0x1b, 0xfe, 0x8b, 0x05, 0xd7, 0xa3, 0x34, 0xbc, 0x2a, 0xc9, 0x7b, 0xb0, 0x65, 0x1e, 0xf1, 0xf5, 0x7f, 0xd9, 0xf0, 0x7e, 0x8b, 0xbe, 0xe1, 0xbf, 0x18, 0x70, 0x3d, 0x4c, 0xc3,
0x6b, 0x7d, 0xe3, 0xa3, 0x3d, 0xa9, 0x66, 0xc6, 0x44, 0x2a, 0x2d, 0x25, 0x4c, 0xe5, 0x55, 0x89, 0xab, 0x92, 0xbc, 0x0b, 0x9b, 0x96, 0xd6, 0x37, 0x3a, 0xda, 0x93, 0x6a, 0x66, 0x4c, 0xa8, 0xd2,
0xc6, 0xbb, 0x00, 0xcd, 0xb9, 0x13, 0x84, 0x4f, 0xd8, 0x3a, 0xd1, 0x4a, 0x13, 0x6b, 0x6f, 0x5d, 0x52, 0x22, 0xae, 0xbc, 0x2a, 0xd1, 0x78, 0x07, 0xa0, 0x39, 0xb7, 0xfd, 0xe0, 0x29, 0x5b, 0x27,
0x96, 0x26, 0xb7, 0xa0, 0x2c, 0xf6, 0x9f, 0xbe, 0x4f, 0xe9, 0x23, 0x6a, 0x9f, 0x51, 0xb3, 0x84, 0xac, 0xf0, 0x90, 0xf5, 0x8c, 0xb1, 0xbb, 0x2e, 0x6b, 0x97, 0x3d, 0x30, 0xc5, 0xfe, 0xd3, 0xf7,
0x29, 0x4a, 0xdc, 0xc7, 0xb0, 0x15, 0xe3, 0x98, 0x7f, 0xcb, 0x61, 0x7f, 0xb0, 0x74, 0x5c, 0xd7, 0x28, 0x7d, 0x42, 0xad, 0x33, 0xea, 0xb3, 0x9c, 0x1b, 0xf3, 0x2f, 0xbe, 0x73, 0x15, 0x89, 0x94,
0x77, 0xcf, 0x28, 0x3f, 0x27, 0x4d, 0x92, 0x22, 0x99, 0xb5, 0xf1, 0x53, 0xa4, 0x47, 0x43, 0xbe, 0xf0, 0x1d, 0xd8, 0x8c, 0xb0, 0xcc, 0x47, 0x9f, 0x1d, 0x5d, 0x1e, 0xfb, 0x90, 0x48, 0x21, 0xe0,
0xe7, 0x16, 0x48, 0x24, 0xa3, 0x1b, 0x00, 0x9e, 0xd8, 0x29, 0x87, 0x74, 0xce, 0xf9, 0x28, 0x11, 0x3f, 0x18, 0x3a, 0xb2, 0xeb, 0x39, 0x67, 0x94, 0x9f, 0x96, 0x71, 0xaa, 0x42, 0x99, 0xb5, 0xf1,
0x4d, 0xc3, 0xce, 0xd8, 0xe9, 0x6c, 0x22, 0x6c, 0xe6, 0x1c, 0x94, 0x48, 0xac, 0x40, 0x55, 0xc8, 0xb3, 0xa4, 0x47, 0x03, 0xbe, 0xf3, 0x16, 0x48, 0x28, 0xa3, 0x8f, 0x01, 0x5c, 0xb1, 0x5f, 0x0e,
0x8f, 0xe8, 0xd8, 0xa3, 0x7e, 0x50, 0xcd, 0xee, 0xa6, 0xf7, 0x4a, 0x44, 0x89, 0xb8, 0x09, 0x1b, 0xe9, 0x9c, 0xb3, 0x52, 0x22, 0x9a, 0x86, 0x9d, 0xb4, 0xd3, 0xd9, 0x44, 0x58, 0xce, 0x99, 0x28,
0xcc, 0x38, 0xbe, 0x01, 0xd3, 0xd7, 0x17, 0x99, 0x37, 0xa6, 0xf6, 0x89, 0xb6, 0x9c, 0x23, 0x19, 0x91, 0x48, 0x81, 0xaa, 0x90, 0x1f, 0xd1, 0xb1, 0x4b, 0x3d, 0xbf, 0x9a, 0xdd, 0x49, 0xef, 0x96,
0xdf, 0x84, 0x22, 0xe7, 0xcc, 0x09, 0x42, 0x42, 0x03, 0x8f, 0x9d, 0xe2, 0x8c, 0x82, 0x40, 0x56, 0x88, 0x12, 0x71, 0x13, 0x36, 0x98, 0x71, 0x7c, 0x1b, 0xa6, 0x6f, 0x2e, 0x32, 0x6f, 0x4c, 0xad,
0x7e, 0x42, 0xc0, 0x2f, 0x60, 0x33, 0xae, 0x5d, 0xba, 0xb6, 0xe3, 0xa3, 0x5b, 0xb0, 0xa9, 0x4a, 0x13, 0x6d, 0x51, 0x87, 0x32, 0xbe, 0x0d, 0x45, 0xce, 0x9c, 0xed, 0x07, 0x84, 0xfa, 0x6e, 0x82,
0x08, 0x99, 0x12, 0x62, 0xd6, 0x84, 0x96, 0x9d, 0xff, 0xfc, 0xa8, 0xe9, 0xfa, 0x8e, 0x56, 0x12, 0xbb, 0x42, 0xc8, 0xdd, 0x4b, 0x28, 0x47, 0x35, 0x4c, 0xd7, 0xb2, 0x3d, 0x74, 0x1b, 0xca, 0xaa,
0x6a, 0x2a, 0x7c, 0x13, 0x72, 0x12, 0x5b, 0x04, 0xeb, 0x99, 0x1c, 0xc6, 0x7a, 0xc6, 0xa4, 0xe7, 0x94, 0x90, 0xa9, 0x21, 0xe6, 0x4d, 0x68, 0x59, 0x1d, 0xc0, 0x8f, 0x9c, 0xae, 0x67, 0x6b, 0xa5,
0x12, 0x6f, 0x3d, 0xc7, 0x1f, 0x42, 0xbe, 0xeb, 0x3b, 0x67, 0xb2, 0xf2, 0x8c, 0x12, 0x20, 0xae, 0xa1, 0xa6, 0xc2, 0xb7, 0x20, 0x27, 0xb1, 0x45, 0x30, 0x9e, 0xcb, 0x61, 0x8c, 0xe7, 0x4c, 0x7a,
0x4d, 0x51, 0x6f, 0x64, 0xfb, 0xb4, 0xa7, 0x8a, 0x47, 0x6e, 0xe4, 0x1e, 0xe4, 0x3d, 0xd1, 0x49, 0x21, 0xf1, 0xc6, 0x0b, 0xfc, 0x11, 0xe4, 0xbb, 0x9e, 0x7d, 0x26, 0x2b, 0xd0, 0x30, 0x11, 0x0a,
0x1e, 0xe0, 0x9b, 0xaa, 0x8a, 0x12, 0x5a, 0xa2, 0x9a, 0xd1, 0xa7, 0xaa, 0x72, 0x75, 0xa6, 0xa7, 0x32, 0x11, 0x1c, 0x40, 0xbd, 0x91, 0xe5, 0xd1, 0x9e, 0x2a, 0x22, 0xb9, 0x91, 0xbb, 0x90, 0x77,
0xdd, 0x57, 0xf2, 0x70, 0x4a, 0xd4, 0x5c, 0x3a, 0x02, 0xff, 0xc6, 0x82, 0x4a, 0x7d, 0x30, 0x60, 0x45, 0x27, 0x79, 0x90, 0x97, 0x55, 0x35, 0x25, 0xb4, 0x44, 0x35, 0xa3, 0x4f, 0x55, 0x05, 0x6b,
0xab, 0x8b, 0x0d, 0x66, 0x0f, 0x78, 0x59, 0xf8, 0x3d, 0xa3, 0xf8, 0x13, 0x73, 0xbe, 0xb7, 0x50, 0x4f, 0x4f, 0xbb, 0xaf, 0xe5, 0x21, 0x95, 0xa8, 0xbd, 0x74, 0x04, 0xfe, 0x8d, 0x01, 0x95, 0xfa,
0xfc, 0x31, 0xdb, 0xf4, 0xf2, 0x0f, 0xd5, 0x61, 0x33, 0x30, 0xac, 0x97, 0x06, 0xa8, 0x33, 0x64, 0x60, 0xc0, 0x56, 0x19, 0x1b, 0xcc, 0x1a, 0xf0, 0xf2, 0xf0, 0x7b, 0xb1, 0x22, 0x50, 0xcc, 0xf9,
0xd1, 0x35, 0x92, 0xe8, 0x80, 0x7f, 0x02, 0x95, 0xa7, 0xf6, 0x78, 0x4c, 0xc3, 0xfa, 0x70, 0xe8, 0xc1, 0x42, 0x11, 0xc8, 0x6c, 0xd3, 0xcb, 0x40, 0x54, 0x87, 0xb2, 0x1f, 0xb3, 0x5e, 0x1a, 0xa0,
0x4b, 0x8b, 0x50, 0x4d, 0xf8, 0x6f, 0x0f, 0x94, 0x2d, 0xea, 0x34, 0x5b, 0xb0, 0x9c, 0x28, 0x60, 0xce, 0x92, 0x45, 0xd7, 0x48, 0xa2, 0x03, 0xfe, 0x09, 0x54, 0x9e, 0x59, 0xe3, 0x31, 0x0d, 0xea,
0x54, 0xd7, 0xa7, 0xe2, 0xba, 0x9e, 0xed, 0x1e, 0x20, 0xa6, 0x6a, 0xd8, 0xa1, 0x7d, 0xe9, 0xd8, 0xc3, 0xa1, 0x27, 0x2d, 0x42, 0x35, 0xe1, 0xbf, 0x35, 0x50, 0xb6, 0xa8, 0x53, 0x6d, 0xc1, 0x72,
0x63, 0x28, 0x8a, 0x52, 0xd2, 0xd8, 0x34, 0x0c, 0xdd, 0xb2, 0xbd, 0x25, 0xbd, 0x7c, 0x6f, 0x59, 0xa2, 0x80, 0x61, 0x7d, 0x9f, 0x8a, 0xea, 0x7b, 0xb6, 0x8b, 0x80, 0x98, 0xaa, 0x61, 0x05, 0xd6,
0x71, 0x86, 0xb0, 0x05, 0xc6, 0xb6, 0x4c, 0x62, 0x4f, 0x87, 0xee, 0x44, 0xee, 0xc1, 0x9a, 0x06, 0xa5, 0x63, 0x8f, 0xa1, 0x28, 0x4a, 0xca, 0xd8, 0xe6, 0x11, 0xd3, 0x2d, 0xdb, 0x63, 0xd2, 0xcb,
0xbf, 0x80, 0x4a, 0x73, 0x3a, 0x70, 0x87, 0x74, 0xa8, 0xb9, 0x50, 0x85, 0x3c, 0x15, 0x4a, 0x69, 0xf7, 0x98, 0x15, 0x67, 0x09, 0x5b, 0x62, 0x6c, 0xeb, 0x24, 0xd6, 0x74, 0xe8, 0x4c, 0xe4, 0x5e,
0xbb, 0x12, 0xd1, 0x6d, 0xc8, 0xfb, 0xf6, 0x1b, 0x06, 0x92, 0x41, 0x50, 0xc5, 0x7b, 0xdc, 0x9b, 0xac, 0x69, 0xf0, 0x4b, 0xa8, 0x34, 0xa7, 0x03, 0x67, 0x48, 0x87, 0x9a, 0x0b, 0x55, 0xc8, 0x53,
0x28, 0x04, 0xfe, 0x19, 0x1f, 0xdb, 0x3f, 0xf7, 0x42, 0x6d, 0xec, 0xb8, 0x2c, 0xb7, 0xf4, 0xb2, 0xa1, 0x94, 0xb6, 0x2b, 0x11, 0xdd, 0x85, 0xbc, 0x67, 0xbd, 0x65, 0x20, 0x19, 0x04, 0x55, 0xc4,
0x1c, 0x7d, 0x17, 0x8a, 0x02, 0xa5, 0xd1, 0xb1, 0x90, 0x64, 0x06, 0x04, 0xff, 0xc2, 0x82, 0x4a, 0x47, 0xbd, 0x89, 0x42, 0xe0, 0x9f, 0xf1, 0xb1, 0xbd, 0x73, 0x37, 0xd0, 0xc6, 0x8e, 0xca, 0x73,
0x83, 0x5e, 0x76, 0x82, 0x5a, 0x34, 0x41, 0xbc, 0xd8, 0x16, 0x73, 0xde, 0xc0, 0xa8, 0x4b, 0x46, 0x43, 0x2f, 0xcf, 0xd1, 0xe7, 0x50, 0x14, 0x28, 0x8d, 0x8e, 0x85, 0x24, 0x8b, 0x41, 0xf0, 0x2f,
0x7a, 0xd5, 0x25, 0x03, 0xff, 0xd6, 0x82, 0x2d, 0x55, 0x97, 0xb0, 0x5d, 0x8b, 0x6d, 0x36, 0x3c, 0x0c, 0xa8, 0x34, 0xe8, 0x65, 0x27, 0xa8, 0x85, 0x13, 0x44, 0x8b, 0x6d, 0x31, 0xe7, 0x63, 0x18,
0xb0, 0x22, 0xd4, 0xf5, 0xf8, 0x0e, 0x68, 0xe8, 0x58, 0x58, 0x44, 0xa0, 0xeb, 0x71, 0x36, 0x69, 0x75, 0xd9, 0x48, 0xaf, 0xba, 0x6c, 0xe0, 0xdf, 0x1a, 0xb0, 0xa9, 0xea, 0x13, 0xb6, 0x6f, 0xb1,
0x1a, 0xe3, 0xa8, 0xe0, 0x90, 0xe4, 0x51, 0xc1, 0x51, 0x66, 0xd0, 0xa3, 0x4a, 0x17, 0x7f, 0x65, 0xed, 0x86, 0x07, 0x56, 0x84, 0xba, 0x1e, 0xdd, 0x05, 0x63, 0x3a, 0x16, 0x16, 0x11, 0xe8, 0x7a,
0x41, 0xd9, 0xb4, 0x2a, 0xf0, 0xde, 0x7a, 0x98, 0x7e, 0x62, 0xde, 0x04, 0x96, 0x04, 0x55, 0x5e, 0x94, 0x4d, 0x9a, 0x26, 0x76, 0x64, 0x70, 0x48, 0xf2, 0xc8, 0xe0, 0xa8, 0x78, 0xd0, 0xc3, 0x8a,
0x58, 0xae, 0x7a, 0x1d, 0xf9, 0xca, 0x82, 0x12, 0x3f, 0x25, 0xec, 0x70, 0xc4, 0x4d, 0xb9, 0xd4, 0x17, 0x7f, 0x6d, 0x80, 0x19, 0xb7, 0xca, 0x77, 0xdf, 0x79, 0xa8, 0xde, 0x89, 0xdf, 0x08, 0x96,
0x91, 0xba, 0xc3, 0x0a, 0x4d, 0xd1, 0x49, 0x9d, 0x18, 0x4a, 0xd6, 0xf7, 0xfc, 0xb4, 0xb1, 0xe7, 0x04, 0x55, 0x5e, 0x5c, 0xae, 0x7a, 0x2d, 0xf9, 0xda, 0x80, 0x12, 0x3f, 0x27, 0xac, 0x60, 0xc4,
0xb3, 0xb3, 0xe2, 0xcc, 0x1e, 0x3b, 0x43, 0xde, 0x2d, 0xc3, 0xdb, 0x62, 0x05, 0x3e, 0x80, 0x72, 0x4d, 0xb9, 0xd4, 0xd1, 0xba, 0xcd, 0x0a, 0x4e, 0xd1, 0x49, 0x9d, 0x19, 0x4a, 0xd6, 0x77, 0xfd,
0x54, 0xf5, 0xa9, 0x48, 0xbd, 0x85, 0x12, 0xfc, 0xd7, 0x14, 0x54, 0x12, 0x1d, 0x02, 0x0f, 0x7d, 0x74, 0x6c, 0xd7, 0x67, 0xa7, 0xc5, 0x99, 0x35, 0xb6, 0x87, 0xbc, 0x5b, 0x86, 0xb7, 0x45, 0x0a,
0xdb, 0x48, 0xae, 0xa5, 0x4c, 0xa9, 0x7c, 0xfb, 0xef, 0xd4, 0x8a, 0xba, 0xc9, 0x99, 0x44, 0x14, 0xbc, 0x0f, 0x66, 0x58, 0xfd, 0xa9, 0x48, 0xbd, 0x83, 0x12, 0xfc, 0xd7, 0x14, 0x54, 0x12, 0x1d,
0xb1, 0xbc, 0xe0, 0xc8, 0x5c, 0x96, 0xab, 0xdd, 0xd0, 0x31, 0x92, 0xb8, 0x7c, 0x38, 0xb6, 0x4f, 0x7c, 0x17, 0x7d, 0x27, 0x96, 0x5c, 0x4b, 0x99, 0x52, 0xf9, 0xf6, 0xdf, 0xa9, 0x19, 0x75, 0x93,
0x79, 0x2d, 0x5e, 0x22, 0xb1, 0xc2, 0x48, 0x3b, 0x8e, 0xc8, 0x73, 0x84, 0xa9, 0x44, 0x35, 0x28, 0x33, 0x89, 0x28, 0x62, 0x79, 0xd1, 0x91, 0xb9, 0x2c, 0x57, 0x7b, 0x4c, 0xc7, 0x48, 0xe2, 0xf2,
0x84, 0xe2, 0xe4, 0x77, 0x4f, 0xaa, 0xeb, 0x46, 0x1a, 0x18, 0xb1, 0x26, 0x31, 0x0c, 0x1f, 0x42, 0xc1, 0xd8, 0x3a, 0xe5, 0x35, 0x79, 0x81, 0x44, 0x8a, 0x58, 0xda, 0x71, 0x44, 0x3e, 0x91, 0x76,
0x91, 0xbf, 0xa0, 0x5c, 0x82, 0x7a, 0x1e, 0x7e, 0x97, 0xf0, 0xc5, 0xc0, 0x49, 0x2b, 0x91, 0x48, 0x1c, 0x55, 0x83, 0x42, 0x20, 0xce, 0x7e, 0xe7, 0xa4, 0xba, 0x1e, 0x4b, 0x83, 0x58, 0xac, 0x49,
0xc6, 0x5f, 0xa7, 0xa0, 0xa4, 0x0d, 0x14, 0x78, 0x71, 0xee, 0x5a, 0x17, 0xe4, 0xee, 0x0d, 0x00, 0x04, 0xc3, 0x07, 0x50, 0xe4, 0xef, 0x28, 0x97, 0xa0, 0x9e, 0x87, 0xdf, 0x21, 0x7c, 0x31, 0x70,
0x3b, 0x7a, 0xc4, 0x51, 0x6b, 0x2e, 0xd6, 0xb0, 0xc3, 0x98, 0x4b, 0x92, 0x3d, 0x11, 0x03, 0x5d, 0xd2, 0x4a, 0x24, 0x94, 0xf1, 0x37, 0x29, 0x28, 0x69, 0x03, 0xf9, 0x6e, 0x94, 0xbb, 0xc6, 0x05,
0xc5, 0x0c, 0x63, 0xa2, 0x4e, 0xbe, 0x92, 0x57, 0x04, 0x32, 0x7b, 0xa9, 0x40, 0xe6, 0x12, 0x04, 0xb9, 0xfb, 0x31, 0x80, 0x15, 0x3e, 0xe5, 0xa8, 0x35, 0x17, 0x69, 0xd8, 0x61, 0xcc, 0x25, 0xc9,
0x18, 0x41, 0xca, 0x27, 0x83, 0xf4, 0x2e, 0xf4, 0xff, 0xde, 0x82, 0xb2, 0xaa, 0xb3, 0x2f, 0x15, 0x9e, 0x88, 0x81, 0xae, 0x62, 0x86, 0x31, 0x51, 0x27, 0x5f, 0xc9, 0x2b, 0x02, 0x99, 0xbd, 0x54,
0x83, 0x6d, 0xc8, 0x85, 0xae, 0xb6, 0x39, 0x49, 0x89, 0x91, 0x18, 0xba, 0x2c, 0x00, 0xda, 0xae, 0x20, 0x73, 0x09, 0x02, 0x62, 0x41, 0xca, 0x27, 0x83, 0xf4, 0x3e, 0xf4, 0xff, 0xde, 0x00, 0x53,
0xa4, 0x69, 0x12, 0x1b, 0x5b, 0x66, 0x61, 0x63, 0x8b, 0xb7, 0xac, 0xac, 0xb1, 0x65, 0xed, 0x43, 0xd5, 0xdb, 0x97, 0x8a, 0xc1, 0x16, 0xe4, 0x02, 0x47, 0xdb, 0x9c, 0xa4, 0xc4, 0x48, 0x0c, 0x1c,
0xb1, 0xa7, 0xd5, 0xe4, 0x6f, 0xad, 0x76, 0xfe, 0x94, 0x06, 0x64, 0xde, 0x8b, 0x78, 0x7c, 0x2f, 0x16, 0x00, 0x6d, 0x57, 0xd2, 0x34, 0x89, 0x8d, 0x2d, 0xb3, 0xb0, 0xb1, 0x45, 0x5b, 0x56, 0x36,
0x9d, 0x08, 0xff, 0x5b, 0x99, 0x5a, 0x6a, 0xa0, 0xef, 0x43, 0x51, 0xbf, 0x0d, 0x55, 0x0b, 0xbc, 0xb6, 0x65, 0xed, 0x41, 0xb1, 0xa7, 0xd5, 0xe6, 0xef, 0xac, 0x76, 0xfe, 0x94, 0x06, 0x14, 0xbf,
0xdb, 0xb5, 0xa8, 0xb8, 0x8a, 0x9b, 0x88, 0x01, 0x64, 0x4e, 0x89, 0xe0, 0xc9, 0xe2, 0x02, 0x84, 0x1f, 0xf1, 0xf8, 0x5e, 0x3a, 0x11, 0xfe, 0xb7, 0x32, 0xb5, 0xd4, 0x40, 0xdf, 0x87, 0xa2, 0x7e,
0x53, 0xba, 0x0e, 0xff, 0xd3, 0x82, 0x6b, 0x89, 0xfb, 0xdd, 0xd5, 0x62, 0xa5, 0xb3, 0x9a, 0x4a, 0x2b, 0xaa, 0x16, 0x78, 0xb7, 0x6b, 0x61, 0x71, 0x15, 0x35, 0x91, 0x18, 0x90, 0x39, 0x25, 0x82,
0xb0, 0x7a, 0xc5, 0xc3, 0x68, 0xc1, 0xd3, 0xcc, 0xbb, 0x7a, 0x9a, 0x5d, 0xe2, 0xe9, 0xdf, 0x2c, 0x27, 0x8b, 0x0b, 0x10, 0x4e, 0xe9, 0x3a, 0xfc, 0x4f, 0x03, 0xae, 0x25, 0xee, 0x79, 0x57, 0x8b,
0xa8, 0x24, 0x56, 0x58, 0xe0, 0xa1, 0x2f, 0xa0, 0x14, 0xea, 0x99, 0x2a, 0xfd, 0xfd, 0x20, 0x0a, 0x95, 0xce, 0x6a, 0x2a, 0xc1, 0xea, 0x15, 0x0f, 0xa3, 0x05, 0x4f, 0x33, 0xef, 0xeb, 0x69, 0x76,
0x4a, 0x32, 0x8b, 0x89, 0x89, 0x47, 0x9f, 0x43, 0x31, 0xb4, 0xfd, 0x53, 0x1a, 0x1e, 0xeb, 0xef, 0x89, 0xa7, 0x7f, 0x33, 0xa0, 0x92, 0x58, 0x61, 0xbe, 0x8b, 0xbe, 0x84, 0x52, 0xa0, 0x67, 0xaa,
0x67, 0x3b, 0x89, 0xfe, 0x1a, 0xb5, 0xc4, 0xc0, 0xb3, 0xfe, 0xe2, 0xad, 0x4c, 0xf6, 0x4f, 0x5f, 0xf4, 0xf7, 0x46, 0x18, 0x94, 0x64, 0x16, 0x93, 0x38, 0x1e, 0x7d, 0x01, 0xc5, 0xc0, 0xf2, 0x4e,
0xdc, 0x5f, 0xc7, 0xe3, 0x5f, 0xa5, 0x60, 0xcb, 0x60, 0x26, 0x48, 0xd6, 0x94, 0x56, 0xb2, 0xa6, 0x69, 0x70, 0xa4, 0xbf, 0xa3, 0x6d, 0x27, 0xfa, 0x6b, 0xd4, 0x92, 0x18, 0x9e, 0xf5, 0x17, 0x6f,
0x64, 0x15, 0xb0, 0x72, 0x42, 0x62, 0x44, 0xe4, 0x12, 0x5a, 0x46, 0xab, 0x98, 0x4b, 0xa2, 0xc4, 0x66, 0xb2, 0x7f, 0xfa, 0xe2, 0xfe, 0x3a, 0x1e, 0xff, 0x2a, 0x05, 0x9b, 0x31, 0x66, 0xfc, 0x64,
0xda, 0x32, 0x74, 0xe8, 0x13, 0xc8, 0xb0, 0x91, 0xdf, 0x16, 0x2b, 0x0e, 0x40, 0x9f, 0x2e, 0x3c, 0x4d, 0x69, 0x24, 0x6b, 0x4a, 0x56, 0x01, 0x2b, 0x27, 0x24, 0x46, 0x44, 0x2e, 0xa1, 0x65, 0xb4,
0x4e, 0x2d, 0x05, 0xc7, 0xaf, 0x52, 0xb7, 0xa3, 0x77, 0xc6, 0xdc, 0x6a, 0xb8, 0x7a, 0x68, 0xfc, 0x8a, 0xb9, 0x24, 0x4a, 0xac, 0xad, 0x98, 0x0e, 0xdd, 0x81, 0x0c, 0x1b, 0xf9, 0x5d, 0xb1, 0xe2,
0x75, 0x0a, 0xb6, 0xc4, 0x0d, 0x82, 0xdf, 0x4b, 0xf9, 0x93, 0xee, 0xdb, 0xb6, 0x4f, 0x7e, 0x6f, 0x00, 0xf4, 0xe9, 0xc2, 0x23, 0xd5, 0x52, 0x70, 0xf4, 0x3a, 0x75, 0x37, 0x7c, 0x6f, 0xcc, 0xad,
0x95, 0xbb, 0x89, 0xf4, 0x3e, 0x56, 0x5c, 0x79, 0x6b, 0xb9, 0x01, 0xe0, 0x04, 0x44, 0xbd, 0x43, 0x86, 0xab, 0x07, 0xc7, 0x5f, 0xa7, 0x60, 0x53, 0xdc, 0x20, 0xf8, 0xcd, 0x94, 0x3f, 0xed, 0xbe,
0x67, 0xf8, 0xd5, 0x5e, 0xd3, 0xb0, 0x9a, 0xc8, 0x16, 0x77, 0x16, 0x99, 0x9a, 0x4a, 0xe4, 0xf5, 0x6b, 0xfb, 0xe4, 0x37, 0x57, 0xb9, 0x9b, 0x48, 0xef, 0x23, 0xc5, 0x95, 0xb7, 0x96, 0x9b, 0x90,
0x4a, 0x68, 0x87, 0xb3, 0x80, 0x3b, 0x19, 0xff, 0x2f, 0xe9, 0xb8, 0x21, 0xed, 0xf1, 0x06, 0x22, 0xf1, 0x9c, 0xb1, 0x20, 0xa1, 0x5c, 0xdb, 0x90, 0x86, 0x12, 0x67, 0x4c, 0x09, 0x6f, 0x60, 0x45,
0x01, 0x5a, 0x69, 0x93, 0xbf, 0xa0, 0xb4, 0xc1, 0x4f, 0x15, 0x19, 0x8d, 0x97, 0x47, 0x8e, 0x20, 0x91, 0x25, 0x2e, 0x2d, 0x32, 0x37, 0x95, 0xc8, 0x0b, 0x96, 0xc0, 0x0a, 0x66, 0x3e, 0xf7, 0x32,
0x63, 0x1f, 0x32, 0xce, 0xf4, 0xc4, 0x95, 0xf9, 0xad, 0x1e, 0x2e, 0x13, 0x94, 0x11, 0x8e, 0x61, 0xfa, 0x6d, 0xd2, 0x71, 0x02, 0xda, 0xe3, 0x0d, 0x44, 0x02, 0xb4, 0xda, 0x26, 0x7f, 0x41, 0x6d,
0xe6, 0x86, 0x73, 0x71, 0xe3, 0x17, 0xd4, 0x28, 0x11, 0xff, 0xc3, 0x52, 0x17, 0x35, 0x3e, 0xee, 0x83, 0x9f, 0x29, 0x36, 0x1a, 0xaf, 0x0e, 0x6d, 0xc1, 0xc6, 0x1e, 0x64, 0xec, 0xe9, 0x89, 0x23,
0x90, 0xce, 0x2f, 0x3a, 0xa7, 0xbe, 0x59, 0xa2, 0x57, 0x13, 0xb9, 0x6d, 0x10, 0x99, 0x8d, 0x58, 0x13, 0x5c, 0xbd, 0x60, 0x26, 0x38, 0x23, 0x1c, 0xc3, 0xcc, 0x0d, 0xe6, 0xe2, 0xd2, 0x2f, 0xb8,
0xbb, 0x0e, 0x59, 0x81, 0xcf, 0x73, 0xb5, 0x10, 0x98, 0x55, 0x43, 0xc7, 0xa7, 0xe2, 0x27, 0xcb, 0x51, 0x22, 0xfe, 0x87, 0xa1, 0x6e, 0x6a, 0x7c, 0xdc, 0x21, 0x9d, 0x5f, 0x74, 0x50, 0x7d, 0xbb,
0x3a, 0x6f, 0x89, 0x15, 0xf8, 0x0b, 0x23, 0x97, 0xf8, 0x3e, 0xf1, 0x1d, 0xc8, 0x32, 0x97, 0xd4, 0x4c, 0xaf, 0x26, 0x72, 0x2b, 0x46, 0x64, 0x36, 0x64, 0xed, 0x3a, 0x64, 0x05, 0x3e, 0xcf, 0xd5,
0x3b, 0xf2, 0x2a, 0xfe, 0x04, 0x08, 0xdf, 0x82, 0x4d, 0xd1, 0x42, 0xe8, 0x6b, 0x76, 0xaa, 0x72, 0x42, 0x60, 0x56, 0x0d, 0x6d, 0x8f, 0x8a, 0xbf, 0x2d, 0xeb, 0xbc, 0x25, 0x52, 0xe0, 0x2f, 0x63,
0x33, 0xd8, 0x5d, 0x34, 0x7a, 0x98, 0xe0, 0x02, 0x26, 0xb0, 0x2d, 0x70, 0xcd, 0xa9, 0xfd, 0x72, 0xc9, 0xc4, 0x37, 0x8a, 0xef, 0x42, 0x96, 0xb9, 0xa4, 0x1e, 0x94, 0x57, 0xf1, 0x27, 0x40, 0xf8,
0x4c, 0xe5, 0x85, 0x96, 0x2d, 0xe1, 0x65, 0xff, 0xa7, 0x10, 0x64, 0x9c, 0xe0, 0xf8, 0x21, 0x67, 0x36, 0x94, 0x45, 0x0b, 0xa1, 0x6f, 0xd8, 0xb1, 0xca, 0xcd, 0x60, 0x97, 0x51, 0xf5, 0x34, 0x21,
0x71, 0x9d, 0xf0, 0x6f, 0x54, 0x86, 0xf4, 0x24, 0x38, 0x95, 0x8c, 0xb1, 0x4f, 0xdc, 0x81, 0xf7, 0x04, 0x4c, 0x60, 0x4b, 0xe0, 0x9a, 0x53, 0xeb, 0xd5, 0x98, 0xca, 0x1b, 0x2d, 0x5b, 0xc3, 0xcb,
0x97, 0x8d, 0xc9, 0x9c, 0xb8, 0x03, 0x59, 0x9f, 0x06, 0x9e, 0x72, 0xe2, 0x43, 0xc3, 0x89, 0xa4, 0x7e, 0x54, 0x21, 0xc8, 0xd8, 0xfe, 0xd1, 0x63, 0xce, 0xe2, 0x3a, 0xe1, 0xdf, 0xc8, 0x84, 0xf4,
0x09, 0x44, 0x60, 0x71, 0x07, 0xe0, 0x91, 0x3b, 0xb0, 0xc7, 0x47, 0xce, 0xbc, 0x3f, 0x67, 0x36, 0xc4, 0x3f, 0x95, 0x8c, 0xb1, 0x4f, 0xdc, 0x81, 0x0f, 0x97, 0x8d, 0xc9, 0x9c, 0xb8, 0x07, 0x59,
0x8c, 0xe2, 0x30, 0xf3, 0x6f, 0x46, 0xfd, 0x88, 0x3a, 0xa7, 0x23, 0xb1, 0xf9, 0xa5, 0x89, 0x94, 0x8f, 0xfa, 0xae, 0x72, 0xe2, 0xa3, 0x98, 0x13, 0x49, 0x13, 0x88, 0xc0, 0xe2, 0x0e, 0xc0, 0x13,
0x98, 0xcf, 0x4e, 0xf4, 0x6c, 0x94, 0x26, 0x42, 0x60, 0x95, 0x4e, 0x91, 0x8f, 0x25, 0x1e, 0x6d, 0x67, 0x60, 0x8d, 0x0f, 0xed, 0x79, 0x7f, 0xce, 0x6c, 0x18, 0x45, 0x61, 0xe6, 0xdf, 0x8c, 0xfa,
0x5e, 0xeb, 0xd9, 0x66, 0x19, 0xd9, 0x16, 0x4d, 0x96, 0x5a, 0x3a, 0x59, 0x7a, 0xf9, 0x64, 0x19, 0x11, 0xb5, 0x4f, 0x47, 0x62, 0xf7, 0x4b, 0x13, 0x29, 0x31, 0x9f, 0xed, 0xf0, 0xe5, 0x28, 0x4d,
0x6d, 0xb2, 0x38, 0xfa, 0xd9, 0x95, 0xd1, 0xcf, 0x25, 0xa3, 0x7f, 0x17, 0x4a, 0x9a, 0x7d, 0x81, 0x84, 0xc0, 0x4a, 0x9d, 0x22, 0x1f, 0x4b, 0xbc, 0xdb, 0xbc, 0xd1, 0xb3, 0xcd, 0x88, 0x65, 0x5b,
0x87, 0x3e, 0x82, 0x74, 0x38, 0x57, 0xa4, 0xa9, 0x55, 0x17, 0x73, 0x42, 0x58, 0x2b, 0x3e, 0x82, 0x38, 0x59, 0x6a, 0xe9, 0x64, 0xe9, 0xe5, 0x93, 0x65, 0xb4, 0xc9, 0xa2, 0xe8, 0x67, 0x57, 0x46,
0x8a, 0xe4, 0x8e, 0x05, 0x9c, 0xd0, 0x60, 0x36, 0xfe, 0x4f, 0xa2, 0xd8, 0x86, 0x6b, 0x84, 0xbe, 0x3f, 0x97, 0x8c, 0xfe, 0x7d, 0x28, 0x69, 0xf6, 0xf9, 0x2e, 0xfa, 0x04, 0xd2, 0xc1, 0x5c, 0x91,
0x5e, 0x48, 0x8b, 0x1a, 0xe4, 0x7d, 0x3e, 0xb4, 0x32, 0xa7, 0xaa, 0x5d, 0x8f, 0x8d, 0xb9, 0x89, 0xa6, 0x56, 0x5d, 0xc4, 0x09, 0x61, 0xad, 0xf8, 0x10, 0x2a, 0x92, 0x3b, 0x16, 0x70, 0x42, 0xfd,
0x02, 0xee, 0xff, 0x14, 0x20, 0xfe, 0xfb, 0x8a, 0x36, 0x20, 0xdf, 0x68, 0x76, 0x8f, 0x7b, 0xed, 0xd9, 0xf8, 0x3f, 0x89, 0x62, 0x1b, 0xae, 0x11, 0xfa, 0x66, 0x21, 0x2d, 0x6a, 0x90, 0xf7, 0xf8,
0x7e, 0x79, 0x0d, 0x15, 0x61, 0xfd, 0x69, 0xbb, 0xdf, 0x6a, 0x90, 0xfa, 0xd3, 0xb2, 0x85, 0x2a, 0xd0, 0xca, 0x9c, 0xaa, 0x76, 0x3f, 0x8e, 0xcd, 0x4d, 0x14, 0x70, 0xef, 0xa7, 0x00, 0xd1, 0x4f,
0x50, 0xea, 0x93, 0x7a, 0xa7, 0x77, 0xd8, 0x24, 0xed, 0x4e, 0xf7, 0x71, 0xbf, 0x9c, 0x42, 0x08, 0x58, 0xb4, 0x01, 0xf9, 0x46, 0xb3, 0x7b, 0xd4, 0x6b, 0xf7, 0xcd, 0x35, 0x54, 0x84, 0xf5, 0x67,
0x36, 0x95, 0xea, 0xf8, 0x71, 0x9f, 0xe9, 0xd2, 0xa8, 0x04, 0x85, 0xfa, 0xe3, 0x7e, 0xeb, 0x98, 0xed, 0x7e, 0xab, 0x41, 0xea, 0xcf, 0x4c, 0x03, 0x55, 0xa0, 0xd4, 0x27, 0xf5, 0x4e, 0xef, 0xa0,
0xb4, 0x5f, 0x34, 0xcb, 0x99, 0xfd, 0x3a, 0xa7, 0x2b, 0xfe, 0x83, 0xc9, 0xda, 0xa3, 0xdf, 0x8e, 0x49, 0xda, 0x9d, 0xee, 0x71, 0xdf, 0x4c, 0x21, 0x04, 0x65, 0xa5, 0x3a, 0x3a, 0xee, 0x33, 0x5d,
0xe5, 0x35, 0xb4, 0x09, 0x10, 0xff, 0x9a, 0x15, 0xb3, 0xc8, 0xb7, 0x24, 0xa9, 0x4a, 0xed, 0x7f, 0x1a, 0x95, 0xa0, 0x50, 0x3f, 0xee, 0xb7, 0x8e, 0x48, 0xfb, 0x65, 0xd3, 0xcc, 0xec, 0xd5, 0x39,
0xc4, 0x33, 0x22, 0xfa, 0x83, 0x82, 0xf2, 0x90, 0xae, 0x0f, 0x87, 0xe5, 0x35, 0x04, 0x90, 0x6b, 0x5d, 0xd1, 0xaf, 0x4c, 0xd6, 0x1e, 0xfe, 0x7f, 0x34, 0xd7, 0x50, 0x19, 0x20, 0xfa, 0x43, 0x2b,
0xd0, 0x31, 0x0d, 0x69, 0xd9, 0xda, 0xff, 0x01, 0x40, 0xbc, 0x29, 0xa2, 0x02, 0x64, 0x1f, 0x77, 0x66, 0x91, 0x8f, 0x49, 0x52, 0x95, 0xda, 0xfb, 0x84, 0x67, 0x44, 0xf8, 0x2b, 0x05, 0xe5, 0x21,
0x1a, 0xcd, 0xc3, 0xf2, 0x1a, 0xfb, 0x7c, 0x52, 0x7f, 0xd4, 0x6e, 0x94, 0x2d, 0x86, 0x3f, 0x24, 0x5d, 0x1f, 0x0e, 0xcd, 0x35, 0x04, 0x90, 0x6b, 0xd0, 0x31, 0x0d, 0xa8, 0x69, 0xec, 0xfd, 0x00,
0xc7, 0x2f, 0x9a, 0x9d, 0x72, 0x0a, 0xad, 0x43, 0xe6, 0x71, 0xaf, 0xd9, 0x28, 0xa7, 0xf7, 0x7f, 0x20, 0xda, 0x14, 0x51, 0x01, 0xb2, 0xc7, 0x9d, 0x46, 0xf3, 0xc0, 0x5c, 0x63, 0x9f, 0x4f, 0xeb,
0x04, 0xef, 0x1d, 0x39, 0x73, 0xb5, 0x20, 0x83, 0x81, 0x3d, 0x95, 0x83, 0xac, 0x43, 0xa6, 0xdd, 0x4f, 0xda, 0x0d, 0xd3, 0x60, 0xf8, 0x03, 0x72, 0xf4, 0xb2, 0xd9, 0x31, 0x53, 0x68, 0x1d, 0x32,
0x78, 0xd4, 0x14, 0x44, 0xf4, 0xee, 0xd7, 0x3b, 0x9d, 0x76, 0xe7, 0x41, 0xd9, 0x62, 0xd2, 0x61, 0xc7, 0xbd, 0x66, 0xc3, 0x4c, 0xef, 0x7d, 0x0e, 0x19, 0xb6, 0x17, 0x33, 0xd7, 0x7b, 0xdd, 0x66,
0xbb, 0xd3, 0xee, 0xb5, 0x9a, 0x8d, 0x72, 0xaa, 0xf6, 0xb5, 0x05, 0x30, 0x71, 0xe6, 0xea, 0x55, 0xa7, 0xd1, 0x24, 0xc2, 0x75, 0xd2, 0xec, 0x1f, 0x93, 0x4e, 0x93, 0x98, 0x06, 0x37, 0x52, 0xf9,
0xea, 0x2e, 0x6c, 0x3d, 0x48, 0x8c, 0xa3, 0x1e, 0x1e, 0x08, 0x7d, 0xdd, 0x71, 0xc6, 0x3b, 0xe5, 0x44, 0xcc, 0xd4, 0xde, 0x8f, 0xe0, 0x83, 0x43, 0x7b, 0xae, 0xd6, 0xb0, 0x3f, 0xb0, 0xa6, 0x72,
0x58, 0xec, 0x85, 0xbe, 0x33, 0x3d, 0xc5, 0x6b, 0xe8, 0x33, 0xd8, 0x10, 0x5d, 0x98, 0x0f, 0x97, 0xde, 0x75, 0xc8, 0xb4, 0x1b, 0x4f, 0x9a, 0x62, 0x80, 0xde, 0xc3, 0x7a, 0xa7, 0xd3, 0xee, 0x3c,
0xea, 0xf1, 0x39, 0x94, 0x8c, 0xf0, 0xa3, 0xad, 0x18, 0xc4, 0xf7, 0x94, 0x9d, 0x9d, 0x58, 0x91, 0x32, 0x0d, 0x26, 0x1d, 0xb4, 0x3b, 0xed, 0x5e, 0xab, 0xd9, 0x30, 0x53, 0xb5, 0x6f, 0x0c, 0x80,
0x4c, 0x14, 0xbc, 0xf6, 0x32, 0xc7, 0xff, 0xce, 0xdf, 0xf9, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x89, 0x3d, 0x57, 0x2f, 0x59, 0xf7, 0x61, 0xf3, 0x51, 0x62, 0x1c, 0xf5, 0x58, 0x41, 0xe8, 0x9b,
0x53, 0x45, 0xb1, 0xbd, 0xd2, 0x1f, 0x00, 0x00, 0x8e, 0x3d, 0xde, 0x36, 0x23, 0xb1, 0x17, 0x78, 0xf6, 0xf4, 0x14, 0xaf, 0xa1, 0xcf, 0x60, 0x43,
0x74, 0x61, 0x6e, 0x5f, 0xaa, 0xc7, 0x17, 0x50, 0x8a, 0x65, 0x0c, 0xda, 0x8c, 0x40, 0x7c, 0x1b,
0xda, 0xde, 0x8e, 0x14, 0xc9, 0xdc, 0xc2, 0x6b, 0xaf, 0x72, 0xfc, 0xbf, 0xfe, 0xbd, 0x7f, 0x07,
0x00, 0x00, 0xff, 0xff, 0x1d, 0x09, 0x71, 0xcc, 0x0c, 0x20, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
......
...@@ -350,11 +350,15 @@ func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys ...@@ -350,11 +350,15 @@ func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys
//如果授权为returnerAuthHash,则returner更新本地为VALID,spender侧仍为FROZEN, //如果授权为returnerAuthHash,则returner更新本地为VALID,spender侧仍为FROZEN,
info.AuthorizeSpendHash = "0" info.AuthorizeSpendHash = "0"
if len(rawData.AuthorizePubKey) > LENNULLKEY { if len(rawData.AuthorizePubKey) > LENNULLKEY {
if rawData.ReceiverPubKey == key.Privacy.PaymentKey.ReceiverPubKey { switch key.Privacy.PaymentKey.ReceiverPubKey {
case rawData.ReceiverPubKey:
info.Role = mixTy.Role_SPENDER
info.AuthorizeSpendHash = getFrString(mimcHashString([]string{rawData.ReceiverPubKey, rawData.Amount, rawData.NoteRandom})) info.AuthorizeSpendHash = getFrString(mimcHashString([]string{rawData.ReceiverPubKey, rawData.Amount, rawData.NoteRandom}))
} else if rawData.ReturnPubKey == key.Privacy.PaymentKey.ReceiverPubKey { case rawData.ReturnPubKey:
info.IsReturner = true info.Role = mixTy.Role_RETURNER
info.AuthorizeSpendHash = getFrString(mimcHashString([]string{rawData.ReturnPubKey, rawData.Amount, rawData.NoteRandom})) info.AuthorizeSpendHash = getFrString(mimcHashString([]string{rawData.ReturnPubKey, rawData.Amount, rawData.NoteRandom}))
case rawData.AuthorizePubKey:
info.Role = mixTy.Role_AUTHORIZER
} }
} }
......
...@@ -210,12 +210,12 @@ func (policy *mixPolicy) withdrawProof(req *mixTy.WithdrawProofReq) (*mixTy.With ...@@ -210,12 +210,12 @@ func (policy *mixPolicy) withdrawProof(req *mixTy.WithdrawProofReq) (*mixTy.With
resp.NullifierHash = note.Nullifier resp.NullifierHash = note.Nullifier
resp.AuthorizeSpendHash = note.AuthorizeSpendHash resp.AuthorizeSpendHash = note.AuthorizeSpendHash
resp.NoteHash = note.NoteHash resp.NoteHash = note.NoteHash
resp.SpendFlag = 1 resp.SpendFlag = "1"
if note.IsReturner { if note.Role == mixTy.Role_RETURNER {
resp.SpendFlag = 0 resp.SpendFlag = "0"
} }
if len(resp.AuthorizeSpendHash) > LENNULLKEY { if len(resp.AuthorizeSpendHash) > LENNULLKEY {
resp.AuthorizeFlag = 1 resp.AuthorizeFlag = "1"
} }
//get spend privacy key //get spend privacy key
...@@ -260,10 +260,10 @@ func (policy *mixPolicy) authProof(req *mixTy.AuthProofReq) (*mixTy.AuthProofRes ...@@ -260,10 +260,10 @@ func (policy *mixPolicy) authProof(req *mixTy.AuthProofReq) (*mixTy.AuthProofRes
resp.AuthHash = getFrString(mimcHashString([]string{resp.AuthPubKey, note.Secret.NoteRandom})) resp.AuthHash = getFrString(mimcHashString([]string{resp.AuthPubKey, note.Secret.NoteRandom}))
//default auto to paymenter //default auto to paymenter
resp.SpendFlag = 1 resp.SpendFlag = "1"
resp.AuthorizeSpendHash = getFrString(mimcHashString([]string{note.Secret.ReceiverPubKey, note.Secret.Amount, note.Secret.NoteRandom})) resp.AuthorizeSpendHash = getFrString(mimcHashString([]string{note.Secret.ReceiverPubKey, note.Secret.Amount, note.Secret.NoteRandom}))
if req.ToReturn != 0 { if req.ToReturn != 0 {
resp.SpendFlag = 0 resp.SpendFlag = "0"
//auth to returner //auth to returner
resp.AuthorizeSpendHash = getFrString(mimcHashString([]string{note.Secret.ReturnPubKey, note.Secret.Amount, note.Secret.NoteRandom})) resp.AuthorizeSpendHash = getFrString(mimcHashString([]string{note.Secret.ReturnPubKey, note.Secret.Amount, note.Secret.NoteRandom}))
} }
...@@ -313,12 +313,12 @@ func (policy *mixPolicy) getTransferInputPart(note *mixTy.WalletIndexInfo) (*mix ...@@ -313,12 +313,12 @@ func (policy *mixPolicy) getTransferInputPart(note *mixTy.WalletIndexInfo) (*mix
return nil, errors.Wrapf(types.ErrInvalidParam, "payment pubkey from note=%s not match from privacyKey=%s,for account =%s", return nil, errors.Wrapf(types.ErrInvalidParam, "payment pubkey from note=%s not match from privacyKey=%s,for account =%s",
note.Secret.ReceiverPubKey, privacyKey.Privacy.PaymentKey.ReceiverPubKey, note.Account) note.Secret.ReceiverPubKey, privacyKey.Privacy.PaymentKey.ReceiverPubKey, note.Account)
} }
input.SpendFlag = 1 input.SpendFlag = "1"
if note.IsReturner { if note.Role == mixTy.Role_RETURNER {
input.SpendFlag = 0 input.SpendFlag = "0"
} }
if len(input.AuthorizeSpendHash) > LENNULLKEY { if len(input.AuthorizeSpendHash) > LENNULLKEY {
input.AuthorizeFlag = 1 input.AuthorizeFlag = "1"
} }
treeProof, err := policy.getTreeProof(note.NoteHash) treeProof, err := policy.getTreeProof(note.NoteHash)
......
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