Commit 6e5bf601 authored by madengji's avatar madengji Committed by vipwzw

all circuit pass

parent d5900775
...@@ -11,6 +11,7 @@ secret, authorizePriKey,17822967620457187568904804290291537271142779717280482398 ...@@ -11,6 +11,7 @@ secret, authorizePriKey,17822967620457187568904804290291537271142779717280482398
secret, spendFlag,1 secret, spendFlag,1
secret, noteRandom,2824204835 secret, noteRandom,2824204835
secret, noteHash,3649361563603415612447884923592927672484439983354650489908367088830561161361
secret, path1,19561523370160677851616596032513161448778901506614020103852017946679781620105 secret, path1,19561523370160677851616596032513161448778901506614020103852017946679781620105
secret, path2,13898857070666440684265042188056372750257678232709763835292910585848522658637 secret, path2,13898857070666440684265042188056372750257678232709763835292910585848522658637
secret, path3,15019169196974879571470243100379529757970866395477207575033769902587972032431 secret, path3,15019169196974879571470243100379529757970866395477207575033769902587972032431
......
...@@ -5,7 +5,10 @@ ...@@ -5,7 +5,10 @@
package commands package commands
import ( import (
"encoding/hex"
"encoding/json"
"fmt" "fmt"
"os"
"strings" "strings"
"github.com/33cn/chain33/rpc/jsonclient" "github.com/33cn/chain33/rpc/jsonclient"
...@@ -829,6 +832,7 @@ func SecretCmd() *cobra.Command { ...@@ -829,6 +832,7 @@ func SecretCmd() *cobra.Command {
Short: "note secret cmd", Short: "note secret cmd",
} }
cmd.AddCommand(EncodeSecretDataCmd()) cmd.AddCommand(EncodeSecretDataCmd())
cmd.AddCommand(DecodeSecretDataCmd())
cmd.AddCommand(EncryptSecretDataCmd()) cmd.AddCommand(EncryptSecretDataCmd())
cmd.AddCommand(DecryptSecretDataCmd()) cmd.AddCommand(DecryptSecretDataCmd())
...@@ -878,6 +882,47 @@ func encodeSecret(cmd *cobra.Command, args []string) { ...@@ -878,6 +882,47 @@ func encodeSecret(cmd *cobra.Command, args []string) {
ctx.Run() ctx.Run()
} }
// EncodeSecretDataCmd get para chain status by height
func DecodeSecretDataCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "decode",
Short: "decode secret data",
Run: decodeSecret,
}
decodeSecretCmdFlags(cmd)
return cmd
}
func decodeSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("data", "d", "", "receiver data")
cmd.MarkFlagRequired("data")
}
func decodeSecret(cmd *cobra.Command, args []string) {
//rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
data, _ := cmd.Flags().GetString("data")
var secret mixTy.DHSecret
d, err := hex.DecodeString(data)
if err != nil {
fmt.Println("decode string fail")
return
}
err = types.Decode(d, &secret)
if err != nil {
fmt.Println("decode data fail")
return
}
rst, err := json.MarshalIndent(secret, "", " ")
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
fmt.Println(string(rst))
}
// ShowAccountPrivacyInfo get para chain status by height // ShowAccountPrivacyInfo get para chain status by height
func EncryptSecretDataCmd() *cobra.Command { func EncryptSecretDataCmd() *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
......
...@@ -63,7 +63,7 @@ func (m *Mix) CheckTx(tx *types.Transaction, index int) error { ...@@ -63,7 +63,7 @@ func (m *Mix) CheckTx(tx *types.Transaction, index int) error {
// mix隐私交易,只私对私需要特殊签名验证 // mix隐私交易,只私对私需要特殊签名验证
return m.DriverBase.CheckTx(tx, index) return m.DriverBase.CheckTx(tx, index)
} }
_, _, err := MixTransferInfoVerify(m.GetAPI().GetConfig(), m.GetStateDB(), action.GetTransfer()) _, _, err := MixTransferInfoVerify(m.GetStateDB(), action.GetTransfer())
if err != nil { if err != nil {
mlog.Error("checkTx", "err", err, "txhash", common.ToHex(tx.Hash())) mlog.Error("checkTx", "err", err, "txhash", common.ToHex(tx.Hash()))
return err return err
......
...@@ -7,8 +7,6 @@ package executor ...@@ -7,8 +7,6 @@ package executor
import ( import (
"encoding/hex" "encoding/hex"
"encoding/json" "encoding/json"
"fmt"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
mixTy "github.com/33cn/plugin/plugin/dapp/mix/types" mixTy "github.com/33cn/plugin/plugin/dapp/mix/types"
"github.com/consensys/gurvy/bn256/twistededwards" "github.com/consensys/gurvy/bn256/twistededwards"
...@@ -72,7 +70,7 @@ func transferOutputVerify(db dbm.KV, proof *mixTy.ZkProofInfo) (*mixTy.TransferO ...@@ -72,7 +70,7 @@ func transferOutputVerify(db dbm.KV, proof *mixTy.ZkProofInfo) (*mixTy.TransferO
} }
func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mixTy.TransferOutputPublicInput, minFee int64) bool { func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mixTy.TransferOutputPublicInput) bool {
var inputPoints, outputPoints []*twistededwards.Point var inputPoints, outputPoints []*twistededwards.Point
for _, in := range inputs { for _, in := range inputs {
var p twistededwards.Point var p twistededwards.Point
...@@ -90,7 +88,7 @@ func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mix ...@@ -90,7 +88,7 @@ func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mix
//out value add fee //out value add fee
//对于平行链来说, 隐私交易需要一个公共账户扣主链的手续费,隐私交易只需要扣平行链执行器内的费用即可 //对于平行链来说, 隐私交易需要一个公共账户扣主链的手续费,隐私交易只需要扣平行链执行器内的费用即可
//由于平行链的隐私交易没有实际扣平行链mix合约的手续费,平行链Mix合约会有手续费留下,平行链隐私可以考虑手续费为0 //由于平行链的隐私交易没有实际扣平行链mix合约的手续费,平行链Mix合约会有手续费留下,平行链隐私可以考虑手续费为0
outputPoints = append(outputPoints, mixTy.MulCurvePointG(uint64(minFee))) outputPoints = append(outputPoints, mixTy.MulCurvePointG(uint64(mixTy.Privacy2PrivacyTxFee)))
//sum input and output //sum input and output
sumInput := inputPoints[0] sumInput := inputPoints[0]
...@@ -108,7 +106,7 @@ func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mix ...@@ -108,7 +106,7 @@ func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mix
return false return false
} }
func MixTransferInfoVerify(cfg *types.Chain33Config, db dbm.KV, transfer *mixTy.MixTransferAction) ([]*mixTy.TransferInputPublicInput, []*mixTy.TransferOutputPublicInput, error) { func MixTransferInfoVerify(db dbm.KV, transfer *mixTy.MixTransferAction) ([]*mixTy.TransferInputPublicInput, []*mixTy.TransferOutputPublicInput, error) {
var inputs []*mixTy.TransferInputPublicInput var inputs []*mixTy.TransferInputPublicInput
var outputs []*mixTy.TransferOutputPublicInput var outputs []*mixTy.TransferOutputPublicInput
...@@ -129,8 +127,7 @@ func MixTransferInfoVerify(cfg *types.Chain33Config, db dbm.KV, transfer *mixTy. ...@@ -129,8 +127,7 @@ func MixTransferInfoVerify(cfg *types.Chain33Config, db dbm.KV, transfer *mixTy.
} }
outputs = append(outputs, change) outputs = append(outputs, change)
minTxFee := types.Conf(cfg, "config.wallet").GInt("minFee") if !VerifyCommitValues(inputs, outputs) {
if !VerifyCommitValues(inputs, outputs, minTxFee) {
return nil, nil, errors.Wrap(mixTy.ErrSpendInOutValueNotMatch, "verifyValue") return nil, nil, errors.Wrap(mixTy.ErrSpendInOutValueNotMatch, "verifyValue")
} }
...@@ -143,7 +140,7 @@ func MixTransferInfoVerify(cfg *types.Chain33Config, db dbm.KV, transfer *mixTy. ...@@ -143,7 +140,7 @@ func MixTransferInfoVerify(cfg *types.Chain33Config, db dbm.KV, transfer *mixTy.
3. add nullifier to pool 3. add nullifier to pool
*/ */
func (a *action) Transfer(transfer *mixTy.MixTransferAction) (*types.Receipt, error) { func (a *action) Transfer(transfer *mixTy.MixTransferAction) (*types.Receipt, error) {
inputs, outputs, err := MixTransferInfoVerify(a.api.GetConfig(), a.db, transfer) inputs, outputs, err := MixTransferInfoVerify(a.db, transfer)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "Transfer.MixTransferInfoVerify") return nil, errors.Wrap(err, "Transfer.MixTransferInfoVerify")
} }
......
...@@ -51,21 +51,21 @@ func TestVerifyCommitValuesBasePoint(t *testing.T) { ...@@ -51,21 +51,21 @@ func TestVerifyCommitValuesBasePoint(t *testing.T) {
t.Log("p3.x", p3.X.String()) t.Log("p3.x", p3.X.String())
t.Log("p3.y", p3.Y.String()) t.Log("p3.y", p3.Y.String())
input1 := &mixTy.TransferInputPublicInput{ input1 := &mixTy.TransferInputPublicInput{
AmountX: p1.X.String(), ShieldAmountX: p1.X.String(),
AmountY: p1.Y.String(), ShieldAmountY: p1.Y.String(),
} }
var inputs []*mixTy.TransferInputPublicInput var inputs []*mixTy.TransferInputPublicInput
inputs = append(inputs, input1) inputs = append(inputs, input1)
output1 := &mixTy.TransferOutputPublicInput{ output1 := &mixTy.TransferOutputPublicInput{
AmountX: p2.X.String(), ShieldAmountX: p2.X.String(),
AmountY: p2.Y.String(), ShieldAmountY: p2.Y.String(),
} }
output2 := &mixTy.TransferOutputPublicInput{ output2 := &mixTy.TransferOutputPublicInput{
AmountX: p3.X.String(), ShieldAmountX: p3.X.String(),
AmountY: p3.Y.String(), ShieldAmountY: p3.Y.String(),
} }
var outputs []*mixTy.TransferOutputPublicInput var outputs []*mixTy.TransferOutputPublicInput
...@@ -107,21 +107,21 @@ func TestVerifyCommitValuesBaseAddHPoint(t *testing.T) { ...@@ -107,21 +107,21 @@ func TestVerifyCommitValuesBaseAddHPoint(t *testing.T) {
p3.Add(&p3, &r3) p3.Add(&p3, &r3)
input1 := &mixTy.TransferInputPublicInput{ input1 := &mixTy.TransferInputPublicInput{
AmountX: p1.X.String(), ShieldAmountX: p1.X.String(),
AmountY: p1.Y.String(), ShieldAmountY: p1.Y.String(),
} }
var inputs []*mixTy.TransferInputPublicInput var inputs []*mixTy.TransferInputPublicInput
inputs = append(inputs, input1) inputs = append(inputs, input1)
output1 := &mixTy.TransferOutputPublicInput{ output1 := &mixTy.TransferOutputPublicInput{
AmountX: p2.X.String(), ShieldAmountX: p2.X.String(),
AmountY: p2.Y.String(), ShieldAmountY: p2.Y.String(),
} }
output2 := &mixTy.TransferOutputPublicInput{ output2 := &mixTy.TransferOutputPublicInput{
AmountX: p3.X.String(), ShieldAmountX: p3.X.String(),
AmountY: p3.Y.String(), ShieldAmountY: p3.Y.String(),
} }
var outputs []*mixTy.TransferOutputPublicInput var outputs []*mixTy.TransferOutputPublicInput
......
...@@ -93,7 +93,7 @@ func (a *action) Withdraw(withdraw *mixTy.MixWithdrawAction) (*types.Receipt, er ...@@ -93,7 +93,7 @@ func (a *action) Withdraw(withdraw *mixTy.MixWithdrawAction) (*types.Receipt, er
} }
if sumValue != withdraw.Amount { if sumValue != withdraw.Amount {
return nil, mixTy.ErrInputParaNotMatch return nil, errors.Wrapf(mixTy.ErrInputParaNotMatch, "amount:input=%d,proof sum=%d", withdraw.Amount, sumValue)
} }
//withdraw value //withdraw value
......
...@@ -151,7 +151,6 @@ message TransferOutputPublicInput { ...@@ -151,7 +151,6 @@ message TransferOutputPublicInput {
string shieldAmountX = 2; string shieldAmountX = 2;
string shieldAmountY = 3; string shieldAmountY = 3;
DHSecretGroup dhSecrets = 4;
} }
message AuthorizePublicInput { message AuthorizePublicInput {
......
...@@ -4,7 +4,10 @@ ...@@ -4,7 +4,10 @@
package types package types
import "github.com/33cn/chain33/common/log/log15" import (
"github.com/33cn/chain33/common/log/log15"
"github.com/33cn/chain33/types"
)
var tlog = log15.New("module", MixX) var tlog = log15.New("module", MixX)
...@@ -45,3 +48,6 @@ const ( ...@@ -45,3 +48,6 @@ const (
PointHX = "10190477835300927557649934238820360529458681672073866116232821892325659279502" PointHX = "10190477835300927557649934238820360529458681672073866116232821892325659279502"
PointHY = "7969140283216448215269095418467361784159407896899334866715345504515077887397" PointHY = "7969140283216448215269095418467361784159407896899334866715345504515077887397"
) )
//mix transfer tx fee
const Privacy2PrivacyTxFee = types.Coin
...@@ -6,13 +6,12 @@ package types ...@@ -6,13 +6,12 @@ package types
import ( import (
context "context" context "context"
fmt "fmt" fmt "fmt"
math "math"
types "github.com/33cn/chain33/types" types "github.com/33cn/chain33/types"
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc" grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes" codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status" status "google.golang.org/grpc/status"
math "math"
) )
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
...@@ -1134,7 +1133,6 @@ type TransferOutputPublicInput struct { ...@@ -1134,7 +1133,6 @@ type TransferOutputPublicInput 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"`
ShieldAmountX string `protobuf:"bytes,2,opt,name=shieldAmountX,proto3" json:"shieldAmountX,omitempty"` ShieldAmountX string `protobuf:"bytes,2,opt,name=shieldAmountX,proto3" json:"shieldAmountX,omitempty"`
ShieldAmountY string `protobuf:"bytes,3,opt,name=shieldAmountY,proto3" json:"shieldAmountY,omitempty"` ShieldAmountY string `protobuf:"bytes,3,opt,name=shieldAmountY,proto3" json:"shieldAmountY,omitempty"`
DhSecrets *DHSecretGroup `protobuf:"bytes,4,opt,name=dhSecrets,proto3" json:"dhSecrets,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:"-"`
...@@ -1186,13 +1184,6 @@ func (m *TransferOutputPublicInput) GetShieldAmountY() string { ...@@ -1186,13 +1184,6 @@ func (m *TransferOutputPublicInput) GetShieldAmountY() string {
return "" return ""
} }
func (m *TransferOutputPublicInput) GetDhSecrets() *DHSecretGroup {
if m != nil {
return m.DhSecrets
}
return nil
}
type AuthorizePublicInput struct { type AuthorizePublicInput struct {
TreeRootHash string `protobuf:"bytes,1,opt,name=treeRootHash,proto3" json:"treeRootHash,omitempty"` TreeRootHash string `protobuf:"bytes,1,opt,name=treeRootHash,proto3" json:"treeRootHash,omitempty"`
AuthorizePubKey string `protobuf:"bytes,2,opt,name=authorizePubKey,proto3" json:"authorizePubKey,omitempty"` AuthorizePubKey string `protobuf:"bytes,2,opt,name=authorizePubKey,proto3" json:"authorizePubKey,omitempty"`
...@@ -3657,165 +3648,164 @@ func init() { ...@@ -3657,165 +3648,164 @@ func init() {
} }
var fileDescriptor_5c21d519a9be369a = []byte{ var fileDescriptor_5c21d519a9be369a = []byte{
// 2515 bytes of a gzipped FileDescriptorProto // 2504 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,
0x11, 0xd6, 0xf0, 0x57, 0x2c, 0x91, 0x12, 0xd5, 0xf6, 0x6a, 0x69, 0x21, 0xeb, 0x28, 0xbd, 0x5e, 0xf1, 0xd7, 0xf0, 0x53, 0x2c, 0x91, 0x12, 0xd9, 0xf6, 0x6a, 0xb9, 0xc2, 0x7f, 0xfd, 0x57, 0x7a,
0xaf, 0x22, 0x07, 0xda, 0x0d, 0xed, 0x38, 0xc9, 0x21, 0xbb, 0x60, 0x4c, 0xca, 0xe4, 0xda, 0xa2, 0xbd, 0x5e, 0x45, 0x0e, 0xb4, 0x1b, 0xda, 0x71, 0x92, 0x43, 0x76, 0xc1, 0x98, 0x94, 0xc9, 0xb5,
0x88, 0x26, 0xfd, 0x1b, 0x24, 0xc0, 0x98, 0x6c, 0x89, 0x03, 0x93, 0x9c, 0xf1, 0xcc, 0x50, 0xa6, 0x45, 0x11, 0x4d, 0xfa, 0x33, 0x48, 0x80, 0x31, 0xd9, 0x12, 0x07, 0x26, 0x39, 0xe3, 0x99, 0xa1,
0x72, 0xca, 0x21, 0xc0, 0x1e, 0x82, 0x9c, 0x82, 0x5c, 0x03, 0xe4, 0x94, 0x3c, 0xc0, 0x22, 0x01, 0x4c, 0xe5, 0x14, 0x20, 0x01, 0xf6, 0x10, 0xe4, 0x14, 0xe4, 0x1a, 0x20, 0xa7, 0xe4, 0x01, 0x16,
0xf2, 0x0c, 0x39, 0xe6, 0x01, 0x02, 0xe4, 0x90, 0x6b, 0x1e, 0x21, 0xe8, 0xbf, 0x99, 0xee, 0x21, 0x39, 0xe4, 0x19, 0x72, 0xcc, 0x03, 0x04, 0xc8, 0x21, 0xd7, 0x3c, 0x42, 0xd0, 0x5f, 0x33, 0xdd,
0xa9, 0x1f, 0x67, 0x73, 0xdb, 0x1b, 0xab, 0xe6, 0xeb, 0xee, 0xaa, 0xaf, 0xaa, 0xab, 0xab, 0x9b, 0x43, 0xd2, 0x92, 0x9c, 0xcd, 0x2d, 0xb7, 0xa9, 0xea, 0x5f, 0x77, 0x57, 0xfd, 0xaa, 0xba, 0xbb,
0x50, 0x18, 0x3b, 0xb3, 0x7d, 0xcf, 0x77, 0x43, 0x17, 0x65, 0xc3, 0x33, 0x8f, 0x06, 0xdb, 0xc5, 0xba, 0x07, 0x0a, 0x13, 0x67, 0x7e, 0xe0, 0xf9, 0x6e, 0xe8, 0xa2, 0x6c, 0x78, 0xee, 0xd1, 0x60,
0xbe, 0x3b, 0x1e, 0xbb, 0x13, 0xa1, 0xdc, 0xde, 0x0c, 0x7d, 0x7b, 0x12, 0xd8, 0xfd, 0xd0, 0x51, 0xa7, 0x38, 0x70, 0x27, 0x13, 0x77, 0x2a, 0x94, 0x3b, 0x95, 0xd0, 0xb7, 0xa7, 0x81, 0x3d, 0x08,
0x2a, 0xfc, 0x05, 0xac, 0xbd, 0x7c, 0xfd, 0x94, 0xfa, 0xce, 0xf1, 0xd9, 0x23, 0x7a, 0x86, 0x3e, 0x1d, 0xa5, 0xc2, 0x5f, 0xc2, 0xc6, 0x8b, 0x57, 0x4f, 0xa8, 0xef, 0x9c, 0x9c, 0x3f, 0xa4, 0xe7,
0x82, 0x0c, 0x1b, 0x58, 0xb1, 0x76, 0xac, 0xdd, 0xf5, 0xea, 0xe6, 0x3e, 0x9f, 0x65, 0x5f, 0x7c, 0xe8, 0x63, 0xc8, 0xb0, 0x8e, 0x55, 0x6b, 0xd7, 0xda, 0xdb, 0xac, 0x55, 0x0e, 0xf8, 0x28, 0x07,
0xef, 0x9d, 0x79, 0x94, 0xf0, 0xcf, 0xe8, 0x3a, 0x64, 0x4f, 0xed, 0xd1, 0x94, 0x56, 0x52, 0x3b, 0xa2, 0xbd, 0x7f, 0xee, 0x51, 0xc2, 0x9b, 0xd1, 0x75, 0xc8, 0x9e, 0xd9, 0xe3, 0x19, 0xad, 0xa6,
0xd6, 0x6e, 0x81, 0x08, 0x01, 0xdf, 0x87, 0xa2, 0x36, 0x57, 0x80, 0x6e, 0x43, 0x66, 0x60, 0x87, 0x76, 0xad, 0xbd, 0x02, 0x11, 0x02, 0xbe, 0x07, 0x45, 0x6d, 0xac, 0x00, 0xdd, 0x82, 0xcc, 0xd0,
0x76, 0xc5, 0xda, 0x49, 0xef, 0xae, 0x55, 0x91, 0x9c, 0x4c, 0x83, 0x10, 0xfe, 0x1d, 0x7f, 0x07, 0x0e, 0xed, 0xaa, 0xb5, 0x9b, 0xde, 0xdb, 0xa8, 0x21, 0x39, 0x98, 0x06, 0x21, 0xbc, 0x1d, 0x7f,
0xd6, 0x6a, 0xd3, 0x70, 0xd8, 0x99, 0xbe, 0xe2, 0xc3, 0x90, 0x36, 0xac, 0x20, 0x21, 0x2e, 0x40, 0x0b, 0x36, 0xea, 0xb3, 0x70, 0xd4, 0x9d, 0xbd, 0xe4, 0xdd, 0x90, 0xd6, 0xad, 0x20, 0x21, 0x2e,
0xc7, 0x3e, 0x1b, 0xd3, 0x49, 0xc8, 0xac, 0x44, 0x90, 0xb1, 0x07, 0x03, 0x9f, 0x5b, 0x59, 0x20, 0x40, 0xd7, 0x3e, 0x9f, 0xd0, 0x69, 0xc8, 0xac, 0x44, 0x90, 0xb1, 0x87, 0x43, 0x9f, 0x5b, 0x59,
0xfc, 0x37, 0xda, 0x81, 0x35, 0x9f, 0xf6, 0xa9, 0x73, 0x4a, 0xfd, 0x47, 0xf4, 0x4c, 0x1a, 0xa6, 0x20, 0xfc, 0x1b, 0xed, 0xc2, 0x86, 0x4f, 0x07, 0xd4, 0x39, 0xa3, 0xfe, 0x43, 0x7a, 0x2e, 0x0d,
0xab, 0xd0, 0x1d, 0x28, 0x04, 0xb4, 0xef, 0x53, 0x36, 0x45, 0x25, 0xbd, 0x63, 0xed, 0xae, 0x55, 0xd3, 0x55, 0xe8, 0x36, 0x14, 0x02, 0x3a, 0xf0, 0x29, 0x1b, 0xa2, 0x9a, 0xde, 0xb5, 0xf6, 0x36,
0x4b, 0xd2, 0x26, 0xb1, 0x34, 0x89, 0xbf, 0xe3, 0xff, 0x58, 0xb0, 0x71, 0xe8, 0xcc, 0x1e, 0xb8, 0x6a, 0x25, 0x69, 0x93, 0x98, 0x9a, 0xc4, 0xed, 0xf8, 0x5f, 0x16, 0x6c, 0x1d, 0x39, 0xf3, 0xfb,
0x93, 0x63, 0xe7, 0xa4, 0xc6, 0x19, 0x43, 0xb7, 0x20, 0xd5, 0x3b, 0x93, 0xd4, 0x5c, 0x97, 0x23, 0xee, 0xf4, 0xc4, 0x39, 0xad, 0x73, 0xc6, 0xd0, 0x4d, 0x48, 0xf5, 0xcf, 0x25, 0x35, 0xd7, 0x65,
0x23, 0x0c, 0x67, 0x27, 0xd5, 0x63, 0xcb, 0xe4, 0x04, 0x9e, 0xdb, 0xb0, 0x5e, 0xbd, 0x96, 0x44, 0xcf, 0x08, 0xc3, 0xd9, 0x49, 0xf5, 0xd9, 0x34, 0x39, 0x81, 0xe7, 0x36, 0x6c, 0xd6, 0xae, 0x25,
0xd6, 0xfa, 0x21, 0x91, 0x10, 0x54, 0x85, 0xc2, 0xa9, 0x62, 0x43, 0xda, 0xb4, 0x80, 0xa7, 0xe6, 0x91, 0xf5, 0x41, 0x48, 0x24, 0x04, 0xd5, 0xa0, 0x70, 0xa6, 0xd8, 0x90, 0x36, 0x2d, 0xe1, 0xa9,
0x0a, 0x89, 0x61, 0xa8, 0x02, 0x39, 0x9b, 0xd1, 0xf5, 0xba, 0x92, 0x61, 0x4e, 0x36, 0x57, 0x88, 0xb5, 0x46, 0x62, 0x18, 0xaa, 0x42, 0xce, 0x66, 0x74, 0xbd, 0xaa, 0x66, 0x98, 0x93, 0xad, 0x35,
0x94, 0xd1, 0x5d, 0x00, 0x2f, 0x62, 0xa9, 0x92, 0xe5, 0xd3, 0xa9, 0x18, 0xc6, 0xf4, 0x35, 0x57, 0x22, 0x65, 0x74, 0x07, 0xc0, 0x8b, 0x58, 0xaa, 0x66, 0xf9, 0x70, 0x2a, 0x86, 0x31, 0x7d, 0xad,
0x88, 0x06, 0xfb, 0x69, 0x5e, 0xc6, 0x12, 0x3f, 0x80, 0xd5, 0x7a, 0xb3, 0xcb, 0x19, 0x40, 0xdf, 0x35, 0xa2, 0xc1, 0x7e, 0x9c, 0x97, 0xb1, 0xc4, 0xf7, 0x61, 0xbd, 0xd1, 0xea, 0x71, 0x06, 0xd0,
0x86, 0x34, 0xf5, 0x5e, 0x73, 0x5f, 0xe7, 0x58, 0x62, 0x5f, 0xd0, 0x16, 0xe4, 0x04, 0x59, 0xdc, 0xff, 0x43, 0x9a, 0x7a, 0xaf, 0xb8, 0xaf, 0x0b, 0x2c, 0xb1, 0x16, 0xb4, 0x0d, 0x39, 0x41, 0x16,
0xea, 0x02, 0x91, 0x12, 0xa6, 0x50, 0x52, 0x93, 0x3c, 0xf4, 0xdd, 0xa9, 0x87, 0xb6, 0x61, 0x55, 0xb7, 0xba, 0x40, 0xa4, 0x84, 0x29, 0x94, 0xd4, 0x20, 0x0f, 0x7c, 0x77, 0xe6, 0xa1, 0x1d, 0x58,
0x05, 0x41, 0xc6, 0x2b, 0x92, 0xc5, 0xb7, 0x70, 0xea, 0x4f, 0xa8, 0x2f, 0x03, 0x16, 0xc9, 0xe8, 0x57, 0x41, 0x90, 0xf1, 0x8a, 0x64, 0xd1, 0x16, 0xce, 0xfc, 0x29, 0xf5, 0x65, 0xc0, 0x22, 0x19,
0x5b, 0x50, 0x60, 0x5e, 0xb9, 0xbe, 0xf3, 0x4b, 0x2a, 0xd7, 0x88, 0x15, 0x78, 0xca, 0xd2, 0xb6, 0xfd, 0x1f, 0x14, 0x98, 0x57, 0xae, 0xef, 0xfc, 0x9c, 0xca, 0x39, 0x62, 0x05, 0x9e, 0xb1, 0xb4,
0xe3, 0xbb, 0xee, 0x71, 0x6b, 0x72, 0xec, 0xb2, 0x7c, 0xf4, 0x98, 0x20, 0x57, 0x10, 0x02, 0x4b, 0xed, 0xfa, 0xae, 0x7b, 0xd2, 0x9e, 0x9e, 0xb8, 0x2c, 0x1f, 0x3d, 0x26, 0xc8, 0x19, 0x84, 0xc0,
0x09, 0x6f, 0xfa, 0x6a, 0xe4, 0xf4, 0x5b, 0x13, 0x6f, 0x1a, 0xaa, 0x94, 0xd0, 0x54, 0x68, 0x1f, 0x52, 0xc2, 0x9b, 0xbd, 0x1c, 0x3b, 0x83, 0xf6, 0xd4, 0x9b, 0x85, 0x2a, 0x25, 0x34, 0x15, 0x3a,
0xf2, 0xc2, 0xee, 0x40, 0x92, 0xaf, 0xc2, 0x6a, 0xf8, 0x40, 0x14, 0x08, 0xf7, 0xa0, 0x7c, 0xe8, 0x80, 0xbc, 0xb0, 0x3b, 0x90, 0xe4, 0xab, 0xb0, 0x1a, 0x3e, 0x10, 0x05, 0xc2, 0x7d, 0x28, 0x1f,
0xcc, 0xea, 0xd4, 0x73, 0x03, 0x27, 0x94, 0x21, 0xdc, 0x82, 0x9c, 0x3d, 0x76, 0xa7, 0x93, 0x90, 0x39, 0xf3, 0x06, 0xf5, 0xdc, 0xc0, 0x09, 0x65, 0x08, 0xb7, 0x21, 0x67, 0x4f, 0xdc, 0xd9, 0x34,
0x2f, 0x9e, 0x21, 0x52, 0x42, 0xbb, 0xca, 0xa6, 0x54, 0x22, 0xac, 0x91, 0xd9, 0xd2, 0x4e, 0xfc, 0xe4, 0x93, 0x67, 0x88, 0x94, 0xd0, 0x9e, 0xb2, 0x29, 0x95, 0x08, 0x6b, 0x64, 0xb6, 0xb4, 0x13,
0x7b, 0x0b, 0x36, 0x0f, 0x9d, 0x59, 0x8f, 0x6d, 0xce, 0x63, 0xea, 0xcb, 0x79, 0x77, 0x21, 0xeb, 0xff, 0xce, 0x82, 0xca, 0x91, 0x33, 0xef, 0xb3, 0xc5, 0x79, 0x42, 0x7d, 0x39, 0xee, 0x1e, 0x64,
0x70, 0xbb, 0xad, 0xe5, 0xe3, 0x39, 0x00, 0xed, 0x41, 0xce, 0x9d, 0x86, 0xca, 0xc5, 0xc5, 0x50, 0x1d, 0x6e, 0xb7, 0xb5, 0xba, 0x3f, 0x07, 0xa0, 0x7d, 0xc8, 0xb9, 0xb3, 0x50, 0xb9, 0xb8, 0x1c,
0x89, 0x60, 0xd8, 0xfe, 0xd0, 0x9e, 0x9c, 0xd0, 0xb9, 0x6c, 0xd3, 0xb0, 0x02, 0x81, 0xfb, 0xdc, 0x2a, 0x11, 0x0c, 0x3b, 0x18, 0xd9, 0xd3, 0x53, 0xba, 0x90, 0x6d, 0x1a, 0x56, 0x20, 0xf0, 0x80,
0xac, 0x67, 0x4e, 0x38, 0x1c, 0xf8, 0xf6, 0xdb, 0x0b, 0xdc, 0xbd, 0x0f, 0xc5, 0xc0, 0xa3, 0x93, 0x9b, 0xf5, 0xd4, 0x09, 0x47, 0x43, 0xdf, 0x7e, 0x73, 0x81, 0xbb, 0xf7, 0xa0, 0x18, 0x78, 0x74,
0xc1, 0x03, 0x77, 0x3c, 0x76, 0xc2, 0xa0, 0x92, 0x4a, 0x6c, 0xfa, 0x78, 0x7a, 0x03, 0x87, 0xbf, 0x3a, 0xbc, 0xef, 0x4e, 0x26, 0x4e, 0x18, 0x54, 0x53, 0x89, 0x45, 0x1f, 0x0f, 0x6f, 0xe0, 0xf0,
0x00, 0x74, 0xe8, 0xcc, 0x6a, 0x2a, 0xb2, 0x72, 0x95, 0x7b, 0xb0, 0xc6, 0x82, 0xad, 0x26, 0xb3, 0x97, 0x80, 0x8e, 0x9c, 0x79, 0x5d, 0x45, 0x56, 0xce, 0x72, 0x17, 0x36, 0x58, 0xb0, 0xd5, 0x60,
0x96, 0x4e, 0xa6, 0xc3, 0xf0, 0x5f, 0x52, 0x50, 0x60, 0x93, 0x89, 0x39, 0xd6, 0x21, 0x15, 0x8a, 0xd6, 0xca, 0xc1, 0x74, 0x18, 0xfe, 0x73, 0x0a, 0x0a, 0x6c, 0x30, 0x31, 0xc6, 0x26, 0xa4, 0x42,
0xed, 0x9a, 0x25, 0xa9, 0xf0, 0x0c, 0x7d, 0x0a, 0xb9, 0x3e, 0xdf, 0x80, 0x92, 0xa6, 0xad, 0x05, 0xb1, 0x5c, 0xb3, 0x24, 0x15, 0x9e, 0xa3, 0xcf, 0x20, 0x37, 0xe0, 0x0b, 0x50, 0xd2, 0xb4, 0xbd,
0x1b, 0xd3, 0x71, 0x27, 0x6c, 0x3f, 0x09, 0x1c, 0xba, 0x0b, 0xf9, 0x81, 0x88, 0xb5, 0x64, 0xeb, 0x64, 0x61, 0x3a, 0xee, 0x94, 0xad, 0x27, 0x81, 0x43, 0x77, 0x20, 0x3f, 0x14, 0xb1, 0x96, 0x6c,
0xfd, 0x78, 0x88, 0x91, 0x04, 0xcd, 0x15, 0xa2, 0x90, 0xe8, 0x3e, 0xac, 0xbe, 0x95, 0x94, 0xf1, 0xbd, 0x1f, 0x77, 0x31, 0x92, 0xa0, 0xb5, 0x46, 0x14, 0x12, 0xdd, 0x83, 0xf5, 0x37, 0x92, 0x32,
0x0d, 0xba, 0x56, 0xad, 0xc4, 0xa3, 0x4c, 0x32, 0x9b, 0x2b, 0x24, 0xc2, 0xb2, 0x71, 0xa1, 0xcc, 0xbe, 0x40, 0x37, 0x6a, 0xd5, 0xb8, 0x97, 0x49, 0x66, 0x6b, 0x8d, 0x44, 0x58, 0xd6, 0x2f, 0x94,
0x00, 0xb9, 0x75, 0xb5, 0x71, 0x66, 0x6e, 0xb0, 0x71, 0x0a, 0x8b, 0x7e, 0xac, 0x6f, 0x94, 0x1c, 0x19, 0x20, 0x97, 0xae, 0xd6, 0xcf, 0xcc, 0x0d, 0xd6, 0x4f, 0x61, 0xd1, 0x0f, 0xf5, 0x85, 0x92,
0x1f, 0x78, 0x23, 0x1e, 0x98, 0x20, 0x96, 0x55, 0x92, 0x08, 0x1d, 0x6f, 0xfd, 0x26, 0x20, 0xe9, 0xe3, 0x1d, 0x3f, 0x88, 0x3b, 0x26, 0x88, 0x65, 0x3b, 0x49, 0x84, 0x8e, 0x97, 0x7e, 0x0b, 0x90,
0x4f, 0x47, 0xdb, 0x1d, 0xdb, 0xb0, 0x3a, 0x71, 0x43, 0xda, 0xb4, 0x83, 0xa1, 0xda, 0xba, 0x4a, 0xf4, 0xa7, 0xab, 0xad, 0x8e, 0x1d, 0x58, 0x9f, 0xba, 0x21, 0x6d, 0xd9, 0xc1, 0x48, 0x2d, 0x5d,
0xd6, 0xd2, 0x40, 0x6c, 0x2b, 0x29, 0xe1, 0x3f, 0x59, 0x70, 0x4d, 0x39, 0xa9, 0xcf, 0x85, 0xa1, 0x25, 0x6b, 0x69, 0x20, 0x96, 0x95, 0x94, 0xf0, 0x1f, 0x2d, 0xb8, 0xa6, 0x9c, 0xd4, 0xc7, 0xc2,
0x18, 0xfa, 0x94, 0x12, 0xd7, 0x0d, 0xb5, 0xf9, 0x0c, 0x1d, 0xba, 0x05, 0xa5, 0xc9, 0x74, 0x34, 0x50, 0x0c, 0x7d, 0x4a, 0x89, 0xeb, 0x86, 0xda, 0x78, 0x86, 0x0e, 0xdd, 0x84, 0xd2, 0x74, 0x36,
0x72, 0x8e, 0x1d, 0xea, 0x73, 0x90, 0x98, 0xda, 0x54, 0xa2, 0x7d, 0x40, 0x91, 0x07, 0x5d, 0x96, 0x1e, 0x3b, 0x27, 0x0e, 0xf5, 0x39, 0x48, 0x0c, 0x6d, 0x2a, 0xd1, 0x01, 0xa0, 0xc8, 0x83, 0x1e,
0x49, 0x1c, 0x2a, 0x2a, 0xc4, 0x82, 0x2f, 0x9a, 0xa5, 0x19, 0xc3, 0xd2, 0x7f, 0x5a, 0x50, 0x51, 0xcb, 0x24, 0x0e, 0x15, 0x3b, 0xc4, 0x92, 0x16, 0xcd, 0xd2, 0x8c, 0x61, 0xe9, 0xdf, 0x2d, 0xa8,
0xb4, 0x72, 0x1b, 0xdf, 0xc1, 0xdc, 0x60, 0xe8, 0xd0, 0xd1, 0xa0, 0xc6, 0x27, 0x7c, 0xae, 0xcc, 0x2a, 0x5a, 0xb9, 0x8d, 0xef, 0x60, 0x6e, 0x30, 0x72, 0xe8, 0x78, 0x58, 0xe7, 0x03, 0x3e, 0x53,
0x35, 0x94, 0x49, 0xd4, 0x0b, 0x69, 0xa9, 0xa9, 0x5c, 0xe2, 0x54, 0x66, 0xa9, 0x53, 0x73, 0x54, 0xe6, 0x1a, 0xca, 0x24, 0xea, 0xb9, 0xb4, 0xd4, 0x54, 0xae, 0x70, 0x2a, 0xb3, 0xd2, 0xa9, 0x05,
0x65, 0x17, 0x50, 0x85, 0xff, 0x6a, 0xc1, 0x0d, 0xe5, 0xe2, 0x11, 0xdf, 0xff, 0x97, 0x0d, 0xef, 0xaa, 0xb2, 0x4b, 0xa8, 0xc2, 0xbf, 0xb4, 0xe0, 0x03, 0xe5, 0xe2, 0x31, 0x5f, 0xff, 0x97, 0x0d,
0xd7, 0xe9, 0x5b, 0x15, 0x0a, 0x83, 0x61, 0x57, 0x96, 0xd9, 0xcc, 0x39, 0x65, 0x36, 0x86, 0xe1, 0xef, 0x37, 0xe8, 0x1b, 0xfe, 0x8b, 0x05, 0xd7, 0xa3, 0x34, 0xbc, 0x2a, 0xc9, 0x7b, 0xb0, 0x65,
0xbf, 0x59, 0x70, 0x3d, 0x4a, 0xdd, 0xab, 0x06, 0x66, 0x17, 0x36, 0x6c, 0x6d, 0x6c, 0xdc, 0x0e, 0x6b, 0x7d, 0xe3, 0xa3, 0x3d, 0xa9, 0x66, 0xc6, 0x44, 0x2a, 0x2d, 0x25, 0x4c, 0xe5, 0x55, 0x89,
0x24, 0xd5, 0xcc, 0x81, 0x48, 0xa5, 0xa5, 0x91, 0xa9, 0xbc, 0x6a, 0x70, 0xf0, 0x0e, 0x40, 0x63, 0xc6, 0xbb, 0x00, 0xcd, 0xb9, 0x13, 0x84, 0x4f, 0xd8, 0x3a, 0xd1, 0x4a, 0x13, 0x6b, 0x6f, 0x5d,
0xe6, 0x04, 0xe1, 0x53, 0xb6, 0xb7, 0xb4, 0x76, 0xc6, 0xda, 0x5d, 0x95, 0xed, 0xcc, 0x6d, 0x28, 0x96, 0x26, 0xb7, 0xa0, 0x2c, 0xf6, 0x9f, 0xbe, 0x4f, 0xe9, 0x23, 0x6a, 0x9f, 0x51, 0xb3, 0x84,
0x8b, 0x9a, 0xd5, 0xf3, 0x29, 0x7d, 0x4c, 0xed, 0x53, 0x6a, 0xb6, 0x3d, 0x45, 0x89, 0xfb, 0x08, 0x29, 0x4a, 0xdc, 0xc7, 0xb0, 0x15, 0xe3, 0x98, 0x7f, 0xcb, 0x61, 0x7f, 0xb0, 0x74, 0x5c, 0xd7,
0x36, 0x62, 0x1c, 0xf3, 0x6f, 0x31, 0xec, 0x8f, 0x96, 0x8e, 0xeb, 0xf8, 0xee, 0x29, 0xe5, 0x67, 0x77, 0xcf, 0x28, 0x3f, 0x27, 0x4d, 0x92, 0x22, 0x99, 0xb5, 0xf1, 0x53, 0xa4, 0x47, 0x43, 0xbe,
0xab, 0x49, 0x52, 0x24, 0xb3, 0x6f, 0xfc, 0xe4, 0xe9, 0xd2, 0x90, 0xd7, 0xe9, 0x02, 0x89, 0x64, 0xe7, 0x16, 0x48, 0x24, 0xa3, 0x1b, 0x00, 0x9e, 0xd8, 0x29, 0x87, 0x74, 0xce, 0xf9, 0x28, 0x11,
0x74, 0x13, 0xc0, 0x13, 0xd5, 0x75, 0x40, 0x67, 0x9c, 0x8f, 0x12, 0xd1, 0x34, 0xec, 0x5c, 0x9e, 0x4d, 0xc3, 0xce, 0xd8, 0xe9, 0x6c, 0x22, 0x6c, 0xe6, 0x1c, 0x94, 0x48, 0xac, 0x40, 0x55, 0xc8,
0x4c, 0xc7, 0xc2, 0x66, 0xce, 0x41, 0x89, 0xc4, 0x0a, 0x54, 0x81, 0xfc, 0x90, 0x8e, 0x3c, 0xea, 0x8f, 0xe8, 0xd8, 0xa3, 0x7e, 0x50, 0xcd, 0xee, 0xa6, 0xf7, 0x4a, 0x44, 0x89, 0xb8, 0x09, 0x1b,
0x07, 0x95, 0xec, 0x4e, 0x7a, 0xb7, 0x44, 0x94, 0x88, 0x1b, 0xb0, 0xc6, 0x8c, 0xe3, 0x45, 0x9b, 0xcc, 0x38, 0xbe, 0x01, 0xd3, 0xd7, 0x17, 0x99, 0x37, 0xa6, 0xf6, 0x89, 0xb6, 0x9c, 0x23, 0x19,
0xbe, 0xb9, 0xc8, 0xbc, 0x11, 0xb5, 0x8f, 0xb5, 0x12, 0x10, 0xc9, 0xf8, 0x16, 0x14, 0x39, 0x67, 0xdf, 0x84, 0x22, 0xe7, 0xcc, 0x09, 0x42, 0x42, 0x03, 0x8f, 0x9d, 0xe2, 0x8c, 0x82, 0x40, 0x56,
0x4e, 0x10, 0x12, 0x1a, 0x78, 0xec, 0xe4, 0x67, 0x14, 0x04, 0xb2, 0x5b, 0x14, 0x02, 0x7e, 0x09, 0x7e, 0x42, 0xc0, 0x2f, 0x60, 0x33, 0xae, 0x5d, 0xba, 0xb6, 0xe3, 0xa3, 0x5b, 0xb0, 0xa9, 0x4a,
0xeb, 0x71, 0xbf, 0xd3, 0xb1, 0x1d, 0x1f, 0xdd, 0x86, 0x75, 0xd5, 0x76, 0xc8, 0x94, 0x10, 0xab, 0x08, 0x99, 0x12, 0x62, 0xd6, 0x84, 0x96, 0x9d, 0xff, 0xfc, 0xa8, 0xe9, 0xfa, 0x8e, 0x56, 0x12,
0x26, 0xb4, 0xac, 0x67, 0xe0, 0xc7, 0x53, 0xc7, 0x77, 0xb4, 0x36, 0x52, 0x53, 0xe1, 0x5b, 0x90, 0x6a, 0x2a, 0x7c, 0x13, 0x72, 0x12, 0x5b, 0x04, 0xeb, 0x99, 0x1c, 0xc6, 0x7a, 0xc6, 0xa4, 0xe7,
0x93, 0xd8, 0x22, 0x58, 0xcf, 0xe5, 0x34, 0xd6, 0x73, 0x26, 0xbd, 0x90, 0x78, 0xeb, 0x05, 0xfe, 0x12, 0x6f, 0x3d, 0xc7, 0x1f, 0x42, 0xbe, 0xeb, 0x3b, 0x67, 0xb2, 0xf2, 0x8c, 0x12, 0x20, 0xae,
0x00, 0xf2, 0x1d, 0xdf, 0x39, 0x95, 0xdd, 0x6a, 0x94, 0x00, 0x71, 0x3f, 0x8b, 0xba, 0x43, 0xdb, 0x4d, 0x51, 0x6f, 0x64, 0xfb, 0xb4, 0xa7, 0x8a, 0x47, 0x6e, 0xe4, 0x1e, 0xe4, 0x3d, 0xd1, 0x49,
0xa7, 0x5d, 0xd5, 0x70, 0x72, 0x23, 0x77, 0x21, 0xef, 0x89, 0x41, 0xf2, 0xd0, 0x5f, 0x57, 0x9d, 0x1e, 0xe0, 0x9b, 0xaa, 0x8a, 0x12, 0x5a, 0xa2, 0x9a, 0xd1, 0xa7, 0xaa, 0x72, 0x75, 0xa6, 0xa7,
0x97, 0xd0, 0x12, 0xf5, 0x19, 0x7d, 0xa2, 0xba, 0x5d, 0x67, 0x72, 0xd2, 0x79, 0x2d, 0x0f, 0xb4, 0xdd, 0x57, 0xf2, 0x70, 0x4a, 0xd4, 0x5c, 0x3a, 0x02, 0xff, 0xc6, 0x82, 0x4a, 0x7d, 0x30, 0x60,
0x44, 0x9f, 0xa6, 0x23, 0xf0, 0x6f, 0x2d, 0xd8, 0xac, 0xf5, 0xfb, 0x6c, 0x47, 0xb2, 0xc9, 0xec, 0xab, 0x8b, 0x0d, 0x66, 0x0f, 0x78, 0x59, 0xf8, 0x3d, 0xa3, 0xf8, 0x13, 0x73, 0xbe, 0xb7, 0x50,
0x3e, 0x6f, 0x25, 0x7f, 0x60, 0x34, 0x8c, 0x62, 0xcd, 0xf7, 0xe6, 0x1a, 0x46, 0x66, 0x9b, 0xde, 0xfc, 0x31, 0xdb, 0xf4, 0xf2, 0x0f, 0xd5, 0x61, 0x33, 0x30, 0xac, 0x97, 0x06, 0xa8, 0x33, 0x64,
0x32, 0xa2, 0x1a, 0xac, 0x07, 0x86, 0xf5, 0xd2, 0x00, 0x75, 0xee, 0xcc, 0xbb, 0x46, 0x12, 0x03, 0xd1, 0x35, 0x92, 0xe8, 0x80, 0x7f, 0x02, 0x95, 0xa7, 0xf6, 0x78, 0x4c, 0xc3, 0xfa, 0x70, 0xe8,
0xf0, 0xcf, 0x60, 0xf3, 0x99, 0x3d, 0x1a, 0xd1, 0xb0, 0x36, 0x18, 0xf8, 0xd2, 0x22, 0x54, 0x15, 0x4b, 0x8b, 0x50, 0x4d, 0xf8, 0x6f, 0x0f, 0x94, 0x2d, 0xea, 0x34, 0x5b, 0xb0, 0x9c, 0x28, 0x60,
0xfe, 0xdb, 0x7d, 0x65, 0x8b, 0x3a, 0x01, 0xe7, 0x2c, 0x27, 0x0a, 0x18, 0xdd, 0x05, 0x52, 0xf1, 0x54, 0xd7, 0xa7, 0xe2, 0xba, 0x9e, 0xed, 0x1e, 0x20, 0xa6, 0x6a, 0xd8, 0xa1, 0x7d, 0xe9, 0xd8,
0x5d, 0x80, 0x55, 0x0f, 0x10, 0x4b, 0xd5, 0xed, 0xd0, 0xbe, 0x74, 0xec, 0x31, 0x14, 0x45, 0xfb, 0x63, 0x28, 0x8a, 0x52, 0xd2, 0xd8, 0x34, 0x0c, 0xdd, 0xb2, 0xbd, 0x25, 0xbd, 0x7c, 0x6f, 0x59,
0x69, 0x14, 0x0d, 0x43, 0xb7, 0xa8, 0xb6, 0xa4, 0x17, 0xd7, 0x96, 0x25, 0xe7, 0x0e, 0xdb, 0x60, 0x71, 0x86, 0xb0, 0x05, 0xc6, 0xb6, 0x4c, 0x62, 0x4f, 0x87, 0xee, 0x44, 0xee, 0xc1, 0x9a, 0x06,
0xac, 0xcc, 0x12, 0x7b, 0x32, 0x70, 0xc7, 0xb2, 0x6e, 0x6b, 0x1a, 0xfc, 0x12, 0x36, 0x1b, 0x93, 0xbf, 0x80, 0x4a, 0x73, 0x3a, 0x70, 0x87, 0x74, 0xa8, 0xb9, 0x50, 0x85, 0x3c, 0x15, 0x4a, 0x69,
0xbe, 0x3b, 0xa0, 0x03, 0xcd, 0x85, 0x0a, 0xe4, 0xa9, 0x50, 0x4a, 0xdb, 0x95, 0x88, 0xee, 0x40, 0xbb, 0x12, 0xd1, 0x6d, 0xc8, 0xfb, 0xf6, 0x1b, 0x06, 0x92, 0x41, 0x50, 0xc5, 0x7b, 0xdc, 0x9b,
0xde, 0xb7, 0xdf, 0x32, 0x90, 0x0c, 0x82, 0x6a, 0xf8, 0xe3, 0xd1, 0x44, 0x21, 0xf0, 0x2f, 0xf8, 0x28, 0x04, 0xfe, 0x19, 0x1f, 0xdb, 0x3f, 0xf7, 0x42, 0x6d, 0xec, 0xb8, 0x2c, 0xb7, 0xf4, 0xb2,
0xdc, 0xfe, 0x99, 0x17, 0x6a, 0x73, 0xc7, 0xad, 0xbc, 0xa5, 0xb7, 0xf2, 0xe8, 0xfb, 0x50, 0x14, 0x1c, 0x7d, 0x17, 0x8a, 0x02, 0xa5, 0xd1, 0xb1, 0x90, 0x64, 0x06, 0x04, 0xff, 0xc2, 0x82, 0x4a,
0x28, 0x8d, 0x8e, 0xb9, 0x24, 0x33, 0x20, 0xf8, 0x57, 0x16, 0x6c, 0xd6, 0xe9, 0x65, 0x17, 0xa8, 0x83, 0x5e, 0x76, 0x82, 0x5a, 0x34, 0x41, 0xbc, 0xd8, 0x16, 0x73, 0xde, 0xc0, 0xa8, 0x4b, 0x46,
0x46, 0x0b, 0xc4, 0x9b, 0x6d, 0x3e, 0xe7, 0x0d, 0x8c, 0xba, 0x98, 0xa4, 0x97, 0x5d, 0x4c, 0xf0, 0x7a, 0xd5, 0x25, 0x03, 0xff, 0xd6, 0x82, 0x2d, 0x55, 0x97, 0xb0, 0x5d, 0x8b, 0x6d, 0x36, 0x3c,
0xef, 0x2c, 0xd8, 0x50, 0xbd, 0x0c, 0xab, 0x5a, 0xac, 0xd8, 0xf0, 0xc0, 0x8a, 0x50, 0xd7, 0xe2, 0xb0, 0x22, 0xd4, 0xf5, 0xf8, 0x0e, 0x68, 0xe8, 0x58, 0x58, 0x44, 0xa0, 0xeb, 0x71, 0x36, 0x69,
0x7b, 0xa3, 0xa1, 0x63, 0x61, 0x11, 0x81, 0xae, 0xc5, 0xd9, 0xa4, 0x69, 0x8c, 0xa3, 0x82, 0x43, 0x1a, 0xe3, 0xa8, 0xe0, 0x90, 0xe4, 0x51, 0xc1, 0x51, 0x66, 0xd0, 0xa3, 0x4a, 0x17, 0x7f, 0x65,
0x92, 0x47, 0x05, 0x47, 0x99, 0x41, 0x8f, 0xba, 0x63, 0xfc, 0xa5, 0x05, 0x65, 0xd3, 0xaa, 0xc0, 0x41, 0xd9, 0xb4, 0x2a, 0xf0, 0xde, 0x7a, 0x98, 0x7e, 0x62, 0xde, 0x04, 0x96, 0x04, 0x55, 0x5e,
0x3b, 0xf7, 0x00, 0xfe, 0xd8, 0xbc, 0x3d, 0x2c, 0x08, 0xaa, 0xbc, 0xe4, 0x5c, 0xf5, 0x0a, 0xf3, 0x58, 0xae, 0x7a, 0x1d, 0xf9, 0xca, 0x82, 0x12, 0x3f, 0x25, 0xec, 0x70, 0xc4, 0x4d, 0xb9, 0xd4,
0xa5, 0x05, 0x25, 0x7e, 0x4a, 0xd8, 0xe1, 0x90, 0x9b, 0x72, 0xa9, 0x23, 0x75, 0x9b, 0x35, 0xa7, 0x91, 0xba, 0xc3, 0x0a, 0x4d, 0xd1, 0x49, 0x9d, 0x18, 0x4a, 0xd6, 0xf7, 0xfc, 0xb4, 0xb1, 0xe7,
0x62, 0x90, 0x3a, 0x31, 0x94, 0xac, 0xd7, 0xfc, 0xb4, 0x51, 0xf3, 0xd9, 0x59, 0x71, 0x6a, 0x8f, 0xb3, 0xb3, 0xe2, 0xcc, 0x1e, 0x3b, 0x43, 0xde, 0x2d, 0xc3, 0xdb, 0x62, 0x05, 0x3e, 0x80, 0x72,
0x9c, 0x01, 0x1f, 0x96, 0xe1, 0xdf, 0x62, 0x05, 0xde, 0x87, 0x72, 0xd4, 0x29, 0xaa, 0x48, 0x9d, 0x54, 0xf5, 0xa9, 0x48, 0xbd, 0x85, 0x12, 0xfc, 0xd7, 0x14, 0x54, 0x12, 0x1d, 0x02, 0x0f, 0x7d,
0x43, 0x09, 0xfe, 0x7b, 0x0a, 0x36, 0x13, 0x03, 0x02, 0x0f, 0x7d, 0xd7, 0x48, 0xae, 0x85, 0x4c, 0xdb, 0x48, 0xae, 0xa5, 0x4c, 0xa9, 0x7c, 0xfb, 0xef, 0xd4, 0x8a, 0xba, 0xc9, 0x99, 0x44, 0x14,
0xa9, 0x7c, 0xfb, 0xff, 0xf4, 0x97, 0xba, 0xc9, 0x99, 0x44, 0x14, 0xb1, 0xbc, 0x14, 0xc9, 0x5c, 0xb1, 0xbc, 0xe0, 0xc8, 0x5c, 0x96, 0xab, 0xdd, 0xd0, 0x31, 0x92, 0xb8, 0x7c, 0x38, 0xb6, 0x4f,
0x96, 0xbb, 0xdd, 0xd0, 0x31, 0x92, 0xb8, 0x7c, 0x30, 0xb2, 0x4f, 0x78, 0xff, 0x5e, 0x22, 0xb1, 0x79, 0x2d, 0x5e, 0x22, 0xb1, 0xc2, 0x48, 0x3b, 0x8e, 0xc8, 0x73, 0x84, 0xa9, 0x44, 0x35, 0x28,
0xc2, 0x48, 0x3b, 0x8e, 0xc8, 0x73, 0x84, 0xa9, 0x64, 0x2d, 0x56, 0x28, 0x4e, 0x7e, 0xf7, 0xb8, 0x84, 0xe2, 0xe4, 0x77, 0x4f, 0xaa, 0xeb, 0x46, 0x1a, 0x18, 0xb1, 0x26, 0x31, 0x0c, 0x1f, 0x42,
0xb2, 0x6a, 0xa4, 0x81, 0x11, 0x6b, 0x12, 0xc3, 0xf0, 0x01, 0x14, 0xf9, 0xab, 0xcb, 0x25, 0xa8, 0x91, 0xbf, 0xa0, 0x5c, 0x82, 0x7a, 0x1e, 0x7e, 0x97, 0xf0, 0xc5, 0xc0, 0x49, 0x2b, 0x91, 0x48,
0xe7, 0xe1, 0x77, 0x09, 0xdf, 0x0c, 0x9c, 0xb4, 0x12, 0x89, 0x64, 0xfc, 0x55, 0x0a, 0x4a, 0xda, 0xc6, 0x5f, 0xa7, 0xa0, 0xa4, 0x0d, 0x14, 0x78, 0x71, 0xee, 0x5a, 0x17, 0xe4, 0xee, 0x0d, 0x00,
0x44, 0x81, 0x17, 0xe7, 0xae, 0x75, 0x41, 0xee, 0xde, 0x04, 0xb0, 0xa3, 0x87, 0x1f, 0xb5, 0xe7, 0x3b, 0x7a, 0xc4, 0x51, 0x6b, 0x2e, 0xd6, 0xb0, 0xc3, 0x98, 0x4b, 0x92, 0x3d, 0x11, 0x03, 0x5d,
0x62, 0x0d, 0x3b, 0x8c, 0xb9, 0x24, 0xd9, 0x13, 0x31, 0xd0, 0x55, 0xcc, 0x30, 0x26, 0xea, 0xe4, 0xc5, 0x0c, 0x63, 0xa2, 0x4e, 0xbe, 0x92, 0x57, 0x04, 0x32, 0x7b, 0xa9, 0x40, 0xe6, 0x12, 0x04,
0x2b, 0x79, 0x49, 0x20, 0xb3, 0x97, 0x0a, 0x64, 0x2e, 0x41, 0x80, 0x11, 0xa4, 0x7c, 0x32, 0x48, 0x18, 0x41, 0xca, 0x27, 0x83, 0xf4, 0x2e, 0xf4, 0xff, 0xde, 0x82, 0xb2, 0xaa, 0xb3, 0x2f, 0x15,
0xef, 0x42, 0xff, 0x1f, 0x2c, 0x28, 0xab, 0xde, 0xfc, 0x52, 0x31, 0xd8, 0x82, 0x5c, 0xe8, 0x6a, 0x83, 0x6d, 0xc8, 0x85, 0xae, 0xb6, 0x39, 0x49, 0x89, 0x91, 0x18, 0xba, 0x2c, 0x00, 0xda, 0xae,
0xc5, 0x49, 0x4a, 0x8c, 0xc4, 0xd0, 0x65, 0x01, 0xd0, 0xaa, 0x92, 0xa6, 0x49, 0x14, 0xb6, 0xcc, 0xa4, 0x69, 0x12, 0x1b, 0x5b, 0x66, 0x61, 0x63, 0x8b, 0xb7, 0xac, 0xac, 0xb1, 0x65, 0xed, 0x43,
0x5c, 0x61, 0x8b, 0x4b, 0x56, 0xd6, 0x28, 0x59, 0x7b, 0x50, 0xec, 0x6a, 0x7d, 0xfc, 0xb9, 0xdd, 0xb1, 0xa7, 0xd5, 0xe4, 0x6f, 0xad, 0x76, 0xfe, 0x94, 0x06, 0x64, 0xde, 0x8b, 0x78, 0x7c, 0x2f,
0xce, 0x9f, 0xd3, 0x80, 0xcc, 0xbb, 0x14, 0x8f, 0xef, 0xa5, 0x13, 0xe1, 0x9b, 0x9d, 0xa9, 0xa5, 0x9d, 0x08, 0xff, 0x5b, 0x99, 0x5a, 0x6a, 0xa0, 0xef, 0x43, 0x51, 0xbf, 0x0d, 0x55, 0x0b, 0xbc,
0x06, 0xfa, 0x21, 0x14, 0xf5, 0x1b, 0x54, 0xa5, 0xc0, 0x87, 0x5d, 0x8b, 0x9a, 0xab, 0xf8, 0x13, 0xdb, 0xb5, 0xa8, 0xb8, 0x8a, 0x9b, 0x88, 0x01, 0x64, 0x4e, 0x89, 0xe0, 0xc9, 0xe2, 0x02, 0x84,
0x31, 0x80, 0xcc, 0x29, 0x11, 0x3c, 0xd9, 0x5c, 0x80, 0x70, 0x4a, 0xd7, 0xe1, 0x7f, 0x5b, 0x70, 0x53, 0xba, 0x0e, 0xff, 0xd3, 0x82, 0x6b, 0x89, 0xfb, 0xdd, 0xd5, 0x62, 0xa5, 0xb3, 0x9a, 0x4a,
0x2d, 0x71, 0x27, 0xbc, 0x5a, 0xac, 0x74, 0x56, 0x53, 0x09, 0x56, 0xaf, 0x78, 0x18, 0xcd, 0x79, 0xb0, 0x7a, 0xc5, 0xc3, 0x68, 0xc1, 0xd3, 0xcc, 0xbb, 0x7a, 0x9a, 0x5d, 0xe2, 0xe9, 0xdf, 0x2c,
0x9a, 0x79, 0x57, 0x4f, 0xb3, 0x0b, 0x3c, 0xfd, 0x87, 0x05, 0x9b, 0x89, 0x1d, 0x16, 0x78, 0xe8, 0xa8, 0x24, 0x56, 0x58, 0xe0, 0xa1, 0x2f, 0xa0, 0x14, 0xea, 0x99, 0x2a, 0xfd, 0xfd, 0x20, 0x0a,
0x73, 0x28, 0x85, 0x7a, 0xa6, 0x4a, 0x7f, 0x6f, 0x44, 0x41, 0x49, 0x66, 0x31, 0x31, 0xf1, 0xe8, 0x4a, 0x32, 0x8b, 0x89, 0x89, 0x47, 0x9f, 0x43, 0x31, 0xb4, 0xfd, 0x53, 0x1a, 0x1e, 0xeb, 0xef,
0x33, 0x28, 0x86, 0xb6, 0x7f, 0x42, 0xc3, 0x23, 0xfd, 0xcd, 0x6d, 0x3b, 0x31, 0x5e, 0xa3, 0x96, 0x67, 0x3b, 0x89, 0xfe, 0x1a, 0xb5, 0xc4, 0xc0, 0xb3, 0xfe, 0xe2, 0xad, 0x4c, 0xf6, 0x4f, 0x5f,
0x18, 0x78, 0x36, 0x5e, 0xbc, 0xaf, 0xc9, 0xf1, 0xe9, 0x8b, 0xc7, 0xeb, 0x78, 0xfc, 0xeb, 0x14, 0xdc, 0x5f, 0xc7, 0xe3, 0x5f, 0xa5, 0x60, 0xcb, 0x60, 0x26, 0x48, 0xd6, 0x94, 0x56, 0xb2, 0xa6,
0x6c, 0x18, 0xcc, 0x04, 0xc9, 0x9e, 0xd2, 0x4a, 0xf6, 0x94, 0xac, 0x03, 0x56, 0x4e, 0x48, 0x8c, 0x64, 0x15, 0xb0, 0x72, 0x42, 0x62, 0x44, 0xe4, 0x12, 0x5a, 0x46, 0xab, 0x98, 0x4b, 0xa2, 0xc4,
0x88, 0x5c, 0x42, 0xcb, 0x68, 0x15, 0x6b, 0x49, 0x94, 0xd8, 0x5b, 0x86, 0x0e, 0x7d, 0x0c, 0x19, 0xda, 0x32, 0x74, 0xe8, 0x13, 0xc8, 0xb0, 0x91, 0xdf, 0x16, 0x2b, 0x0e, 0x40, 0x9f, 0x2e, 0x3c,
0x36, 0xf3, 0x79, 0xb1, 0xe2, 0x00, 0xf4, 0xc9, 0xdc, 0x83, 0xd6, 0x42, 0x70, 0xfc, 0x92, 0x75, 0x4e, 0x2d, 0x05, 0xc7, 0xaf, 0x52, 0xb7, 0xa3, 0x77, 0xc6, 0xdc, 0x6a, 0xb8, 0x7a, 0x68, 0xfc,
0x27, 0x7a, 0x9b, 0xcc, 0x2d, 0x87, 0xab, 0xc7, 0xc9, 0xdf, 0xa4, 0x60, 0x43, 0xdc, 0x20, 0xf8, 0x75, 0x0a, 0xb6, 0xc4, 0x0d, 0x82, 0xdf, 0x4b, 0xf9, 0x93, 0xee, 0xdb, 0xb6, 0x4f, 0x7e, 0x6f,
0xbd, 0x94, 0x3f, 0x03, 0x9f, 0x57, 0x3e, 0xf9, 0xbd, 0x55, 0x56, 0x13, 0xe9, 0x7d, 0xac, 0xb8, 0x95, 0xbb, 0x89, 0xf4, 0x3e, 0x56, 0x5c, 0x79, 0x6b, 0xb9, 0x01, 0xe0, 0x04, 0x44, 0xbd, 0x43,
0x72, 0x69, 0xb9, 0x09, 0xe0, 0x04, 0x44, 0xbd, 0x5d, 0x67, 0xf8, 0xd5, 0x5e, 0xd3, 0xb0, 0x9e, 0x67, 0xf8, 0xd5, 0x5e, 0xd3, 0xb0, 0x9a, 0xc8, 0x16, 0x77, 0x16, 0x99, 0x9a, 0x4a, 0xe4, 0xf5,
0xc8, 0x16, 0x77, 0x16, 0x99, 0x9a, 0x4a, 0xe4, 0xfd, 0x4a, 0x68, 0x87, 0xd3, 0x80, 0x3b, 0x19, 0x4a, 0x68, 0x87, 0xb3, 0x80, 0x3b, 0x19, 0xff, 0x2f, 0xe9, 0xb8, 0x21, 0xed, 0xf1, 0x06, 0x22,
0xff, 0xc7, 0xd2, 0x76, 0x43, 0xda, 0xe5, 0x1f, 0x88, 0x04, 0x68, 0xad, 0x4d, 0xfe, 0x82, 0xd6, 0x01, 0x5a, 0x69, 0x93, 0xbf, 0xa0, 0xb4, 0xc1, 0x4f, 0x15, 0x19, 0x8d, 0x97, 0x47, 0x8e, 0x20,
0x06, 0x3f, 0x53, 0x64, 0xd4, 0x5f, 0x1d, 0x3a, 0x82, 0x8c, 0x3d, 0xc8, 0x38, 0x93, 0x63, 0x57, 0x63, 0x1f, 0x32, 0xce, 0xf4, 0xc4, 0x95, 0xf9, 0xad, 0x1e, 0x2e, 0x13, 0x94, 0x11, 0x8e, 0x61,
0xe6, 0xb7, 0x7a, 0xec, 0x4c, 0x50, 0x46, 0x38, 0x86, 0x99, 0x1b, 0xce, 0xc4, 0x8d, 0x5f, 0x50, 0xe6, 0x86, 0x73, 0x71, 0xe3, 0x17, 0xd4, 0x28, 0x11, 0xff, 0xc3, 0x52, 0x17, 0x35, 0x3e, 0xee,
0xa3, 0x44, 0xfc, 0x2f, 0x4b, 0x5d, 0xd4, 0xf8, 0xbc, 0x03, 0x3a, 0xbb, 0xe8, 0x9c, 0xfa, 0x7a, 0x90, 0xce, 0x2f, 0x3a, 0xa7, 0xbe, 0x59, 0xa2, 0x57, 0x13, 0xb9, 0x6d, 0x10, 0x99, 0x8d, 0x58,
0x89, 0x5e, 0x4e, 0xe4, 0x96, 0x41, 0x64, 0x36, 0x62, 0xed, 0x3a, 0x64, 0x05, 0x3e, 0xcf, 0xd5, 0xbb, 0x0e, 0x59, 0x81, 0xcf, 0x73, 0xb5, 0x10, 0x98, 0x55, 0x43, 0xc7, 0xa7, 0xe2, 0x27, 0xcb,
0x42, 0x60, 0x56, 0x0d, 0x1c, 0x9f, 0x8a, 0x3f, 0x66, 0x56, 0xf9, 0x97, 0x58, 0x81, 0x3f, 0x37, 0x3a, 0x6f, 0x89, 0x15, 0xf8, 0x0b, 0x23, 0x97, 0xf8, 0x3e, 0xf1, 0x1d, 0xc8, 0x32, 0x97, 0xd4,
0x72, 0x89, 0xd7, 0x89, 0xef, 0x41, 0x96, 0xb9, 0xa4, 0xde, 0x9e, 0x97, 0xf1, 0x27, 0x40, 0xf8, 0x3b, 0xf2, 0x2a, 0xfe, 0x04, 0x08, 0xdf, 0x82, 0x4d, 0xd1, 0x42, 0xe8, 0x6b, 0x76, 0xaa, 0x72,
0x36, 0xac, 0x8b, 0x2f, 0x84, 0xbe, 0x61, 0xa7, 0x2a, 0x37, 0x83, 0xdd, 0x45, 0xa3, 0x87, 0x09, 0x33, 0xd8, 0x5d, 0x34, 0x7a, 0x98, 0xe0, 0x02, 0x26, 0xb0, 0x2d, 0x70, 0xcd, 0xa9, 0xfd, 0x72,
0x2e, 0x60, 0x02, 0x5b, 0x02, 0xd7, 0x98, 0xd8, 0xaf, 0x46, 0x54, 0x5e, 0x68, 0xd9, 0x16, 0x5e, 0x4c, 0xe5, 0x85, 0x96, 0x2d, 0xe1, 0x65, 0xff, 0xa7, 0x10, 0x64, 0x9c, 0xe0, 0xf8, 0x21, 0x67,
0xf4, 0x9f, 0x16, 0x82, 0x8c, 0x13, 0x1c, 0x3d, 0xe2, 0x2c, 0xae, 0x12, 0xfe, 0x1b, 0x95, 0x21, 0x71, 0x9d, 0xf0, 0x6f, 0x54, 0x86, 0xf4, 0x24, 0x38, 0x95, 0x8c, 0xb1, 0x4f, 0xdc, 0x81, 0xf7,
0x3d, 0x0e, 0x4e, 0x24, 0x63, 0xec, 0x27, 0x6e, 0xc3, 0xfb, 0x8b, 0xe6, 0x64, 0x4e, 0xdc, 0x85, 0x97, 0x8d, 0xc9, 0x9c, 0xb8, 0x03, 0x59, 0x9f, 0x06, 0x9e, 0x72, 0xe2, 0x43, 0xc3, 0x89, 0xa4,
0xac, 0x4f, 0x03, 0x4f, 0x39, 0xf1, 0x81, 0xe1, 0x44, 0xd2, 0x04, 0x22, 0xb0, 0xb8, 0x0d, 0xf0, 0x09, 0x44, 0x60, 0x71, 0x07, 0xe0, 0x91, 0x3b, 0xb0, 0xc7, 0x47, 0xce, 0xbc, 0x3f, 0x67, 0x36,
0xd8, 0xed, 0xdb, 0xa3, 0x43, 0x67, 0xd6, 0x9b, 0x31, 0x1b, 0x86, 0x71, 0x98, 0xf9, 0x6f, 0x46, 0x8c, 0xe2, 0x30, 0xf3, 0x6f, 0x46, 0xfd, 0x88, 0x3a, 0xa7, 0x23, 0xb1, 0xf9, 0xa5, 0x89, 0x94,
0xfd, 0x90, 0x3a, 0x27, 0x43, 0x51, 0xfc, 0xd2, 0x44, 0x4a, 0xcc, 0x67, 0x27, 0x7a, 0x36, 0x4a, 0x98, 0xcf, 0x4e, 0xf4, 0x6c, 0x94, 0x26, 0x42, 0x60, 0x95, 0x4e, 0x91, 0x8f, 0x25, 0x1e, 0x6d,
0x13, 0x21, 0xb0, 0x4e, 0xa7, 0xc8, 0xe7, 0x12, 0x8f, 0x36, 0x6f, 0xf4, 0x6c, 0xb3, 0x8c, 0x6c, 0x5e, 0xeb, 0xd9, 0x66, 0x19, 0xd9, 0x16, 0x4d, 0x96, 0x5a, 0x3a, 0x59, 0x7a, 0xf9, 0x64, 0x19,
0x8b, 0x16, 0x4b, 0x2d, 0x5c, 0x2c, 0xbd, 0x78, 0xb1, 0x8c, 0xb6, 0x58, 0x1c, 0xfd, 0xec, 0xd2, 0x6d, 0xb2, 0x38, 0xfa, 0xd9, 0x95, 0xd1, 0xcf, 0x25, 0xa3, 0x7f, 0x17, 0x4a, 0x9a, 0x7d, 0x81,
0xe8, 0xe7, 0x92, 0xd1, 0xbf, 0x07, 0x25, 0xcd, 0xbe, 0xc0, 0x43, 0x1f, 0x42, 0x3a, 0x9c, 0x29, 0x87, 0x3e, 0x82, 0x74, 0x38, 0x57, 0xa4, 0xa9, 0x55, 0x17, 0x73, 0x42, 0x58, 0x2b, 0x3e, 0x82,
0xd2, 0xd4, 0xae, 0x8b, 0x39, 0x21, 0xec, 0x2b, 0x3e, 0x84, 0x4d, 0xc9, 0x1d, 0x0b, 0x38, 0xa1, 0x8a, 0xe4, 0x8e, 0x05, 0x9c, 0xd0, 0x60, 0x36, 0xfe, 0x4f, 0xa2, 0xd8, 0x86, 0x6b, 0x84, 0xbe,
0xc1, 0x74, 0xf4, 0xbf, 0x44, 0xb1, 0x05, 0xd7, 0x08, 0x7d, 0x33, 0x97, 0x16, 0x55, 0xc8, 0xfb, 0x5e, 0x48, 0x8b, 0x1a, 0xe4, 0x7d, 0x3e, 0xb4, 0x32, 0xa7, 0xaa, 0x5d, 0x8f, 0x8d, 0xb9, 0x89,
0x7c, 0x6a, 0x65, 0x4e, 0x45, 0xbb, 0x1e, 0x1b, 0x6b, 0x13, 0x05, 0xdc, 0xfb, 0x39, 0x40, 0xfc, 0x02, 0xee, 0xff, 0x14, 0x20, 0xfe, 0xfb, 0x8a, 0x36, 0x20, 0xdf, 0x68, 0x76, 0x8f, 0x7b, 0xed,
0x8f, 0x2d, 0x5a, 0x83, 0x7c, 0xbd, 0xd1, 0x39, 0xea, 0xb6, 0x7a, 0xe5, 0x15, 0x54, 0x84, 0xd5, 0x7e, 0x79, 0x0d, 0x15, 0x61, 0xfd, 0x69, 0xbb, 0xdf, 0x6a, 0x90, 0xfa, 0xd3, 0xb2, 0x85, 0x2a,
0x67, 0xad, 0x5e, 0xb3, 0x4e, 0x6a, 0xcf, 0xca, 0x16, 0xda, 0x84, 0x52, 0x8f, 0xd4, 0xda, 0xdd, 0x50, 0xea, 0x93, 0x7a, 0xa7, 0x77, 0xd8, 0x24, 0xed, 0x4e, 0xf7, 0x71, 0xbf, 0x9c, 0x42, 0x08,
0x83, 0x06, 0x69, 0xb5, 0x3b, 0x4f, 0x7a, 0xe5, 0x14, 0x42, 0xb0, 0xae, 0x54, 0x47, 0x4f, 0x7a, 0x36, 0x95, 0xea, 0xf8, 0x71, 0x9f, 0xe9, 0xd2, 0xa8, 0x04, 0x85, 0xfa, 0xe3, 0x7e, 0xeb, 0x98,
0x4c, 0x97, 0x46, 0x25, 0x28, 0xd4, 0x9e, 0xf4, 0x9a, 0x47, 0xa4, 0xf5, 0xb2, 0x51, 0xce, 0xec, 0xb4, 0x5f, 0x34, 0xcb, 0x99, 0xfd, 0x3a, 0xa7, 0x2b, 0xfe, 0x83, 0xc9, 0xda, 0xa3, 0xdf, 0x8e,
0xd5, 0x38, 0x5d, 0xf1, 0xbf, 0x9e, 0xec, 0x7b, 0xf4, 0x57, 0x65, 0x79, 0x05, 0xad, 0x03, 0xc4, 0xe5, 0x35, 0xb4, 0x09, 0x10, 0xff, 0x9a, 0x15, 0xb3, 0xc8, 0xb7, 0x24, 0xa9, 0x4a, 0xed, 0x7f,
0x7f, 0xe7, 0x8a, 0x55, 0xe4, 0x5b, 0x92, 0x54, 0xa5, 0xf6, 0x3e, 0xe4, 0x19, 0x11, 0xfd, 0xeb, 0xc4, 0x33, 0x22, 0xfa, 0x83, 0x82, 0xf2, 0x90, 0xae, 0x0f, 0x87, 0xe5, 0x35, 0x04, 0x90, 0x6b,
0x82, 0xf2, 0x90, 0xae, 0x0d, 0x06, 0xe5, 0x15, 0x04, 0x90, 0xab, 0xd3, 0x11, 0x0d, 0x69, 0xd9, 0xd0, 0x31, 0x0d, 0x69, 0xd9, 0xda, 0xff, 0x01, 0x40, 0xbc, 0x29, 0xa2, 0x02, 0x64, 0x1f, 0x77,
0xda, 0xfb, 0x11, 0x40, 0x5c, 0x14, 0x51, 0x01, 0xb2, 0x4f, 0xda, 0xf5, 0xc6, 0x41, 0x79, 0x85, 0x1a, 0xcd, 0xc3, 0xf2, 0x1a, 0xfb, 0x7c, 0x52, 0x7f, 0xd4, 0x6e, 0x94, 0x2d, 0x86, 0x3f, 0x24,
0xfd, 0x7c, 0x5a, 0x7b, 0xdc, 0xaa, 0x97, 0x2d, 0x86, 0x3f, 0x20, 0x47, 0x2f, 0x1b, 0xed, 0x72, 0xc7, 0x2f, 0x9a, 0x9d, 0x72, 0x0a, 0xad, 0x43, 0xe6, 0x71, 0xaf, 0xd9, 0x28, 0xa7, 0xf7, 0x7f,
0x0a, 0xad, 0x42, 0xe6, 0x49, 0xb7, 0x51, 0x2f, 0xa7, 0xf7, 0x7e, 0x02, 0xef, 0x1d, 0x3a, 0x33, 0x04, 0xef, 0x1d, 0x39, 0x73, 0xb5, 0x20, 0x83, 0x81, 0x3d, 0x95, 0x83, 0xac, 0x43, 0xa6, 0xdd,
0xb5, 0x21, 0x83, 0xbe, 0x3d, 0x91, 0x93, 0xac, 0x42, 0xa6, 0x55, 0x7f, 0xdc, 0x10, 0x44, 0x74, 0x78, 0xd4, 0x14, 0x44, 0xf4, 0xee, 0xd7, 0x3b, 0x9d, 0x76, 0xe7, 0x41, 0xd9, 0x62, 0xd2, 0x61,
0x1f, 0xd4, 0xda, 0xed, 0x56, 0xfb, 0x61, 0xd9, 0x62, 0xd2, 0x41, 0xab, 0xdd, 0xea, 0x36, 0x1b, 0xbb, 0xd3, 0xee, 0xb5, 0x9a, 0x8d, 0x72, 0xaa, 0xf6, 0xb5, 0x05, 0x30, 0x71, 0xe6, 0xea, 0x55,
0xf5, 0x72, 0xaa, 0xfa, 0x95, 0x05, 0x30, 0x76, 0x66, 0xea, 0x55, 0xea, 0x1e, 0x6c, 0x3c, 0x4c, 0xea, 0x2e, 0x6c, 0x3d, 0x48, 0x8c, 0xa3, 0x1e, 0x1e, 0x08, 0x7d, 0xdd, 0x71, 0xc6, 0x3b, 0xe5,
0xcc, 0xa3, 0x1e, 0x1e, 0x08, 0x7d, 0xd3, 0x76, 0x46, 0xdb, 0xe5, 0x58, 0xec, 0x86, 0xbe, 0x33, 0x58, 0xec, 0x85, 0xbe, 0x33, 0x3d, 0xc5, 0x6b, 0xe8, 0x33, 0xd8, 0x10, 0x5d, 0x98, 0x0f, 0x97,
0x39, 0xc1, 0x2b, 0xe8, 0x53, 0x58, 0x13, 0x43, 0x98, 0x0f, 0x97, 0x1a, 0xf1, 0x19, 0x94, 0x8c, 0xea, 0xf1, 0x39, 0x94, 0x8c, 0xf0, 0xa3, 0xad, 0x18, 0xc4, 0xf7, 0x94, 0x9d, 0x9d, 0x58, 0x91,
0xf0, 0xa3, 0x8d, 0x18, 0xc4, 0x6b, 0xca, 0xf6, 0x76, 0xac, 0x48, 0x26, 0x0a, 0x5e, 0x79, 0x95, 0x4c, 0x14, 0xbc, 0xf6, 0x32, 0xc7, 0xff, 0xce, 0xdf, 0xf9, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff,
0xe3, 0xff, 0xe8, 0xdf, 0xfd, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x55, 0xb5, 0x08, 0xed, 0x06, 0x53, 0x45, 0xb1, 0xbd, 0xd2, 0x1f, 0x00, 0x00,
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.
......
...@@ -118,7 +118,7 @@ func (p *mixPolicy) processTransfer(transfer *mixTy.MixTransferAction, heightInd ...@@ -118,7 +118,7 @@ func (p *mixPolicy) processTransfer(transfer *mixTy.MixTransferAction, heightInd
return return
} }
outInput := data.(*mixTy.TransferOutputPublicInput) outInput := data.(*mixTy.TransferOutputPublicInput)
p.processSecretGroup(outInput.NoteHash, outInput.DhSecrets, heightIndex, table) p.processSecretGroup(outInput.NoteHash, transfer.Output.Secrets, heightIndex, table)
//change //change
data, err = mixTy.DecodePubInput(mixTy.VerifyType_TRANSFEROUTPUT, transfer.Change.PublicInput) data, err = mixTy.DecodePubInput(mixTy.VerifyType_TRANSFEROUTPUT, transfer.Change.PublicInput)
...@@ -127,7 +127,7 @@ func (p *mixPolicy) processTransfer(transfer *mixTy.MixTransferAction, heightInd ...@@ -127,7 +127,7 @@ func (p *mixPolicy) processTransfer(transfer *mixTy.MixTransferAction, heightInd
return return
} }
changeInput := data.(*mixTy.TransferOutputPublicInput) changeInput := data.(*mixTy.TransferOutputPublicInput)
p.processSecretGroup(changeInput.NoteHash, changeInput.DhSecrets, heightIndex, table) p.processSecretGroup(changeInput.NoteHash, transfer.Change.Secrets, heightIndex, table)
} }
...@@ -327,18 +327,17 @@ func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys ...@@ -327,18 +327,17 @@ func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys
} }
decryptData, err := decryptData(key.Privacy.ShareSecretKey.PrivKey, tempPubKey, cryptData) decryptData, err := decryptData(key.Privacy.ShareSecretKey.PrivKey, tempPubKey, cryptData)
if err != nil { if err != nil {
bizlog.Info("processSecret.decryptData", "decrypt for notehash", noteHash, "secret", secretData, "addr", key.Addr, "err", err) bizlog.Debug("processSecret.decryptData fail", "decrypt for notehash", noteHash, "secret", secretData, "addr", key.Addr, "err", err)
continue continue
} }
var rawData mixTy.SecretData var rawData mixTy.SecretData
err = types.Decode(decryptData, &rawData) err = types.Decode(decryptData, &rawData)
if err != nil { if err != nil {
bizlog.Info("processSecret.decode rawData", "addr", key.Addr, "err", err) bizlog.Debug("processSecret.decode rawData fail", "addr", key.Addr, "err", err)
continue continue
} }
bizlog.Info("processSecret.decode rawData OK", "notehash", noteHash, "addr", key.Addr) bizlog.Info("processSecret.decode rawData OK", "notehash", noteHash, "addr", key.Addr)
if rawData.ReceiverPubKey == key.Privacy.PaymentKey.ReceiverPubKey || if rawData.ReceiverPubKey == key.Privacy.PaymentKey.ReceiverPubKey ||
rawData.ReturnPubKey == key.Privacy.PaymentKey.ReceiverPubKey || rawData.ReturnPubKey == key.Privacy.PaymentKey.ReceiverPubKey ||
rawData.AuthorizePubKey == key.Privacy.PaymentKey.ReceiverPubKey { rawData.AuthorizePubKey == key.Privacy.PaymentKey.ReceiverPubKey {
......
...@@ -176,6 +176,7 @@ func (policy *mixPolicy) SignTransaction(key crypto.PrivKey, req *types.ReqSignR ...@@ -176,6 +176,7 @@ func (policy *mixPolicy) SignTransaction(key crypto.PrivKey, req *types.ReqSignR
func (policy *mixPolicy) signatureTx(tx *types.Transaction, transfer *mixTy.MixTransferAction) error { func (policy *mixPolicy) signatureTx(tx *types.Transaction, transfer *mixTy.MixTransferAction) error {
cfg := policy.getWalletOperate().GetAPI().GetConfig() cfg := policy.getWalletOperate().GetAPI().GetConfig()
mixSignData := types.Encode(transfer) mixSignData := types.Encode(transfer)
tx.Fee = mixTy.Privacy2PrivacyTxFee
tx.Signature = &types.Signature{ tx.Signature = &types.Signature{
Ty: MixSignID, Ty: MixSignID,
Signature: common.BytesToHash(mixSignData).Bytes(), Signature: common.BytesToHash(mixSignData).Bytes(),
......
...@@ -214,7 +214,7 @@ func (policy *mixPolicy) withdrawProof(req *mixTy.WithdrawProofReq) (*mixTy.With ...@@ -214,7 +214,7 @@ func (policy *mixPolicy) withdrawProof(req *mixTy.WithdrawProofReq) (*mixTy.With
if note.IsReturner { if note.IsReturner {
resp.SpendFlag = 0 resp.SpendFlag = 0
} }
if len(resp.AuthorizeSpendHash) > 0 { if len(resp.AuthorizeSpendHash) > LENNULLKEY {
resp.AuthorizeFlag = 1 resp.AuthorizeFlag = 1
} }
...@@ -225,16 +225,11 @@ func (policy *mixPolicy) withdrawProof(req *mixTy.WithdrawProofReq) (*mixTy.With ...@@ -225,16 +225,11 @@ func (policy *mixPolicy) withdrawProof(req *mixTy.WithdrawProofReq) (*mixTy.With
} }
resp.SpendPrivKey = privacyKey.Privacy.PaymentKey.SpendPriKey resp.SpendPrivKey = privacyKey.Privacy.PaymentKey.SpendPriKey
//get tree path //get tree path
path, err := policy.getPathProof(note.NoteHash) treeProof, err := policy.getTreeProof(note.NoteHash)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "get tree proof for noteHash=%s", note.NoteHash) return nil, errors.Wrapf(err, "getTreeProof for hash=%s", note.NoteHash)
}
resp.TreeProof.TreePath = path.ProofSet[1:]
resp.TreeProof.Helpers = path.Helpers
for i := 0; i < len(resp.TreeProof.TreePath); i++ {
resp.TreeProof.ValidPath = append(resp.TreeProof.ValidPath, 1)
} }
resp.TreeProof.TreeRootHash = path.RootHash resp.TreeProof = treeProof
return &resp, nil return &resp, nil
...@@ -274,16 +269,11 @@ func (policy *mixPolicy) authProof(req *mixTy.AuthProofReq) (*mixTy.AuthProofRes ...@@ -274,16 +269,11 @@ func (policy *mixPolicy) authProof(req *mixTy.AuthProofReq) (*mixTy.AuthProofRes
} }
//get tree path //get tree path
path, err := policy.getPathProof(note.NoteHash) treeProof, err := policy.getTreeProof(note.NoteHash)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "get tree proof for noteHash=%s", note.NoteHash) return nil, errors.Wrapf(err, "getTreeProof for hash=%s", note.NoteHash)
}
resp.TreeProof.TreePath = path.ProofSet[1:]
resp.TreeProof.Helpers = path.Helpers
for i := 0; i < len(resp.TreeProof.TreePath); i++ {
resp.TreeProof.ValidPath = append(resp.TreeProof.ValidPath, 1)
} }
resp.TreeProof.TreeRootHash = path.RootHash resp.TreeProof = treeProof
return &resp, nil return &resp, nil
...@@ -412,8 +402,6 @@ func (policy *mixPolicy) transferProof(req *mixTy.TransferProofReq) (*mixTy.Tran ...@@ -412,8 +402,6 @@ func (policy *mixPolicy) transferProof(req *mixTy.TransferProofReq) (*mixTy.Tran
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "input part parseUint=%s", inputPart.Proof.Amount) return nil, errors.Wrapf(err, "input part parseUint=%s", inputPart.Proof.Amount)
} }
//还要扣除手续费
minTxFee := uint64(policy.walletOperate.GetConfig().MinFee)
//output toAddr part //output toAddr part
reqTransfer := &mixTy.DepositProofReq{ reqTransfer := &mixTy.DepositProofReq{
...@@ -428,11 +416,12 @@ func (policy *mixPolicy) transferProof(req *mixTy.TransferProofReq) (*mixTy.Tran ...@@ -428,11 +416,12 @@ func (policy *mixPolicy) transferProof(req *mixTy.TransferProofReq) (*mixTy.Tran
} }
bizlog.Info("transferProof deposit to receiver succ", "notehash", req.NoteHash) bizlog.Info("transferProof deposit to receiver succ", "notehash", req.NoteHash)
//还要扣除手续费
//output 找零 part,如果找零为0也需要设置,否则只有一个输入一个输出,H部分的随机数要相等,就能推测出转账值来 //output 找零 part,如果找零为0也需要设置,否则只有一个输入一个输出,H部分的随机数要相等,就能推测出转账值来
//在transfer output 部分特殊处理,如果amount是0的值则不加进tree //在transfer output 部分特殊处理,如果amount是0的值则不加进tree
reqChange := &mixTy.DepositProofReq{ reqChange := &mixTy.DepositProofReq{
ReceiverAddr: note.Account, ReceiverAddr: note.Account,
Amount: noteAmount - req.Amount - minTxFee, Amount: noteAmount - req.Amount - uint64(mixTy.Privacy2PrivacyTxFee),
} }
depositChange, err := policy.depositProof(reqChange) depositChange, err := policy.depositProof(reqChange)
if err != nil { if err != nil {
...@@ -440,7 +429,7 @@ func (policy *mixPolicy) transferProof(req *mixTy.TransferProofReq) (*mixTy.Tran ...@@ -440,7 +429,7 @@ func (policy *mixPolicy) transferProof(req *mixTy.TransferProofReq) (*mixTy.Tran
} }
bizlog.Info("transferProof deposit to change succ", "notehash", req.NoteHash) bizlog.Info("transferProof deposit to change succ", "notehash", req.NoteHash)
commitValue, err := getCommitValue(noteAmount, req.Amount, minTxFee) commitValue, err := getCommitValue(noteAmount, req.Amount, uint64(mixTy.Privacy2PrivacyTxFee))
if err != nil { if err != nil {
return nil, err return nil, err
......
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