diff --git a/.github/workflows/build-test-macos-arm64.yml b/.github/workflows/build-test-macos-arm64.yml deleted file mode 100644 index d79262da7..000000000 --- a/.github/workflows/build-test-macos-arm64.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Build and run tests (MacOS ARM64) - -on: - push: - branches: [master, rc/*, feat/*] - pull_request: - branches: [master, feat/*, rc/*] - workflow_dispatch: - -jobs: - test: - strategy: - matrix: - go-version: [1.20.7] - runs-on: macos-13-xlarge - steps: - - name: Install Go - uses: actions/setup-go@v5 - with: - go-version: ${{ matrix.go-version }} - - name: Checkout code - uses: actions/checkout@v4 - - name: Test - run: | - make test-w2 diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 702511132..61c827a6e 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -21,6 +21,14 @@ jobs: go-version: ${{ matrix.go-version }} - name: Checkout code uses: actions/checkout@v2 - - name: Test - run: | - make test + + - name: Test (Linux) + if: runner.os == 'Linux' + run: | + make test + + - name: Test (MacOS ARM64) + if: runner.os == 'macOS' + run: | + make test-w2 + diff --git a/config/config.toml b/config/config.toml index 6f082932f..ea07b524c 100644 --- a/config/config.toml +++ b/config/config.toml @@ -57,6 +57,7 @@ DeleteFromReturnData = 10 GetCodeMetadata = 10 IsBuiltinFunction = 10 + IsReservedFunctionName = 10 [EthAPICost] UseGas = 10 diff --git a/config/gasCost.go b/config/gasCost.go index aed3f7f8e..2682e4af0 100644 --- a/config/gasCost.go +++ b/config/gasCost.go @@ -82,6 +82,7 @@ type BaseOpsAPICost struct { DeleteFromReturnData uint64 GetCodeMetadata uint64 IsBuiltinFunction uint64 + IsReservedFunctionName uint64 } // DynamicStorageLoadCostCoefficients holds the signed coefficients of the func that will compute the gas cost @@ -173,23 +174,26 @@ type BigFloatAPICost struct { // CryptoAPICost defines the crypto operations gas cost config structure type CryptoAPICost struct { - SHA256 uint64 - Keccak256 uint64 - Ripemd160 uint64 - VerifyBLS uint64 - VerifyEd25519 uint64 - VerifySecp256k1 uint64 - EllipticCurveNew uint64 - AddECC uint64 - DoubleECC uint64 - IsOnCurveECC uint64 - ScalarMultECC uint64 - MarshalECC uint64 - MarshalCompressedECC uint64 - UnmarshalECC uint64 - UnmarshalCompressedECC uint64 - GenerateKeyECC uint64 - EncodeDERSig uint64 + SHA256 uint64 + Keccak256 uint64 + Ripemd160 uint64 + VerifyBLS uint64 + VerifyEd25519 uint64 + VerifySecp256k1 uint64 + EllipticCurveNew uint64 + AddECC uint64 + DoubleECC uint64 + IsOnCurveECC uint64 + ScalarMultECC uint64 + MarshalECC uint64 + MarshalCompressedECC uint64 + UnmarshalECC uint64 + UnmarshalCompressedECC uint64 + GenerateKeyECC uint64 + EncodeDERSig uint64 + VerifySecp256r1 uint64 + VerifyBLSSignatureShare uint64 + VerifyBLSMultiSig uint64 } // ManagedBufferAPICost defines the managed buffer operations gas cost config structure diff --git a/config/gasSchedule.go b/config/gasSchedule.go index 8c660a928..30dc4c3a8 100644 --- a/config/gasSchedule.go +++ b/config/gasSchedule.go @@ -231,6 +231,11 @@ func FillGasMapBuiltInCosts(value uint64) map[string]uint64 { gasMap["ESDTNFTAddUri"] = value gasMap["ESDTNFTUpdateAttributes"] = value gasMap["ESDTNFTMultiTransfer"] = value + gasMap["ESDTModifyRoyalties"] = value + gasMap["ESDTModifyCreator"] = value + gasMap["ESDTNFTRecreate"] = value + gasMap["ESDTNFTUpdate"] = value + gasMap["ESDTNFTSetNewURIs"] = value gasMap["SetGuardian"] = value gasMap["GuardAccount"] = value gasMap["UnGuardAccount"] = value @@ -308,6 +313,7 @@ func FillGasMapBaseOpsAPICosts(value, asyncCallbackGasLock uint64) map[string]ui gasMap["DeleteFromReturnData"] = value gasMap["GetCodeMetadata"] = value gasMap["IsBuiltinFunction"] = value + gasMap["IsReservedFunctionName"] = value return gasMap } @@ -443,6 +449,9 @@ func FillGasMapCryptoAPICosts(value uint64) map[string]uint64 { gasMap["UnmarshalCompressedECC"] = value gasMap["GenerateKeyECC"] = value gasMap["EncodeDERSig"] = value + gasMap["VerifySecp256r1"] = value + gasMap["VerifyBLSSignatureShare"] = value + gasMap["VerifyBLSMultiSig"] = value return gasMap } diff --git a/crypto/factory/cryptovm.go b/crypto/factory/cryptovm.go index 0c8e563e9..91cd7c174 100644 --- a/crypto/factory/cryptovm.go +++ b/crypto/factory/cryptovm.go @@ -5,20 +5,30 @@ import ( "github.com/multiversx/mx-chain-vm-go/crypto/hashing" "github.com/multiversx/mx-chain-vm-go/crypto/signing/bls" "github.com/multiversx/mx-chain-vm-go/crypto/signing/ed25519" - "github.com/multiversx/mx-chain-vm-go/crypto/signing/secp256k1" + "github.com/multiversx/mx-chain-vm-go/crypto/signing/secp256" ) // NewVMCrypto returns a composite struct containing VMCrypto functionality implementations -func NewVMCrypto() crypto.VMCrypto { +func NewVMCrypto() (crypto.VMCrypto, error) { + blsVerifier, err := bls.NewBLS() + if err != nil { + return nil, err + } + + secp, err := secp256.NewSecp256() + if err != nil { + return nil, err + } + return struct { crypto.Hasher crypto.Ed25519 crypto.BLS - crypto.Secp256k1 + crypto.Secp256 }{ - Hasher: hashing.NewHasher(), - Ed25519: ed25519.NewEd25519Signer(), - BLS: bls.NewBLS(), - Secp256k1: secp256k1.NewSecp256k1(), - } + Hasher: hashing.NewHasher(), + Ed25519: ed25519.NewEd25519Signer(), + BLS: blsVerifier, + Secp256: secp, + }, nil } diff --git a/crypto/interface.go b/crypto/interface.go index 504ace4c4..dd83d0c7d 100644 --- a/crypto/interface.go +++ b/crypto/interface.go @@ -10,6 +10,8 @@ type Hasher interface { // BLS defines the functionality of a component able to verify BLS signatures type BLS interface { VerifyBLS(key []byte, msg []byte, sig []byte) error + VerifySignatureShare(publicKey []byte, message []byte, sig []byte) error + VerifyAggregatedSig(pubKeysSigners [][]byte, message []byte, aggSig []byte) error } // Ed25519 defines the functionality of a component able to verify Ed25519 signatures @@ -17,10 +19,11 @@ type Ed25519 interface { VerifyEd25519(key []byte, msg []byte, sig []byte) error } -// Secp256k1 defines the functionality of a component able to verify and encode Secp256k1 signatures -type Secp256k1 interface { +// Secp256 defines the functionality of a component able to verify and encode Secp256 signatures +type Secp256 interface { VerifySecp256k1(key []byte, msg []byte, sig []byte, hashType uint8) error EncodeSecp256k1DERSignature(r, s []byte) []byte + VerifySecp256r1(key []byte, msg []byte, sig []byte) error } // VMCrypto will provide the interface to the main crypto functionalities of the vm @@ -28,5 +31,5 @@ type VMCrypto interface { Hasher Ed25519 BLS - Secp256k1 + Secp256 } diff --git a/crypto/signing/bls/bls.go b/crypto/signing/bls/bls.go index d82579416..96937c5ec 100644 --- a/crypto/signing/bls/bls.go +++ b/crypto/signing/bls/bls.go @@ -4,22 +4,29 @@ import ( "github.com/multiversx/mx-chain-crypto-go" "github.com/multiversx/mx-chain-crypto-go/signing" "github.com/multiversx/mx-chain-crypto-go/signing/mcl" + mclMultiSig "github.com/multiversx/mx-chain-crypto-go/signing/mcl/multisig" "github.com/multiversx/mx-chain-crypto-go/signing/mcl/singlesig" + "github.com/multiversx/mx-chain-crypto-go/signing/multisig" ) type bls struct { keyGenerator crypto.KeyGenerator signer crypto.SingleSigner + + multiSigner crypto.MultiSigner } // NewBLS returns the component able to verify BLS signatures -func NewBLS() *bls { +func NewBLS() (*bls, error) { b := &bls{} suite := mcl.NewSuiteBLS12() b.keyGenerator = signing.NewKeyGenerator(suite) b.signer = singlesig.NewBlsSigner() - return b + var err error + b.multiSigner, err = multisig.NewBLSMultisig(&mclMultiSig.BlsMultiSignerKOSK{}, b.keyGenerator) + + return b, err } // VerifyBLS verifies a BLS signatures @@ -31,3 +38,13 @@ func (b *bls) VerifyBLS(key []byte, msg []byte, sig []byte) error { return b.signer.Verify(publicKey, msg, sig) } + +// VerifySignatureShare verifies signature share of BLS MultiSig +func (b *bls) VerifySignatureShare(publicKey []byte, message []byte, sig []byte) error { + return b.multiSigner.VerifySignatureShare(publicKey, message, sig) +} + +// VerifyAggregatedSig verifies aggregated signature of BLS MultiSig +func (b *bls) VerifyAggregatedSig(pubKeysSigners [][]byte, message []byte, aggSig []byte) error { + return b.multiSigner.VerifyAggregatedSig(pubKeysSigners, message, aggSig) +} diff --git a/crypto/signing/bls/bls_test.go b/crypto/signing/bls/bls_test.go index 387e68e8b..527468df8 100644 --- a/crypto/signing/bls/bls_test.go +++ b/crypto/signing/bls/bls_test.go @@ -2,24 +2,71 @@ package bls import ( "encoding/hex" + "fmt" "strings" "testing" + crypto "github.com/multiversx/mx-chain-crypto-go" + "github.com/multiversx/mx-chain-crypto-go/signing" + "github.com/multiversx/mx-chain-crypto-go/signing/mcl" + llsig "github.com/multiversx/mx-chain-crypto-go/signing/mcl/multisig" + "github.com/multiversx/mx-chain-crypto-go/signing/multisig" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +type multiSignerSetup struct { + privKeys [][]byte + pubKeys [][]byte + partialSignatures [][][]byte + messages []string + aggSignatures [][]byte +} + const checkOK = "3e886a4c6e109a151f4105aee65a5192d150ef1fa68d3cd76964a0b086006dbe4324c989deb0e4416c6d6706db1b1910eb2732f08842fb4886067b9ed191109ac2188d76002d2e11da80a3f0ea89fee6b59c834cc478a6bd49cb8a193b1abb16@e96bd0f36b70c5ccc0c4396343bd7d8255b8a526c55fa1e218511fafe6539b8e@04725db195e37aa237cdbbda76270d4a229b6e7a3651104dc58c4349c0388e8546976fe54a04240530b99064e434c90f" const checkNOK = "2c9a358953f61d34401d7ee4175eec105c476b18baacab371e2f47270035b539d84ad79ba587552b7e38802be00ff7148fc2a9c7a7034ff1e63ee24602ee952235ad14ca7d36e2be617fb2c99ed22a7a2729d86ae9fbb4df06f957ba07fec50e@1e46d9cbb995e30b82485525c29f80ac78aca295a6e88a11c3df8f9a445494bb@be8c460db180d6254c712ead3aa81935bc9be15b919dd45cb152b3dece04762569778c5e70e7af03fa1c66409d4f4711" func TestBls_VerifyBLS(t *testing.T) { t.Parallel() - b := NewBLS() + b, _ := NewBLS() assert.Nil(t, b.VerifyBLS(splitString(t, checkOK))) assert.NotNil(t, b.VerifyBLS(splitString(t, checkNOK))) } +func TestBls_VerifyBLSSigShare(t *testing.T) { + t.Parallel() + + b, _ := NewBLS() + assert.Nil(t, b.VerifySignatureShare(splitString(t, checkOK))) + assert.NotNil(t, b.VerifySignatureShare(splitString(t, checkNOK))) +} + +func TestBls_VerifyBLSMultiSig(t *testing.T) { + t.Parallel() + + b, _ := NewBLS() + + numMessages := 5 + setupKOSK, multiSignerKOSK := createMultiSigSetupKOSK(uint16(numMessages), numMessages) + setupKOSK.aggSignatures = aggregateSignatures(setupKOSK, multiSignerKOSK) + + for i := 0; i < len(setupKOSK.pubKeys); i++ { + fmt.Println(hex.EncodeToString(setupKOSK.pubKeys[i])) + } + + for i := 0; i < numMessages; i++ { + fmt.Println(setupKOSK.messages[i]) + fmt.Println(hex.EncodeToString(setupKOSK.aggSignatures[i])) + + assert.Nil(t, b.VerifyAggregatedSig(setupKOSK.pubKeys, []byte(setupKOSK.messages[i]), setupKOSK.aggSignatures[i])) + changedSig := make([]byte, len(setupKOSK.aggSignatures[i])) + copy(changedSig, setupKOSK.aggSignatures[i]) + changedSig[0] += 1 + assert.NotNil(t, b.VerifyAggregatedSig(setupKOSK.pubKeys, []byte(setupKOSK.messages[i]), changedSig)) + } +} + func splitString(t testing.TB, str string) ([]byte, []byte, []byte) { split := strings.Split(str, "@") pkBuff, err := hex.DecodeString(split[0]) @@ -33,3 +80,72 @@ func splitString(t testing.TB, str string) ([]byte, []byte, []byte) { return pkBuff, msgBuff, sigBuff } + +func createKeysAndMultiSignerBlsKOSK( + grSize uint16, + suite crypto.Suite, +) ([][]byte, [][]byte, crypto.MultiSigner) { + + kg, privKeys, pubKeys := createMultiSignerSetup(grSize, suite) + llSigner := &llsig.BlsMultiSignerKOSK{} + multiSigner, _ := multisig.NewBLSMultisig(llSigner, kg) + + return privKeys, pubKeys, multiSigner +} + +func createMultiSignerSetup(grSize uint16, suite crypto.Suite) (crypto.KeyGenerator, [][]byte, [][]byte) { + kg := signing.NewKeyGenerator(suite) + privKeys := make([][]byte, grSize) + pubKeys := make([][]byte, grSize) + + for i := uint16(0); i < grSize; i++ { + sk, pk := kg.GeneratePair() + privKeys[i], _ = sk.ToByteArray() + pubKeys[i], _ = pk.ToByteArray() + } + return kg, privKeys, pubKeys +} + +func createSignaturesShares(privKeys [][]byte, multiSigner crypto.MultiSigner, message []byte) [][]byte { + sigShares := make([][]byte, len(privKeys)) + for i := uint16(0); i < uint16(len(privKeys)); i++ { + sigShares[i], _ = multiSigner.CreateSignatureShare(privKeys[i], message) + } + + return sigShares +} + +func createMultiSigSetupKOSK(numSigners uint16, numMessages int) (*multiSignerSetup, crypto.MultiSigner) { + var multiSigner crypto.MultiSigner + setup := &multiSignerSetup{} + suite := mcl.NewSuiteBLS12() + setup.privKeys, setup.pubKeys, multiSigner = createKeysAndMultiSignerBlsKOSK(numSigners, suite) + setup.messages, setup.partialSignatures = createMessagesAndPartialSignatures(numMessages, setup.privKeys, multiSigner) + + return setup, multiSigner +} + +func createMessagesAndPartialSignatures(numMessages int, privKeys [][]byte, multiSigner crypto.MultiSigner) ([]string, [][][]byte) { + partialSignatures := make([][][]byte, numMessages) + messages := make([]string, numMessages) + + for i := 0; i < numMessages; i++ { + messages[i] = fmt.Sprintf("message%d", i) + signatures := createSignaturesShares(privKeys, multiSigner, []byte(messages[i])) + partialSignatures[i] = signatures + } + + return messages, partialSignatures +} + +func aggregateSignatures( + setup *multiSignerSetup, + multiSigner crypto.MultiSigner, +) [][]byte { + aggSignatures := make([][]byte, len(setup.messages)) + for i := 0; i < len(setup.messages); i++ { + aggSignatures[i], _ = multiSigner.AggregateSigs(setup.pubKeys, setup.partialSignatures[i]) + } + + return aggSignatures +} diff --git a/crypto/signing/secp256/secp256.go b/crypto/signing/secp256/secp256.go new file mode 100644 index 000000000..16d8fde05 --- /dev/null +++ b/crypto/signing/secp256/secp256.go @@ -0,0 +1,199 @@ +package secp256 + +import ( + cryptoEcsda "crypto/ecdsa" + "crypto/elliptic" + "crypto/sha256" + "errors" + "github.com/multiversx/mx-chain-vm-go/crypto/hashing" + "github.com/multiversx/mx-chain-vm-go/crypto/signing" + "math/big" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/ecdsa" + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +// MessageHashType defines the type of hash algorithm +type MessageHashType uint8 + +// constants that define the available hash algorithms +const ( + ECDSAPlainMsg MessageHashType = iota + ECDSASha256 + ECDSADoubleSha256 + ECDSAKeccak256 + ECDSARipemd160 +) + +const ( + // fieldSize is the curve domain size. + fieldSize = 32 + pubKeySize = fieldSize + 1 +) + +// p256Order returns the curve order for the secp256r1 curve +// NOTE: this is specific to the secp256r1/P256 curve, +// and not taken from the domain params for the key itself +// (which would be a more generic approach for all EC). +var p256Order = elliptic.P256().Params().N + +// p256HalfOrder returns half the curve order +// a bit shift of 1 to the right (Rsh) is equivalent +// to division by 2, only faster. +var p256HalfOrder = new(big.Int).Rsh(p256Order, 1) + +var errInvalidSigLength = errors.New("invalid signature length") +var errSignatureNotNormalized = errors.New("signature not normalized") +var errSignatureVerificationFailed = errors.New("signature verification failed") +var errPublicKeyLengthMissmatch = errors.New("invalid public key length") + +// signatureR1 holds the r and s values of an ECDSA signature. +type signatureR1 struct { + R, S *big.Int +} + +type secp256 struct { + secp256r1 elliptic.Curve +} + +// NewSecp256 returns the component able to verify Secp256 signatures +func NewSecp256() (*secp256, error) { + secp256r1 := elliptic.P256() + + expected := (secp256r1.Params().BitSize + 7) / 8 + if expected != fieldSize { + return nil, errors.New("wrong secp256r1 curve") + } + return &secp256{ + secp256r1: secp256r1, + }, nil +} + +// VerifySecp256k1 checks a secp256 signature provided in the DER encoding format. +// The hash type used over the message can also be configured using @param hashType +func (sec *secp256) VerifySecp256k1(key, msg, sig []byte, hashType uint8) error { + pubKey, err := btcec.ParsePubKey(key) + if err != nil { + return err + } + + messageHash, err := sec.hashMessage(msg, hashType) + if err != nil { + return err + } + + signature, err := ecdsa.ParseSignature(sig) + if err != nil { + return err + } + + verified := signature.Verify(messageHash, pubKey) + if !verified { + return signing.ErrInvalidSignature + } + + return nil +} + +// EncodeSecp256k1DERSignature creates a DER encoding of a signature provided with r and s. +// Useful when having the plain params - like in the case of ecrecover +// +// from ethereum +func (sec *secp256) EncodeSecp256k1DERSignature(r, s []byte) []byte { + rScalar := &btcec.ModNScalar{} + rScalar.SetByteSlice(r) + + sScalar := &btcec.ModNScalar{} + sScalar.SetByteSlice(s) + + sig := ecdsa.NewSignature(rScalar, sScalar) + + return sig.Serialize() +} + +func (sec *secp256) hashMessage(msg []byte, hashType uint8) ([]byte, error) { + hasher := hashing.NewHasher() + + var err error + var hashedMsg []byte + switch MessageHashType(hashType) { + case ECDSASha256: + hashedMsg, err = hasher.Sha256(msg) + case ECDSADoubleSha256: + hashedMsg = chainhash.DoubleHashB(msg) + case ECDSAKeccak256: + hashedMsg, err = hasher.Keccak256(msg) + case ECDSARipemd160: + hashedMsg, err = hasher.Ripemd160(msg) + case ECDSAPlainMsg: + hashedMsg = msg + default: + return nil, signing.ErrHasherNotSupported + } + + if err != nil { + return nil, err + } + + return hashedMsg, nil +} + +func (sec *secp256) VerifySecp256r1(key []byte, msg []byte, sig []byte) error { + if len(sig) != 64 { + return errInvalidSigLength + } + + s := signatureFromBytes(sig) + if !IsSNormalized(s.S) { + return errSignatureNotNormalized + } + + h := sha256.Sum256(msg) + cpk, err := sec.unmarshalPubKey(key) + if err != nil { + return err + } + + verified := cryptoEcsda.Verify(cpk, h[:], s.R, s.S) + if !verified { + return errSignatureVerificationFailed + } + + return nil +} + +func (sec *secp256) unmarshalPubKey(key []byte) (*cryptoEcsda.PublicKey, error) { + if len(key) != pubKeySize { + return nil, errPublicKeyLengthMissmatch + } + cpk := &cryptoEcsda.PublicKey{Curve: sec.secp256r1} + cpk.X, cpk.Y = elliptic.UnmarshalCompressed(sec.secp256r1, key) + return cpk, nil +} + +// signatureFromBytes function roughly copied from secp256k1_nocgo.go +// Read Signature struct from R || S. Caller needs to ensure that +// len(sigStr) == 64. +func signatureFromBytes(sigStr []byte) *signatureR1 { + return &signatureR1{ + R: new(big.Int).SetBytes(sigStr[:32]), + S: new(big.Int).SetBytes(sigStr[32:64]), + } +} + +// IsSNormalized returns true for the integer sigS if sigS falls in +// lower half of the curve order +func IsSNormalized(sigS *big.Int) bool { + return sigS.Cmp(p256HalfOrder) != 1 +} + +// NormalizeS will invert the s value if not already in the lower half +// of curve order value +func NormalizeS(sigS *big.Int) *big.Int { + if IsSNormalized(sigS) { + return sigS + } + + return new(big.Int).Sub(p256Order, sigS) +} diff --git a/crypto/signing/secp256k1/secp256k1_test.go b/crypto/signing/secp256/secp256_test.go similarity index 58% rename from crypto/signing/secp256k1/secp256k1_test.go rename to crypto/signing/secp256/secp256_test.go index b2210f093..f257f9b93 100644 --- a/crypto/signing/secp256k1/secp256k1_test.go +++ b/crypto/signing/secp256/secp256_test.go @@ -1,8 +1,13 @@ -package secp256k1 +package secp256 import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/sha256" "encoding/hex" "fmt" + "math/big" "testing" "github.com/stretchr/testify/assert" @@ -16,7 +21,7 @@ func TestEthereumSig(t *testing.T) { s, _ := hex.DecodeString("4a691139ad57a3f0b906637673aa2f63d1f55cb1a69199d4009eea23ceaddc93") key, _ := hex.DecodeString("04e32df42865e97135acfb65f3bae71bdc86f4d49150ad6a440b6f15878109880a0a2b2667f7e725ceea70c673093bf67663e0312623c8e091b13cf2c0f11ef652") - verifier := NewSecp256k1() + verifier, _ := NewSecp256() sig := verifier.EncodeSecp256k1DERSignature(r, s) err := verifier.VerifySecp256k1(key, msg, sig, byte(ECDSAPlainMsg)) @@ -36,7 +41,7 @@ func TestWrongSizeForRSShouldNotPanic(t *testing.T) { r, _ := hex.DecodeString("90f2") // too short s, _ := hex.DecodeString("4a691139ad57a3f0b906637673aa2f63d1f55cb1a69199d4009eea23ceaddc939393") // too long - verifier := NewSecp256k1() + verifier, _ := NewSecp256() sig := verifier.EncodeSecp256k1DERSignature(r, s) assert.NotEmpty(t, sig) @@ -50,7 +55,7 @@ func TestBitcoinSig(t *testing.T) { r, _ := hex.DecodeString("fef45d2892953aa5bbcdb057b5e98b208f1617a7498af7eb765574e29b5d9c2c") s, _ := hex.DecodeString("d47563f52aac6b04b55de236b7c515eb9311757db01e02cff079c3ca6efb063f") - verifier := NewSecp256k1() + verifier, _ := NewSecp256() sig := verifier.EncodeSecp256k1DERSignature(r, s) err := verifier.VerifySecp256k1(pubKey, msg, sig, byte(ECDSADoubleSha256)) @@ -63,15 +68,70 @@ func TestEthereumSig2(t *testing.T) { msg, _ := hex.DecodeString("616161") key, _ := hex.DecodeString("044338845e8308b819bf33a43dc7f47713f92d8d377dfde399831e9d8da23446be32cef60a7c923332ab06c768242d11017a6bcf419c17b8b184fc19ea603b07d6") sig, _ := hex.DecodeString("3046022100da0db89620513df9a90cf8c97edf227e07182d1c91b3cab55a472122d639daee022100d5b9cf4a02274cf5b606df7b4fa73bff1190f54e0c6ef8cd362e63dc1dbecce1") - verifier := NewSecp256k1() + verifier, _ := NewSecp256() err := verifier.VerifySecp256k1(key, msg, sig, byte(ECDSASha256)) assert.Nil(t, err) } -/* -04a3fe01e1c6ab5306130d09c1a928bd1598ccce020503ade24d0a5bf7040d5f4cdec9fdcba6497f834641b7908ed04d0b7698bbce6100ff2bbf82e5c52d523b19 -776562656c69676874 -e368f0ab2a13804e63dbc64d4c25175f117d1a5cb2444416f557423730f9da26678d224e7c6952eea2b99dff14546538b8d3dfb4abe37177b85d0abaa6677935 +func TestSecp256_VerifySecp256r1(t *testing.T) { + t.Parallel() + + msg := make([]byte, 100) + _, _ = rand.Read(msg) + verifier, _ := NewSecp256() + + sk, _ := GenPrivateKeyR1() + + key := elliptic.MarshalCompressed(elliptic.P256(), sk.PublicKey.X, sk.PublicKey.Y) + sig, _ := SignMessage(msg, sk) + + err := verifier.VerifySecp256r1(nil, nil, nil) + assert.NotNil(t, err) + + err = verifier.VerifySecp256r1(key, nil, nil) + assert.NotNil(t, err) + + err = verifier.VerifySecp256r1(key, nil, sig) + assert.NotNil(t, err) + + err = verifier.VerifySecp256r1(key, msg, sig) + assert.Nil(t, err) -*/ + msg[0] += 1 + err = verifier.VerifySecp256r1(key, msg, sig) + assert.NotNil(t, err) +} + +func GenPrivateKeyR1() (*ecdsa.PrivateKey, error) { + key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + return &ecdsa.PrivateKey{}, err + } + + return key, nil +} + +func SignMessage(msg []byte, privateKey *ecdsa.PrivateKey) ([]byte, error) { + digest := sha256.Sum256(msg) + r, s, err := ecdsa.Sign(rand.Reader, privateKey, digest[:]) + if err != nil { + return nil, err + } + + normS := NormalizeS(s) + return signatureRaw(r, normS), nil +} + +// will serialize signature to R || S. +// R, S are padded to 32 bytes respectively. +// code roughly copied from secp256k1_nocgo.go +func signatureRaw(r *big.Int, s *big.Int) []byte { + rBytes := r.Bytes() + sBytes := s.Bytes() + sigBytes := make([]byte, 64) + + copy(sigBytes[32-len(rBytes):32], rBytes) + copy(sigBytes[64-len(sBytes):64], sBytes) + return sigBytes +} diff --git a/crypto/signing/secp256k1/secp256k1.go b/crypto/signing/secp256k1/secp256k1.go deleted file mode 100644 index 72f9ac788..000000000 --- a/crypto/signing/secp256k1/secp256k1.go +++ /dev/null @@ -1,98 +0,0 @@ -package secp256k1 - -import ( - "github.com/multiversx/mx-chain-vm-go/crypto/hashing" - "github.com/multiversx/mx-chain-vm-go/crypto/signing" - - "github.com/btcsuite/btcd/btcec/v2" - "github.com/btcsuite/btcd/btcec/v2/ecdsa" - "github.com/btcsuite/btcd/chaincfg/chainhash" -) - -// MessageHashType defines the type of hash algorithm -type MessageHashType uint8 - -// constants that define the available hash algorithms -const ( - ECDSAPlainMsg MessageHashType = iota - ECDSASha256 - ECDSADoubleSha256 - ECDSAKeccak256 - ECDSARipemd160 -) - -type secp256k1 struct { -} - -// NewSecp256k1 returns the component able to verify Secp256k1 signatures -func NewSecp256k1() *secp256k1 { - return &secp256k1{} -} - -// VerifySecp256k1 checks a secp256k1 signature provided in the DER encoding format. -// The hash type used over the message can also be configured using @param hashType -func (sec *secp256k1) VerifySecp256k1(key, msg, sig []byte, hashType uint8) error { - pubKey, err := btcec.ParsePubKey(key) - if err != nil { - return err - } - - messageHash, err := sec.hashMessage(msg, hashType) - if err != nil { - return err - } - - signature, err := ecdsa.ParseSignature(sig) - if err != nil { - return err - } - - verified := signature.Verify(messageHash, pubKey) - if !verified { - return signing.ErrInvalidSignature - } - - return nil -} - -// EncodeSecp256k1DERSignature creates a DER encoding of a signature provided with r and s. -// Useful when having the plain params - like in the case of ecrecover -// from ethereum -func (sec *secp256k1) EncodeSecp256k1DERSignature(r, s []byte) []byte { - rScalar := &btcec.ModNScalar{} - rScalar.SetByteSlice(r) - - sScalar := &btcec.ModNScalar{} - sScalar.SetByteSlice(s) - - sig := ecdsa.NewSignature(rScalar, sScalar) - - return sig.Serialize() -} - -func (sec *secp256k1) hashMessage(msg []byte, hashType uint8) ([]byte, error) { - hasher := hashing.NewHasher() - - var err error - var hashedMsg []byte - switch MessageHashType(hashType) { - case ECDSASha256: - hashedMsg, err = hasher.Sha256(msg) - case ECDSADoubleSha256: - hashedMsg = chainhash.DoubleHashB(msg) - case ECDSAKeccak256: - hashedMsg, err = hasher.Keccak256(msg) - case ECDSARipemd160: - hashedMsg, err = hasher.Ripemd160(msg) - case ECDSAPlainMsg: - hashedMsg = msg - default: - return nil, signing.ErrHasherNotSupported - } - - if err != nil { - return nil, err - } - - return hashedMsg, nil -} diff --git a/executor/vmHooks.go b/executor/vmHooks.go index 87b9b1e3c..35cc52b42 100644 --- a/executor/vmHooks.go +++ b/executor/vmHooks.go @@ -72,6 +72,7 @@ type MainVMHooks interface { GetNumESDTTransfers() int32 GetCallValueTokenName(callValueOffset MemPtr, tokenNameOffset MemPtr) int32 GetCallValueTokenNameByIndex(callValueOffset MemPtr, tokenNameOffset MemPtr, index int32) int32 + IsReservedFunctionName(nameHandle int32) int32 WriteLog(dataPointer MemPtr, dataLength MemLength, topicPtr MemPtr, numTopics int32) WriteEventLog(numTopics int32, topicLengthsOffset MemPtr, topicOffset MemPtr, dataOffset MemPtr, dataLength MemLength) GetBlockTimestamp() int64 @@ -105,6 +106,8 @@ type ManagedVMHooks interface { ManagedSCAddress(destinationHandle int32) ManagedOwnerAddress(destinationHandle int32) ManagedCaller(destinationHandle int32) + ManagedGetOriginalCallerAddr(destinationHandle int32) + ManagedGetRelayerAddr(destinationHandle int32) ManagedSignalError(errHandle int32) ManagedWriteLog(topicsHandle int32, dataHandle int32) ManagedGetOriginalTxHash(resultHandle int32) @@ -113,7 +116,7 @@ type ManagedVMHooks interface { ManagedGetPrevBlockRandomSeed(resultHandle int32) ManagedGetReturnData(resultID int32, resultHandle int32) ManagedGetMultiESDTCallValue(multiCallValueHandle int32) - ManagedGetBackTransfers(esdtTransfersValueHandle int32, callValueHandle int32) + ManagedGetBackTransfers(esdtTransfersValueHandle int32, egldValueHandle int32) ManagedGetESDTBalance(addressHandle int32, tokenIDHandle int32, nonce int64, valueHandle int32) ManagedGetESDTTokenData(addressHandle int32, tokenIDHandle int32, nonce int64, valueHandle int32, propertiesHandle int32, hashHandle int32, nameHandle int32, attributesHandle int32, creatorHandle int32, royaltiesHandle int32, urisHandle int32) ManagedAsyncCall(destHandle int32, valueHandle int32, functionHandle int32, argumentsHandle int32) @@ -128,6 +131,7 @@ type ManagedVMHooks interface { ManagedExecuteOnSameContext(gas int64, addressHandle int32, valueHandle int32, functionHandle int32, argumentsHandle int32, resultHandle int32) int32 ManagedExecuteOnDestContext(gas int64, addressHandle int32, valueHandle int32, functionHandle int32, argumentsHandle int32, resultHandle int32) int32 ManagedMultiTransferESDTNFTExecute(dstHandle int32, tokenTransfersHandle int32, gasLimit int64, functionHandle int32, argumentsHandle int32) int32 + ManagedMultiTransferESDTNFTExecuteByUser(userHandle int32, dstHandle int32, tokenTransfersHandle int32, gasLimit int64, functionHandle int32, argumentsHandle int32) int32 ManagedTransferValueExecute(dstHandle int32, valueHandle int32, gasLimit int64, functionHandle int32, argumentsHandle int32) int32 ManagedIsESDTFrozen(addressHandle int32, tokenIDHandle int32, nonce int64) int32 ManagedIsESDTLimitedTransfer(tokenIDHandle int32) int32 @@ -295,4 +299,7 @@ type CryptoVMHooks interface { GetCurveLengthEC(ecHandle int32) int32 GetPrivKeyByteLengthEC(ecHandle int32) int32 EllipticCurveGetValues(ecHandle int32, fieldOrderHandle int32, basePointOrderHandle int32, eqConstantHandle int32, xBasePointHandle int32, yBasePointHandle int32) int32 + ManagedVerifySecp256r1(keyHandle int32, messageHandle int32, sigHandle int32) int32 + ManagedVerifyBLSSignatureShare(keyHandle int32, messageHandle int32, sigHandle int32) int32 + ManagedVerifyBLSAggregatedSignature(keyHandle int32, messageHandle int32, sigHandle int32) int32 } diff --git a/executor/wrapper/wrapperInstance.go b/executor/wrapper/wrapperInstance.go index 3809b44f0..d4fd11f1b 100644 --- a/executor/wrapper/wrapperInstance.go +++ b/executor/wrapper/wrapperInstance.go @@ -128,7 +128,6 @@ func (inst *WrapperInstance) MemDump() []byte { // IsFunctionImported wraps the call to the underlying instance. func (inst *WrapperInstance) IsFunctionImported(name string) bool { result := inst.wrappedInstance.IsFunctionImported(name) - inst.logger.LogExecutorEvent(fmt.Sprintf("IsFunctionImported(%s): %t", name, result)) return result } diff --git a/executor/wrapper/wrapperVMHooks.go b/executor/wrapper/wrapperVMHooks.go index ee827f4c7..595cf7351 100644 --- a/executor/wrapper/wrapperVMHooks.go +++ b/executor/wrapper/wrapperVMHooks.go @@ -485,6 +485,15 @@ func (w *WrapperVMHooks) GetCallValueTokenNameByIndex(callValueOffset executor.M return result } +// IsReservedFunctionName VM hook wrapper +func (w *WrapperVMHooks) IsReservedFunctionName(nameHandle int32) int32 { + callInfo := fmt.Sprintf("IsReservedFunctionName(%d)", nameHandle) + w.logger.LogVMHookCallBefore(callInfo) + result := w.wrappedVMHooks.IsReservedFunctionName(nameHandle) + w.logger.LogVMHookCallAfter(callInfo) + return result +} + // WriteLog VM hook wrapper func (w *WrapperVMHooks) WriteLog(dataPointer executor.MemPtr, dataLength executor.MemLength, topicPtr executor.MemPtr, numTopics int32) { callInfo := fmt.Sprintf("WriteLog(%d, %d, %d, %d)", dataPointer, dataLength, topicPtr, numTopics) @@ -741,6 +750,22 @@ func (w *WrapperVMHooks) ManagedCaller(destinationHandle int32) { w.logger.LogVMHookCallAfter(callInfo) } +// ManagedGetOriginalCallerAddr VM hook wrapper +func (w *WrapperVMHooks) ManagedGetOriginalCallerAddr(destinationHandle int32) { + callInfo := fmt.Sprintf("ManagedGetOriginalCallerAddr(%d)", destinationHandle) + w.logger.LogVMHookCallBefore(callInfo) + w.wrappedVMHooks.ManagedGetOriginalCallerAddr(destinationHandle) + w.logger.LogVMHookCallAfter(callInfo) +} + +// ManagedGetRelayerAddr VM hook wrapper +func (w *WrapperVMHooks) ManagedGetRelayerAddr(destinationHandle int32) { + callInfo := fmt.Sprintf("ManagedGetRelayerAddr(%d)", destinationHandle) + w.logger.LogVMHookCallBefore(callInfo) + w.wrappedVMHooks.ManagedGetRelayerAddr(destinationHandle) + w.logger.LogVMHookCallAfter(callInfo) +} + // ManagedSignalError VM hook wrapper func (w *WrapperVMHooks) ManagedSignalError(errHandle int32) { callInfo := fmt.Sprintf("ManagedSignalError(%d)", errHandle) @@ -806,10 +831,10 @@ func (w *WrapperVMHooks) ManagedGetMultiESDTCallValue(multiCallValueHandle int32 } // ManagedGetBackTransfers VM hook wrapper -func (w *WrapperVMHooks) ManagedGetBackTransfers(esdtTransfersValueHandle int32, callValueHandle int32) { - callInfo := fmt.Sprintf("ManagedGetBackTransfers(%d, %d)", esdtTransfersValueHandle, callValueHandle) +func (w *WrapperVMHooks) ManagedGetBackTransfers(esdtTransfersValueHandle int32, egldValueHandle int32) { + callInfo := fmt.Sprintf("ManagedGetBackTransfers(%d, %d)", esdtTransfersValueHandle, egldValueHandle) w.logger.LogVMHookCallBefore(callInfo) - w.wrappedVMHooks.ManagedGetBackTransfers(esdtTransfersValueHandle, callValueHandle) + w.wrappedVMHooks.ManagedGetBackTransfers(esdtTransfersValueHandle, egldValueHandle) w.logger.LogVMHookCallAfter(callInfo) } @@ -932,6 +957,15 @@ func (w *WrapperVMHooks) ManagedMultiTransferESDTNFTExecute(dstHandle int32, tok return result } +// ManagedMultiTransferESDTNFTExecuteByUser VM hook wrapper +func (w *WrapperVMHooks) ManagedMultiTransferESDTNFTExecuteByUser(userHandle int32, dstHandle int32, tokenTransfersHandle int32, gasLimit int64, functionHandle int32, argumentsHandle int32) int32 { + callInfo := fmt.Sprintf("ManagedMultiTransferESDTNFTExecuteByUser(%d, %d, %d, %d, %d, %d)", userHandle, dstHandle, tokenTransfersHandle, gasLimit, functionHandle, argumentsHandle) + w.logger.LogVMHookCallBefore(callInfo) + result := w.wrappedVMHooks.ManagedMultiTransferESDTNFTExecuteByUser(userHandle, dstHandle, tokenTransfersHandle, gasLimit, functionHandle, argumentsHandle) + w.logger.LogVMHookCallAfter(callInfo) + return result +} + // ManagedTransferValueExecute VM hook wrapper func (w *WrapperVMHooks) ManagedTransferValueExecute(dstHandle int32, valueHandle int32, gasLimit int64, functionHandle int32, argumentsHandle int32) int32 { callInfo := fmt.Sprintf("ManagedTransferValueExecute(%d, %d, %d, %d, %d)", dstHandle, valueHandle, gasLimit, functionHandle, argumentsHandle) @@ -2218,3 +2252,30 @@ func (w *WrapperVMHooks) EllipticCurveGetValues(ecHandle int32, fieldOrderHandle w.logger.LogVMHookCallAfter(callInfo) return result } + +// ManagedVerifySecp256r1 VM hook wrapper +func (w *WrapperVMHooks) ManagedVerifySecp256r1(keyHandle int32, messageHandle int32, sigHandle int32) int32 { + callInfo := fmt.Sprintf("ManagedVerifySecp256r1(%d, %d, %d)", keyHandle, messageHandle, sigHandle) + w.logger.LogVMHookCallBefore(callInfo) + result := w.wrappedVMHooks.ManagedVerifySecp256r1(keyHandle, messageHandle, sigHandle) + w.logger.LogVMHookCallAfter(callInfo) + return result +} + +// ManagedVerifyBLSSignatureShare VM hook wrapper +func (w *WrapperVMHooks) ManagedVerifyBLSSignatureShare(keyHandle int32, messageHandle int32, sigHandle int32) int32 { + callInfo := fmt.Sprintf("ManagedVerifyBLSSignatureShare(%d, %d, %d)", keyHandle, messageHandle, sigHandle) + w.logger.LogVMHookCallBefore(callInfo) + result := w.wrappedVMHooks.ManagedVerifyBLSSignatureShare(keyHandle, messageHandle, sigHandle) + w.logger.LogVMHookCallAfter(callInfo) + return result +} + +// ManagedVerifyBLSAggregatedSignature VM hook wrapper +func (w *WrapperVMHooks) ManagedVerifyBLSAggregatedSignature(keyHandle int32, messageHandle int32, sigHandle int32) int32 { + callInfo := fmt.Sprintf("ManagedVerifyBLSAggregatedSignature(%d, %d, %d)", keyHandle, messageHandle, sigHandle) + w.logger.LogVMHookCallBefore(callInfo) + result := w.wrappedVMHooks.ManagedVerifyBLSAggregatedSignature(keyHandle, messageHandle, sigHandle) + w.logger.LogVMHookCallAfter(callInfo) + return result +} diff --git a/go.mod b/go.mod index 035d8bd69..38afc4a07 100644 --- a/go.mod +++ b/go.mod @@ -8,12 +8,12 @@ require ( github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 github.com/gogo/protobuf v1.3.2 github.com/mitchellh/mapstructure v1.5.0 - github.com/multiversx/mx-chain-core-go v1.2.19 - github.com/multiversx/mx-chain-crypto-go v1.2.11 - github.com/multiversx/mx-chain-logger-go v1.0.14 - github.com/multiversx/mx-chain-scenario-go v1.4.3 - github.com/multiversx/mx-chain-storage-go v1.0.15 - github.com/multiversx/mx-chain-vm-common-go v1.5.12 + github.com/multiversx/mx-chain-core-go v1.2.22 + github.com/multiversx/mx-chain-crypto-go v1.2.12 + github.com/multiversx/mx-chain-logger-go v1.0.15 + github.com/multiversx/mx-chain-scenario-go v1.4.4 + github.com/multiversx/mx-chain-storage-go v1.0.16 + github.com/multiversx/mx-chain-vm-common-go v1.5.16 github.com/multiversx/mx-components-big-int v1.0.0 github.com/pelletier/go-toml v1.9.3 github.com/stretchr/testify v1.8.1 diff --git a/go.sum b/go.sum index 7fe9d7c9d..e31060204 100644 --- a/go.sum +++ b/go.sum @@ -83,18 +83,18 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiversx/mx-chain-core-go v1.2.19 h1:2BaVHkB0tro3cjs5ay2pmLup1loCV0e1p9jV5QW0xqc= -github.com/multiversx/mx-chain-core-go v1.2.19/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= -github.com/multiversx/mx-chain-crypto-go v1.2.11 h1:MNPJoiTJA5/tedYrI0N22OorbsKDESWG0SF8MCJwcJI= -github.com/multiversx/mx-chain-crypto-go v1.2.11/go.mod h1:pcZutPdfLiAFytzCU3LxU3s8cXkvpNqquyitFSfoF3o= -github.com/multiversx/mx-chain-logger-go v1.0.14 h1:PRMpAvXE7Nec2d//QNmbYfKVHMomOKmcN4UXurQWX9o= -github.com/multiversx/mx-chain-logger-go v1.0.14/go.mod h1:bDfHSdwqIimn7Gp8w+SH5KlDuGzJ//nlyEANAaTSc3o= -github.com/multiversx/mx-chain-scenario-go v1.4.3 h1:9xeVB8TOsolXS4YEr1CZ/VZr5Qk0X+nde8nRGnxJICo= -github.com/multiversx/mx-chain-scenario-go v1.4.3/go.mod h1:Bd7/Xs3mWM6pX/REHK5dfpf3MUfjMZ7li09cfCxg2ac= -github.com/multiversx/mx-chain-storage-go v1.0.15 h1:PDyP1uouAVjR32dFgM+7iaQBdReD/tKBJj10JbxXvaE= -github.com/multiversx/mx-chain-storage-go v1.0.15/go.mod h1:GZUK3sqf5onsWS/0ZPWjDCBjAL22FigQPUh252PAVk0= -github.com/multiversx/mx-chain-vm-common-go v1.5.12 h1:Q8F6DE7XhgHtWgg2rozSv4Tv5fE3ENkJz6mjRoAfht8= -github.com/multiversx/mx-chain-vm-common-go v1.5.12/go.mod h1:Sv6iS1okB6gy3HAsW6KHYtAxShNAfepKLtu//AURI8c= +github.com/multiversx/mx-chain-core-go v1.2.22 h1:yDYrvoQOBbsDerEp7L3+de5AfMy3pTF333gWPpd+FNk= +github.com/multiversx/mx-chain-core-go v1.2.22/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= +github.com/multiversx/mx-chain-crypto-go v1.2.12 h1:zWip7rpUS4CGthJxfKn5MZfMfYPjVjIiCID6uX5BSOk= +github.com/multiversx/mx-chain-crypto-go v1.2.12/go.mod h1:HzcPpCm1zanNct/6h2rIh+MFrlXbjA5C8+uMyXj3LI4= +github.com/multiversx/mx-chain-logger-go v1.0.15 h1:HlNdK8etyJyL9NQ+6mIXyKPEBo+wRqOwi3n+m2QIHXc= +github.com/multiversx/mx-chain-logger-go v1.0.15/go.mod h1:t3PRKaWB1M+i6gUfD27KXgzLJJC+mAQiN+FLlL1yoGQ= +github.com/multiversx/mx-chain-scenario-go v1.4.4 h1:DVE2V+FPeyD/yWoC+KEfPK3jsFzHeruelESfpTlf460= +github.com/multiversx/mx-chain-scenario-go v1.4.4/go.mod h1:kI+TWR3oIEgUkbwkHCPo2CQ3VjIge+ezGTibiSGwMxo= +github.com/multiversx/mx-chain-storage-go v1.0.16 h1:l2lJq+EAN3YwLbjJrnoKfFd1/1Xmo9DcAUECND2obLs= +github.com/multiversx/mx-chain-storage-go v1.0.16/go.mod h1:uM/z7YyqTOD3wgyH8TfapyEl5sb+7x/Jaxne4cfG4HI= +github.com/multiversx/mx-chain-vm-common-go v1.5.16 h1:g1SqYjxl7K66Y1O/q6tvDJ37fzpzlxCSfRzSm/woQQY= +github.com/multiversx/mx-chain-vm-common-go v1.5.16/go.mod h1:1rSkXreUZNXyPTTdhj47M+Fy62yjxbu3aAsXEtKN3UY= github.com/multiversx/mx-components-big-int v1.0.0 h1:Wkr8lSzK2nDqixOrrBa47VNuqdhV1m/aJhaP1EMaiS8= github.com/multiversx/mx-components-big-int v1.0.0/go.mod h1:maIEMgHlNE2u78JaDD0oLzri+ShgU4okHfzP3LWGdQM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= diff --git a/integrationTests/features/pureFunctionUtil.go b/integrationTests/features/pureFunctionUtil.go index bfe12edd6..41721ebbe 100644 --- a/integrationTests/features/pureFunctionUtil.go +++ b/integrationTests/features/pureFunctionUtil.go @@ -50,17 +50,18 @@ func newPureFunctionExecutor() (*pureFunctionExecutor, error) { vm, err := hostCore.NewVMHost( world, &vmhost.VMHostParameters{ - VMType: testVMType, - OverrideVMExecutor: nil, - BlockGasLimit: blockGasLimit, - GasSchedule: gasSchedule, - BuiltInFuncContainer: builtInFunctions.NewBuiltInFunctionContainer(), - ProtectedKeyPrefix: []byte("E" + "L" + "R" + "O" + "N" + "D"), - ESDTTransferParser: esdtTransferParser, - EpochNotifier: &mock.EpochNotifierStub{}, - EnableEpochsHandler: worldmock.EnableEpochsHandlerStubNoFlags(), - WasmerSIGSEGVPassthrough: false, - Hasher: defaultHasher, + VMType: testVMType, + OverrideVMExecutor: nil, + BlockGasLimit: blockGasLimit, + GasSchedule: gasSchedule, + BuiltInFuncContainer: builtInFunctions.NewBuiltInFunctionContainer(), + ProtectedKeyPrefix: []byte("E" + "L" + "R" + "O" + "N" + "D"), + ESDTTransferParser: esdtTransferParser, + EpochNotifier: &mock.EpochNotifierStub{}, + EnableEpochsHandler: worldmock.EnableEpochsHandlerStubNoFlags(), + WasmerSIGSEGVPassthrough: false, + Hasher: defaultHasher, + MapOpcodeAddressIsAllowed: map[string]map[string]struct{}{}, }) if err != nil { return nil, err diff --git a/integrationTests/json/scenariosAdderLog_test.go b/integrationTests/json/scenariosAdderLog_test.go index ba7bbd206..26a6c199f 100644 --- a/integrationTests/json/scenariosAdderLog_test.go +++ b/integrationTests/json/scenariosAdderLog_test.go @@ -8,7 +8,6 @@ const expectedAdderLog = `starting log: GetFunctionNames: [add callBack getSum init upgrade] ValidateFunctionArities: true GetFunctionNames: [add callBack getSum init upgrade] -GetFunctionNames: [add callBack getSum init upgrade] HasFunction(init): true CallFunction(init): VM hook begin: CheckNoPayment() diff --git a/mock/context/cryptoMock.go b/mock/context/cryptoMock.go index 4f1bc3e0f..5d0487946 100644 --- a/mock/context/cryptoMock.go +++ b/mock/context/cryptoMock.go @@ -26,6 +26,16 @@ func (c *CryptoHookMock) VerifyBLS(_ []byte, _ []byte, _ []byte) error { return c.Err } +// VerifyAggregatedSig mocked method +func (c *CryptoHookMock) VerifyAggregatedSig(_ [][]byte, _ []byte, _ []byte) error { + return c.Err +} + +// VerifySignatureShare mocked method +func (c *CryptoHookMock) VerifySignatureShare(_ []byte, _ []byte, _ []byte) error { + return c.Err +} + // VerifyEd25519 mocked method func (c *CryptoHookMock) VerifyEd25519(_ []byte, _ []byte, _ []byte) error { return c.Err @@ -36,6 +46,11 @@ func (c *CryptoHookMock) VerifySecp256k1(_ []byte, _ []byte, _ []byte, _ uint8) return c.Err } +// VerifySecp256r1 mocked method +func (c *CryptoHookMock) VerifySecp256r1(_ []byte, _ []byte, _ []byte) error { + return c.Err +} + // EncodeSecp256k1DERSignature mocked method func (c *CryptoHookMock) EncodeSecp256k1DERSignature(_, _ []byte) []byte { return make([]byte, 0) diff --git a/mock/context/executorMockFunc.go b/mock/context/executorMockFunc.go index c4cc3f95c..fbe383f7b 100644 --- a/mock/context/executorMockFunc.go +++ b/mock/context/executorMockFunc.go @@ -9,259 +9,266 @@ package mock var empty struct{} var functionNames = map[string]struct{}{ - "getGasLeft": empty, - "getSCAddress": empty, - "getOwnerAddress": empty, - "getShardOfAddress": empty, - "isSmartContract": empty, - "signalError": empty, - "getExternalBalance": empty, - "getBlockHash": empty, - "getESDTBalance": empty, - "getESDTNFTNameLength": empty, - "getESDTNFTAttributeLength": empty, - "getESDTNFTURILength": empty, - "getESDTTokenData": empty, - "getESDTLocalRoles": empty, - "validateTokenIdentifier": empty, - "transferValue": empty, - "transferValueExecute": empty, - "transferESDTExecute": empty, - "transferESDTNFTExecute": empty, - "multiTransferESDTNFTExecute": empty, - "createAsyncCall": empty, - "setAsyncContextCallback": empty, - "upgradeContract": empty, - "upgradeFromSourceContract": empty, - "deleteContract": empty, - "asyncCall": empty, - "getArgumentLength": empty, - "getArgument": empty, - "getFunction": empty, - "getNumArguments": empty, - "storageStore": empty, - "storageLoadLength": empty, - "storageLoadFromAddress": empty, - "storageLoad": empty, - "setStorageLock": empty, - "getStorageLock": empty, - "isStorageLocked": empty, - "clearStorageLock": empty, - "getCaller": empty, - "checkNoPayment": empty, - "getCallValue": empty, - "getESDTValue": empty, - "getESDTValueByIndex": empty, - "getESDTTokenName": empty, - "getESDTTokenNameByIndex": empty, - "getESDTTokenNonce": empty, - "getESDTTokenNonceByIndex": empty, - "getCurrentESDTNFTNonce": empty, - "getESDTTokenType": empty, - "getESDTTokenTypeByIndex": empty, - "getNumESDTTransfers": empty, - "getCallValueTokenName": empty, - "getCallValueTokenNameByIndex": empty, - "writeLog": empty, - "writeEventLog": empty, - "getBlockTimestamp": empty, - "getBlockNonce": empty, - "getBlockRound": empty, - "getBlockEpoch": empty, - "getBlockRandomSeed": empty, - "getStateRootHash": empty, - "getPrevBlockTimestamp": empty, - "getPrevBlockNonce": empty, - "getPrevBlockRound": empty, - "getPrevBlockEpoch": empty, - "getPrevBlockRandomSeed": empty, - "finish": empty, - "executeOnSameContext": empty, - "executeOnDestContext": empty, - "executeReadOnly": empty, - "createContract": empty, - "deployFromSourceContract": empty, - "getNumReturnData": empty, - "getReturnDataSize": empty, - "getReturnData": empty, - "cleanReturnData": empty, - "deleteFromReturnData": empty, - "getOriginalTxHash": empty, - "getCurrentTxHash": empty, - "getPrevTxHash": empty, - "managedSCAddress": empty, - "managedOwnerAddress": empty, - "managedCaller": empty, - "managedSignalError": empty, - "managedWriteLog": empty, - "managedGetOriginalTxHash": empty, - "managedGetStateRootHash": empty, - "managedGetBlockRandomSeed": empty, - "managedGetPrevBlockRandomSeed": empty, - "managedGetReturnData": empty, - "managedGetMultiESDTCallValue": empty, - "managedGetBackTransfers": empty, - "managedGetESDTBalance": empty, - "managedGetESDTTokenData": empty, - "managedAsyncCall": empty, - "managedCreateAsyncCall": empty, - "managedGetCallbackClosure": empty, - "managedUpgradeFromSourceContract": empty, - "managedUpgradeContract": empty, - "managedDeleteContract": empty, - "managedDeployFromSourceContract": empty, - "managedCreateContract": empty, - "managedExecuteReadOnly": empty, - "managedExecuteOnSameContext": empty, - "managedExecuteOnDestContext": empty, - "managedMultiTransferESDTNFTExecute": empty, - "managedTransferValueExecute": empty, - "managedIsESDTFrozen": empty, - "managedIsESDTLimitedTransfer": empty, - "managedIsESDTPaused": empty, - "managedBufferToHex": empty, - "managedGetCodeMetadata": empty, - "managedIsBuiltinFunction": empty, - "bigFloatNewFromParts": empty, - "bigFloatNewFromFrac": empty, - "bigFloatNewFromSci": empty, - "bigFloatAdd": empty, - "bigFloatSub": empty, - "bigFloatMul": empty, - "bigFloatDiv": empty, - "bigFloatNeg": empty, - "bigFloatClone": empty, - "bigFloatCmp": empty, - "bigFloatAbs": empty, - "bigFloatSign": empty, - "bigFloatSqrt": empty, - "bigFloatPow": empty, - "bigFloatFloor": empty, - "bigFloatCeil": empty, - "bigFloatTruncate": empty, - "bigFloatSetInt64": empty, - "bigFloatIsInt": empty, - "bigFloatSetBigInt": empty, - "bigFloatGetConstPi": empty, - "bigFloatGetConstE": empty, - "bigIntGetUnsignedArgument": empty, - "bigIntGetSignedArgument": empty, - "bigIntStorageStoreUnsigned": empty, - "bigIntStorageLoadUnsigned": empty, - "bigIntGetCallValue": empty, - "bigIntGetESDTCallValue": empty, - "bigIntGetESDTCallValueByIndex": empty, - "bigIntGetExternalBalance": empty, - "bigIntGetESDTExternalBalance": empty, - "bigIntNew": empty, - "bigIntUnsignedByteLength": empty, - "bigIntSignedByteLength": empty, - "bigIntGetUnsignedBytes": empty, - "bigIntGetSignedBytes": empty, - "bigIntSetUnsignedBytes": empty, - "bigIntSetSignedBytes": empty, - "bigIntIsInt64": empty, - "bigIntGetInt64": empty, - "bigIntSetInt64": empty, - "bigIntAdd": empty, - "bigIntSub": empty, - "bigIntMul": empty, - "bigIntTDiv": empty, - "bigIntTMod": empty, - "bigIntEDiv": empty, - "bigIntEMod": empty, - "bigIntSqrt": empty, - "bigIntPow": empty, - "bigIntLog2": empty, - "bigIntAbs": empty, - "bigIntNeg": empty, - "bigIntSign": empty, - "bigIntCmp": empty, - "bigIntNot": empty, - "bigIntAnd": empty, - "bigIntOr": empty, - "bigIntXor": empty, - "bigIntShr": empty, - "bigIntShl": empty, - "bigIntFinishUnsigned": empty, - "bigIntFinishSigned": empty, - "bigIntToString": empty, - "mBufferNew": empty, - "mBufferNewFromBytes": empty, - "mBufferGetLength": empty, - "mBufferGetBytes": empty, - "mBufferGetByteSlice": empty, - "mBufferCopyByteSlice": empty, - "mBufferEq": empty, - "mBufferSetBytes": empty, - "mBufferSetByteSlice": empty, - "mBufferAppend": empty, - "mBufferAppendBytes": empty, - "mBufferToBigIntUnsigned": empty, - "mBufferToBigIntSigned": empty, - "mBufferFromBigIntUnsigned": empty, - "mBufferFromBigIntSigned": empty, - "mBufferToBigFloat": empty, - "mBufferFromBigFloat": empty, - "mBufferStorageStore": empty, - "mBufferStorageLoad": empty, - "mBufferStorageLoadFromAddress": empty, - "mBufferGetArgument": empty, - "mBufferFinish": empty, - "mBufferSetRandom": empty, - "managedMapNew": empty, - "managedMapPut": empty, - "managedMapGet": empty, - "managedMapRemove": empty, - "managedMapContains": empty, - "smallIntGetUnsignedArgument": empty, - "smallIntGetSignedArgument": empty, - "smallIntFinishUnsigned": empty, - "smallIntFinishSigned": empty, - "smallIntStorageStoreUnsigned": empty, - "smallIntStorageStoreSigned": empty, - "smallIntStorageLoadUnsigned": empty, - "smallIntStorageLoadSigned": empty, - "int64getArgument": empty, - "int64finish": empty, - "int64storageStore": empty, - "int64storageLoad": empty, - "sha256": empty, - "managedSha256": empty, - "keccak256": empty, - "managedKeccak256": empty, - "ripemd160": empty, - "managedRipemd160": empty, - "verifyBLS": empty, - "managedVerifyBLS": empty, - "verifyEd25519": empty, - "managedVerifyEd25519": empty, - "verifyCustomSecp256k1": empty, - "managedVerifyCustomSecp256k1": empty, - "verifySecp256k1": empty, - "managedVerifySecp256k1": empty, - "encodeSecp256k1DerSignature": empty, - "managedEncodeSecp256k1DerSignature": empty, - "addEC": empty, - "doubleEC": empty, - "isOnCurveEC": empty, - "scalarBaseMultEC": empty, - "managedScalarBaseMultEC": empty, - "scalarMultEC": empty, - "managedScalarMultEC": empty, - "marshalEC": empty, - "managedMarshalEC": empty, - "marshalCompressedEC": empty, - "managedMarshalCompressedEC": empty, - "unmarshalEC": empty, - "managedUnmarshalEC": empty, - "unmarshalCompressedEC": empty, - "managedUnmarshalCompressedEC": empty, - "generateKeyEC": empty, - "managedGenerateKeyEC": empty, - "createEC": empty, - "managedCreateEC": empty, - "getCurveLengthEC": empty, - "getPrivKeyByteLengthEC": empty, - "ellipticCurveGetValues": empty, + "getGasLeft": empty, + "getSCAddress": empty, + "getOwnerAddress": empty, + "getShardOfAddress": empty, + "isSmartContract": empty, + "signalError": empty, + "getExternalBalance": empty, + "getBlockHash": empty, + "getESDTBalance": empty, + "getESDTNFTNameLength": empty, + "getESDTNFTAttributeLength": empty, + "getESDTNFTURILength": empty, + "getESDTTokenData": empty, + "getESDTLocalRoles": empty, + "validateTokenIdentifier": empty, + "transferValue": empty, + "transferValueExecute": empty, + "transferESDTExecute": empty, + "transferESDTNFTExecute": empty, + "multiTransferESDTNFTExecute": empty, + "createAsyncCall": empty, + "setAsyncContextCallback": empty, + "upgradeContract": empty, + "upgradeFromSourceContract": empty, + "deleteContract": empty, + "asyncCall": empty, + "getArgumentLength": empty, + "getArgument": empty, + "getFunction": empty, + "getNumArguments": empty, + "storageStore": empty, + "storageLoadLength": empty, + "storageLoadFromAddress": empty, + "storageLoad": empty, + "setStorageLock": empty, + "getStorageLock": empty, + "isStorageLocked": empty, + "clearStorageLock": empty, + "getCaller": empty, + "checkNoPayment": empty, + "getCallValue": empty, + "getESDTValue": empty, + "getESDTValueByIndex": empty, + "getESDTTokenName": empty, + "getESDTTokenNameByIndex": empty, + "getESDTTokenNonce": empty, + "getESDTTokenNonceByIndex": empty, + "getCurrentESDTNFTNonce": empty, + "getESDTTokenType": empty, + "getESDTTokenTypeByIndex": empty, + "getNumESDTTransfers": empty, + "getCallValueTokenName": empty, + "getCallValueTokenNameByIndex": empty, + "isReservedFunctionName": empty, + "writeLog": empty, + "writeEventLog": empty, + "getBlockTimestamp": empty, + "getBlockNonce": empty, + "getBlockRound": empty, + "getBlockEpoch": empty, + "getBlockRandomSeed": empty, + "getStateRootHash": empty, + "getPrevBlockTimestamp": empty, + "getPrevBlockNonce": empty, + "getPrevBlockRound": empty, + "getPrevBlockEpoch": empty, + "getPrevBlockRandomSeed": empty, + "finish": empty, + "executeOnSameContext": empty, + "executeOnDestContext": empty, + "executeReadOnly": empty, + "createContract": empty, + "deployFromSourceContract": empty, + "getNumReturnData": empty, + "getReturnDataSize": empty, + "getReturnData": empty, + "cleanReturnData": empty, + "deleteFromReturnData": empty, + "getOriginalTxHash": empty, + "getCurrentTxHash": empty, + "getPrevTxHash": empty, + "managedSCAddress": empty, + "managedOwnerAddress": empty, + "managedCaller": empty, + "managedGetOriginalCallerAddr": empty, + "managedGetRelayerAddr": empty, + "managedSignalError": empty, + "managedWriteLog": empty, + "managedGetOriginalTxHash": empty, + "managedGetStateRootHash": empty, + "managedGetBlockRandomSeed": empty, + "managedGetPrevBlockRandomSeed": empty, + "managedGetReturnData": empty, + "managedGetMultiESDTCallValue": empty, + "managedGetBackTransfers": empty, + "managedGetESDTBalance": empty, + "managedGetESDTTokenData": empty, + "managedAsyncCall": empty, + "managedCreateAsyncCall": empty, + "managedGetCallbackClosure": empty, + "managedUpgradeFromSourceContract": empty, + "managedUpgradeContract": empty, + "managedDeleteContract": empty, + "managedDeployFromSourceContract": empty, + "managedCreateContract": empty, + "managedExecuteReadOnly": empty, + "managedExecuteOnSameContext": empty, + "managedExecuteOnDestContext": empty, + "managedMultiTransferESDTNFTExecute": empty, + "managedMultiTransferESDTNFTExecuteByUser": empty, + "managedTransferValueExecute": empty, + "managedIsESDTFrozen": empty, + "managedIsESDTLimitedTransfer": empty, + "managedIsESDTPaused": empty, + "managedBufferToHex": empty, + "managedGetCodeMetadata": empty, + "managedIsBuiltinFunction": empty, + "bigFloatNewFromParts": empty, + "bigFloatNewFromFrac": empty, + "bigFloatNewFromSci": empty, + "bigFloatAdd": empty, + "bigFloatSub": empty, + "bigFloatMul": empty, + "bigFloatDiv": empty, + "bigFloatNeg": empty, + "bigFloatClone": empty, + "bigFloatCmp": empty, + "bigFloatAbs": empty, + "bigFloatSign": empty, + "bigFloatSqrt": empty, + "bigFloatPow": empty, + "bigFloatFloor": empty, + "bigFloatCeil": empty, + "bigFloatTruncate": empty, + "bigFloatSetInt64": empty, + "bigFloatIsInt": empty, + "bigFloatSetBigInt": empty, + "bigFloatGetConstPi": empty, + "bigFloatGetConstE": empty, + "bigIntGetUnsignedArgument": empty, + "bigIntGetSignedArgument": empty, + "bigIntStorageStoreUnsigned": empty, + "bigIntStorageLoadUnsigned": empty, + "bigIntGetCallValue": empty, + "bigIntGetESDTCallValue": empty, + "bigIntGetESDTCallValueByIndex": empty, + "bigIntGetExternalBalance": empty, + "bigIntGetESDTExternalBalance": empty, + "bigIntNew": empty, + "bigIntUnsignedByteLength": empty, + "bigIntSignedByteLength": empty, + "bigIntGetUnsignedBytes": empty, + "bigIntGetSignedBytes": empty, + "bigIntSetUnsignedBytes": empty, + "bigIntSetSignedBytes": empty, + "bigIntIsInt64": empty, + "bigIntGetInt64": empty, + "bigIntSetInt64": empty, + "bigIntAdd": empty, + "bigIntSub": empty, + "bigIntMul": empty, + "bigIntTDiv": empty, + "bigIntTMod": empty, + "bigIntEDiv": empty, + "bigIntEMod": empty, + "bigIntSqrt": empty, + "bigIntPow": empty, + "bigIntLog2": empty, + "bigIntAbs": empty, + "bigIntNeg": empty, + "bigIntSign": empty, + "bigIntCmp": empty, + "bigIntNot": empty, + "bigIntAnd": empty, + "bigIntOr": empty, + "bigIntXor": empty, + "bigIntShr": empty, + "bigIntShl": empty, + "bigIntFinishUnsigned": empty, + "bigIntFinishSigned": empty, + "bigIntToString": empty, + "mBufferNew": empty, + "mBufferNewFromBytes": empty, + "mBufferGetLength": empty, + "mBufferGetBytes": empty, + "mBufferGetByteSlice": empty, + "mBufferCopyByteSlice": empty, + "mBufferEq": empty, + "mBufferSetBytes": empty, + "mBufferSetByteSlice": empty, + "mBufferAppend": empty, + "mBufferAppendBytes": empty, + "mBufferToBigIntUnsigned": empty, + "mBufferToBigIntSigned": empty, + "mBufferFromBigIntUnsigned": empty, + "mBufferFromBigIntSigned": empty, + "mBufferToBigFloat": empty, + "mBufferFromBigFloat": empty, + "mBufferStorageStore": empty, + "mBufferStorageLoad": empty, + "mBufferStorageLoadFromAddress": empty, + "mBufferGetArgument": empty, + "mBufferFinish": empty, + "mBufferSetRandom": empty, + "managedMapNew": empty, + "managedMapPut": empty, + "managedMapGet": empty, + "managedMapRemove": empty, + "managedMapContains": empty, + "smallIntGetUnsignedArgument": empty, + "smallIntGetSignedArgument": empty, + "smallIntFinishUnsigned": empty, + "smallIntFinishSigned": empty, + "smallIntStorageStoreUnsigned": empty, + "smallIntStorageStoreSigned": empty, + "smallIntStorageLoadUnsigned": empty, + "smallIntStorageLoadSigned": empty, + "int64getArgument": empty, + "int64finish": empty, + "int64storageStore": empty, + "int64storageLoad": empty, + "sha256": empty, + "managedSha256": empty, + "keccak256": empty, + "managedKeccak256": empty, + "ripemd160": empty, + "managedRipemd160": empty, + "verifyBLS": empty, + "managedVerifyBLS": empty, + "verifyEd25519": empty, + "managedVerifyEd25519": empty, + "verifyCustomSecp256k1": empty, + "managedVerifyCustomSecp256k1": empty, + "verifySecp256k1": empty, + "managedVerifySecp256k1": empty, + "encodeSecp256k1DerSignature": empty, + "managedEncodeSecp256k1DerSignature": empty, + "addEC": empty, + "doubleEC": empty, + "isOnCurveEC": empty, + "scalarBaseMultEC": empty, + "managedScalarBaseMultEC": empty, + "scalarMultEC": empty, + "managedScalarMultEC": empty, + "marshalEC": empty, + "managedMarshalEC": empty, + "marshalCompressedEC": empty, + "managedMarshalCompressedEC": empty, + "unmarshalEC": empty, + "managedUnmarshalEC": empty, + "unmarshalCompressedEC": empty, + "managedUnmarshalCompressedEC": empty, + "generateKeyEC": empty, + "managedGenerateKeyEC": empty, + "createEC": empty, + "managedCreateEC": empty, + "getCurveLengthEC": empty, + "getPrivKeyByteLengthEC": empty, + "ellipticCurveGetValues": empty, + "managedVerifySecp256r1": empty, + "managedVerifyBLSSignatureShare": empty, + "managedVerifyBLSAggregatedSignature": empty, } diff --git a/mock/context/runtimeContextMock.go b/mock/context/runtimeContextMock.go index 99dd47e74..7f6771cc6 100644 --- a/mock/context/runtimeContextMock.go +++ b/mock/context/runtimeContextMock.go @@ -361,6 +361,11 @@ func (r *RuntimeContextMock) ValidateCallbackName(_ string) error { return nil } +// IsReservedFunctionName moked method +func (r *RuntimeContextMock) IsReservedFunctionName(_ string) bool { + return false +} + // HasFunction mocked method func (r *RuntimeContextMock) HasFunction(_ string) bool { return r.HasFunctionResult diff --git a/mock/context/runtimeContextWrapper.go b/mock/context/runtimeContextWrapper.go index 6e63c620c..f44ca3fbd 100644 --- a/mock/context/runtimeContextWrapper.go +++ b/mock/context/runtimeContextWrapper.go @@ -587,6 +587,11 @@ func (contextWrapper *RuntimeContextWrapper) ValidateCallbackName(callbackName s return contextWrapper.runtimeContext.ValidateCallbackName(callbackName) } +// IsReservedFunctionName calls corresponding xxxFunc function, that by default in turn calls the original method of the wrapped RuntimeContext +func (contextWrapper *RuntimeContextWrapper) IsReservedFunctionName(functionName string) bool { + return contextWrapper.runtimeContext.IsReservedFunctionName(functionName) +} + // HasFunction calls corresponding xxxFunc function, that by default in turn calls the original method of the wrapped RuntimeContext func (contextWrapper *RuntimeContextWrapper) HasFunction(functionName string) bool { return contextWrapper.runtimeContext.HasFunction(functionName) diff --git a/mock/context/stubAccount.go b/mock/context/stubAccount.go index 145c3e555..8aedc78b1 100644 --- a/mock/context/stubAccount.go +++ b/mock/context/stubAccount.go @@ -32,6 +32,11 @@ func (a *StubAccount) AddToBalance(_ *big.Int) error { panic("implement me") } +// SubFromBalance - +func (a *StubAccount) SubFromBalance(_ *big.Int) error { + panic("implement me") +} + // ClaimDeveloperRewards - func (a *StubAccount) ClaimDeveloperRewards(_ []byte) (*big.Int, error) { panic("implement me") diff --git a/mock/context/vmHostMock.go b/mock/context/vmHostMock.go index c3a4fa09e..34ef0346f 100644 --- a/mock/context/vmHostMock.go +++ b/mock/context/vmHostMock.go @@ -102,6 +102,11 @@ func (host *VMHostMock) AreInSameShard(left []byte, right []byte) bool { return leftShard == rightShard } +// IsAllowedToExecute mocked method +func (host *VMHostMock) IsAllowedToExecute(_ string) bool { + return true +} + // ExecuteESDTTransfer mocked method func (host *VMHostMock) ExecuteESDTTransfer(_ *vmhost.ESDTTransfersArgs, _ vm.CallType) (*vmcommon.VMOutput, uint64, error) { return nil, 0, nil diff --git a/mock/context/vmHostStub.go b/mock/context/vmHostStub.go index 4f34cb055..0ef8339bb 100644 --- a/mock/context/vmHostStub.go +++ b/mock/context/vmHostStub.go @@ -36,6 +36,7 @@ type VMHostStub struct { IsBuiltinFunctionNameCalled func(functionName string) bool IsBuiltinFunctionCallCalled func(data []byte) bool AreInSameShardCalled func(left []byte, right []byte) bool + IsAllowedToExecuteCalled func(opcode string) bool RunSmartContractCallCalled func(input *vmcommon.ContractCallInput) (vmOutput *vmcommon.VMOutput, err error) RunSmartContractCreateCalled func(input *vmcommon.ContractCreateInput) (vmOutput *vmcommon.VMOutput, err error) @@ -215,6 +216,14 @@ func (vhs *VMHostStub) AreInSameShard(left []byte, right []byte) bool { return true } +// IsAllowedToExecute mocked method +func (vhs *VMHostStub) IsAllowedToExecute(opcode string) bool { + if vhs.IsAllowedToExecuteCalled != nil { + return vhs.IsAllowedToExecuteCalled(opcode) + } + return true +} + // IsBuiltinFunctionName mocked method func (vhs *VMHostStub) IsBuiltinFunctionName(functionName string) bool { if vhs.IsBuiltinFunctionNameCalled != nil { diff --git a/scenario/gasSchedules/gasScheduleEmbedGenerated.go b/scenario/gasSchedules/gasScheduleEmbedGenerated.go index 6612c9946..9e9eaea22 100644 --- a/scenario/gasSchedules/gasScheduleEmbedGenerated.go +++ b/scenario/gasSchedules/gasScheduleEmbedGenerated.go @@ -27,6 +27,11 @@ const ( ESDTNFTAddUri = 500000 ESDTNFTUpdateAttributes = 500000 ESDTNFTMultiTransfer = 1000000 + ESDTModifyRoyalties = 500000 + ESDTModifyCreator = 500000 + ESDTNFTRecreate = 1000000 + ESDTNFTUpdate = 1000000 + ESDTNFTSetNewURIs = 500000 SetGuardian = 250000 GuardAccount = 250000 UnGuardAccount = 250000 @@ -116,6 +121,7 @@ const ( DeleteFromReturnData = 100 GetCodeMetadata = 100 IsBuiltinFunction = 100 + IsReservedFunctionName = 100 [EthAPICost] UseGas = 100 @@ -235,6 +241,9 @@ const ( UnmarshalCompressedECC = 270000 GenerateKeyECC = 7000000 EncodeDERSig = 10000000 + VerifySecp256r1 = 2000000 + VerifyBLSSignatureShare = 2000000 + VerifyBLSMultiSig = 2000000 [ManagedBufferAPICost] MBufferNew = 2000 @@ -847,6 +856,11 @@ const ( ESDTNFTAddUri = 50000 ESDTNFTUpdateAttributes = 50000 ESDTNFTMultiTransfer = 200000 + ESDTModifyRoyalties = 100000 + ESDTModifyCreator = 100000 + ESDTNFTRecreate = 1000000 + ESDTNFTUpdate = 1000000 + ESDTNFTSetNewURIs = 500000 SetGuardian = 250000 GuardAccount = 250000 UnGuardAccount = 250000 @@ -938,6 +952,7 @@ const ( DeleteFromReturnData = 100 GetCodeMetadata = 100 IsBuiltinFunction = 100 + IsReservedFunctionName = 100 [EthAPICost] UseGas = 100 @@ -1057,6 +1072,9 @@ const ( UnmarshalCompressedECC = 270000 GenerateKeyECC = 7000000 EncodeDERSig = 10000000 +VerifySecp256r1 = 2000000 +VerifyBLSSignatureShare = 2000000 +VerifyBLSMultiSig = 2000000 [ManagedBufferAPICost] MBufferNew = 2000 diff --git a/scenario/gasSchedules/gasScheduleV3.toml b/scenario/gasSchedules/gasScheduleV3.toml index 872e446ef..9aec4d8a9 100644 --- a/scenario/gasSchedules/gasScheduleV3.toml +++ b/scenario/gasSchedules/gasScheduleV3.toml @@ -15,6 +15,11 @@ ESDTNFTAddUri = 500000 ESDTNFTUpdateAttributes = 500000 ESDTNFTMultiTransfer = 1000000 + ESDTModifyRoyalties = 500000 + ESDTModifyCreator = 500000 + ESDTNFTRecreate = 1000000 + ESDTNFTUpdate = 1000000 + ESDTNFTSetNewURIs = 500000 SetGuardian = 250000 GuardAccount = 250000 UnGuardAccount = 250000 @@ -104,6 +109,7 @@ DeleteFromReturnData = 100 GetCodeMetadata = 100 IsBuiltinFunction = 100 + IsReservedFunctionName = 100 [EthAPICost] UseGas = 100 @@ -223,6 +229,9 @@ UnmarshalCompressedECC = 270000 GenerateKeyECC = 7000000 EncodeDERSig = 10000000 + VerifySecp256r1 = 2000000 + VerifyBLSSignatureShare = 2000000 + VerifyBLSMultiSig = 2000000 [ManagedBufferAPICost] MBufferNew = 2000 diff --git a/scenario/gasSchedules/gasScheduleV4.toml b/scenario/gasSchedules/gasScheduleV4.toml index e8da3a62d..e3a324c9e 100644 --- a/scenario/gasSchedules/gasScheduleV4.toml +++ b/scenario/gasSchedules/gasScheduleV4.toml @@ -15,6 +15,11 @@ ESDTNFTAddUri = 50000 ESDTNFTUpdateAttributes = 50000 ESDTNFTMultiTransfer = 200000 + ESDTModifyRoyalties = 100000 + ESDTModifyCreator = 100000 + ESDTNFTRecreate = 1000000 + ESDTNFTUpdate = 1000000 + ESDTNFTSetNewURIs = 500000 SetGuardian = 250000 GuardAccount = 250000 UnGuardAccount = 250000 @@ -106,6 +111,7 @@ DeleteFromReturnData = 100 GetCodeMetadata = 100 IsBuiltinFunction = 100 + IsReservedFunctionName = 100 [EthAPICost] UseGas = 100 @@ -225,6 +231,9 @@ UnmarshalCompressedECC = 270000 GenerateKeyECC = 7000000 EncodeDERSig = 10000000 + VerifySecp256r1 = 2000000 + VerifyBLSSignatureShare = 2000000 + VerifyBLSMultiSig = 2000000 [ManagedBufferAPICost] MBufferNew = 2000 diff --git a/scenario/vmBuilder.go b/scenario/vmBuilder.go index d30c35cb0..47f896851 100644 --- a/scenario/vmBuilder.go +++ b/scenario/vmBuilder.go @@ -21,17 +21,22 @@ var _ scenexec.VMBuilder = (*ScenarioVMHostBuilder)(nil) // DefaultVMType is the VM type argument we use in tests. var DefaultVMType = []byte{5, 0} +// DefaultTimeOutForSCExecutionInMilliseconds is the mainnet timeout. +var DefaultTimeOutForSCExecutionInMilliseconds uint32 = 10000 + // VMTestExecutor parses, interprets and executes both .test.json tests and .scen.json scenarios with VM. type ScenarioVMHostBuilder struct { - OverrideVMExecutor executor.ExecutorAbstractFactory - VMType []byte + OverrideVMExecutor executor.ExecutorAbstractFactory + VMType []byte + TimeOutForSCExecutionInMilliseconds uint32 } // NewScenarioVMHostBuilder creates a default ScenarioVMHostBuilder. func NewScenarioVMHostBuilder() *ScenarioVMHostBuilder { return &ScenarioVMHostBuilder{ - OverrideVMExecutor: nil, - VMType: DefaultVMType, + OverrideVMExecutor: nil, + VMType: DefaultVMType, + TimeOutForSCExecutionInMilliseconds: DefaultTimeOutForSCExecutionInMilliseconds, } } @@ -78,17 +83,19 @@ func (svb *ScenarioVMHostBuilder) NewVM( return hostCore.NewVMHost( world, &vmhost.VMHostParameters{ - VMType: svb.VMType, - OverrideVMExecutor: svb.OverrideVMExecutor, - BlockGasLimit: blockGasLimit, - GasSchedule: gasSchedule, - BuiltInFuncContainer: world.BuiltinFuncs.Container, - ProtectedKeyPrefix: []byte(core.ProtectedKeyPrefix), - ESDTTransferParser: esdtTransferParser, - EpochNotifier: &mock.EpochNotifierStub{}, - EnableEpochsHandler: world.EnableEpochsHandler, - WasmerSIGSEGVPassthrough: false, - Hasher: worldmock.DefaultHasher, + VMType: svb.VMType, + OverrideVMExecutor: svb.OverrideVMExecutor, + BlockGasLimit: blockGasLimit, + GasSchedule: gasSchedule, + BuiltInFuncContainer: world.BuiltinFuncs.Container, + ProtectedKeyPrefix: []byte(core.ProtectedKeyPrefix), + ESDTTransferParser: esdtTransferParser, + EpochNotifier: &mock.EpochNotifierStub{}, + EnableEpochsHandler: world.EnableEpochsHandler, + WasmerSIGSEGVPassthrough: false, + Hasher: worldmock.DefaultHasher, + MapOpcodeAddressIsAllowed: map[string]map[string]struct{}{}, + TimeOutForSCExecutionInMilliseconds: svb.TimeOutForSCExecutionInMilliseconds, }) } diff --git a/test/features/basic-features/output/basic-features-crypto.mxsc.json b/test/features/basic-features/output/basic-features-crypto.mxsc.json new file mode 100644 index 000000000..05e09f0ac --- /dev/null +++ b/test/features/basic-features/output/basic-features-crypto.mxsc.json @@ -0,0 +1,324 @@ +{ + "buildInfo": { + "rustc": { + "version": "1.80.1", + "commitHash": "3f5fd8dd41153bc5fdca9427e9e05be2c767ba23", + "commitDate": "2024-08-06", + "channel": "Stable", + "short": "rustc 1.80.1 (3f5fd8dd4 2024-08-06)" + }, + "contractCrate": { + "name": "basic-features", + "version": "0.0.0" + }, + "framework": { + "name": "multiversx-sc", + "version": "0.52.3" + } + }, + "abi": { + "name": "BasicFeatures", + "constructor": { + "inputs": [], + "outputs": [] + }, + "endpoints": [ + { + "name": "verify_secp256r1_signature", + "mutability": "mutable", + "inputs": [ + { + "name": "key", + "type": "bytes" + }, + { + "name": "message", + "type": "bytes" + }, + { + "name": "signature", + "type": "bytes" + } + ], + "outputs": [], + "labels": [ + "crypto-ei-1.4" + ] + }, + { + "name": "verify_bls_signature_share", + "mutability": "mutable", + "inputs": [ + { + "name": "key", + "type": "bytes" + }, + { + "name": "message", + "type": "bytes" + }, + { + "name": "signature", + "type": "bytes" + } + ], + "outputs": [], + "labels": [ + "crypto-ei-1.4" + ] + }, + { + "name": "verify_bls_aggregated_signature", + "mutability": "mutable", + "inputs": [ + { + "name": "key", + "type": "List" + }, + { + "name": "message", + "type": "bytes" + }, + { + "name": "signature", + "type": "bytes" + } + ], + "outputs": [], + "labels": [ + "crypto-ei-1.4" + ] + } + ], + "events": [ + { + "identifier": "event_err_topic", + "inputs": [ + { + "name": "err_topic", + "type": "CodecErrorTestType", + "indexed": true + } + ] + }, + { + "identifier": "event_err_data", + "inputs": [ + { + "name": "data", + "type": "CodecErrorTestType" + } + ] + }, + { + "identifier": "event_a", + "inputs": [ + { + "name": "data", + "type": "u32" + } + ] + }, + { + "identifier": "event_b", + "inputs": [ + { + "name": "arg1", + "type": "BigUint", + "indexed": true + }, + { + "name": "arg2", + "type": "Address", + "indexed": true + }, + { + "name": "data", + "type": "List" + } + ] + } + ], + "esdtAttributes": [], + "hasCallback": false, + "types": { + "CodecErrorTestType": { + "type": "struct", + "docs": [ + "Helper type to explore encode/decode errors." + ] + }, + "EsdtTokenPayment": { + "type": "struct", + "fields": [ + { + "name": "token_identifier", + "type": "TokenIdentifier" + }, + { + "name": "token_nonce", + "type": "u64" + }, + { + "name": "amount", + "type": "BigUint" + } + ] + }, + "ExampleEnumSimple": { + "type": "enum", + "docs": [ + "Copied from multiversx-sc serialization tests." + ], + "variants": [ + { + "docs": [ + "Variant 0 doc comment.", + "This will show up in the ABI." + ], + "name": "Variant0", + "discriminant": 0 + }, + { + "name": "Variant1", + "discriminant": 1 + }, + { + "docs": [ + "One line is enough. The one above doesn't have any." + ], + "name": "Variant2", + "discriminant": 2 + } + ] + }, + "ExampleEnumWithFields": { + "type": "enum", + "docs": [ + "Copied from multiversx-sc serialization tests." + ], + "variants": [ + { + "name": "Unit", + "discriminant": 0 + }, + { + "name": "Newtype", + "discriminant": 1, + "fields": [ + { + "name": "0", + "type": "u32" + } + ] + }, + { + "name": "Tuple", + "discriminant": 2, + "fields": [ + { + "name": "0", + "type": "u32" + }, + { + "name": "1", + "type": "u32" + } + ] + }, + { + "name": "Struct", + "discriminant": 3, + "fields": [ + { + "name": "a", + "type": "u32" + } + ] + } + ] + }, + "ExampleStructManaged": { + "type": "struct", + "fields": [ + { + "name": "big_uint", + "type": "BigUint" + }, + { + "name": "int", + "type": "u32" + }, + { + "name": "bytes", + "type": "bytes" + } + ] + }, + "RgbColor": { + "type": "struct", + "fields": [ + { + "name": "r", + "type": "u8" + }, + { + "name": "g", + "type": "u8" + }, + { + "name": "b", + "type": "u8" + } + ] + }, + "TokenAttributesStruct": { + "type": "struct", + "fields": [ + { + "name": "field_biguint", + "type": "BigUint" + }, + { + "name": "field_u64", + "type": "u64" + }, + { + "name": "field_vec_u32", + "type": "List" + } + ] + } + } + }, + "code": "0061736d01000000012b0860000060037f7f7f017f6000017f60047f7f7f7f017f60017f0060017f017f60027f7f0060027f7f017f02e8020e03656e76126d427566666572417070656e644279746573000103656e76126d616e616765645369676e616c4572726f72000403656e760f6d4275666665725365744279746573000103656e76106d4275666665724765744c656e677468000503656e760a6d4275666665724e6577000203656e76146d427566666572436f707942797465536c696365000303656e760f6765744e756d417267756d656e7473000203656e760b7369676e616c4572726f72000603656e76136d42756666657247657442797465536c696365000303656e76126d427566666572476574417267756d656e74000703656e760e636865636b4e6f5061796d656e74000003656e76166d616e61676564566572696679536563703235367231000103656e761e6d616e61676564566572696679424c535369676e61747572655368617265000103656e76236d616e61676564566572696679424c53416767726567617465645369676e61747572650001030c0b000502030400000000000005030100030616037f01418080080b7f0041f0ce080b7f0041f0ce080b07930108066d656d6f7279020004696e697400131a7665726966795f7365637032353672315f7369676e617475726500141a7665726966795f626c735f7369676e61747572655f736861726500151f7665726966795f626c735f616767726567617465645f7369676e617475726500160863616c6c4261636b00170a5f5f646174615f656e6403010b5f5f686561705f6261736503020ad7040b3701017f1010220041808008411710021a200041c28008410310001a200041978008410310001a200041b38008410f10001a20001001000b0d0020001010220010091a20000b1901017f41d4800841d4800828020041016b220036020020000b0f00200020012003200210084100470b1400100620004604400f0b419a800841191007000b0800100a410010120b1700100a410310124100100f4101100f4102100f100b1a0b1700100a410310124100100f4101100f4102100f100c1a0b870301087f100a41031012027f230041106b220224004100100f2103101022064101410010021a2003100321070240024002400340200020074604402001044041e8ce08410036020041ecce0841003a00000b200241106a240020060c050b2002410036020c0240027f0240024020014504402003100322014190ce004b0d0141ecce082d00000d0141e8ce08200136020041ecce0841013a00002003410041d88008200110111a0b200041046a220441e8ce082802004d0d010c070b200320002002410c6a2205410410110d06200041046a21044100210120050c010b2000417b4b0d0120044190ce004b0d0341012101200041d880086a0b2100200320042000280000220041187420004180fe03714108747220004108764180fe03712000411876727222051004220010050d032002200041187420004180fe03714108747220004108764180fe0371200041187672723602082006200241086a410410001a200420056a21000c010b0b1018000b1018000b100e000b100e000b4101100f4102100f100d1a0b02000b0b0041c58008410e1007000b0b660200418080080b53617267756d656e74206465636f6465206572726f722028293a2077726f6e67206e756d626572206f6620617267756d656e7473696e70757420746f6f2073686f72746b657970616e6963206f636375727265640041d480080b0438ffffff", + "report": { + "imports": [ + "checkNoPayment", + "getNumArguments", + "mBufferAppendBytes", + "mBufferCopyByteSlice", + "mBufferGetArgument", + "mBufferGetByteSlice", + "mBufferGetLength", + "mBufferNew", + "mBufferSetBytes", + "managedSignalError", + "managedVerifyBLSAggregatedSignature", + "managedVerifyBLSSignatureShare", + "managedVerifySecp256r1", + "signalError" + ], + "isMemGrow": false, + "eiCheck": { + "eiVersion": "1.4", + "ok": true + }, + "codeReport": { + "path": "../output/basic-features-crypto.wasm", + "size": 1315, + "hasAllocator": false, + "hasPanic": "without message" + } + } +} diff --git a/test/features/basic-features/output/basic-features-storage-bytes.mxsc.json b/test/features/basic-features/output/basic-features-storage-bytes.mxsc.json index 619430b7a..6cb7f7fb8 100644 --- a/test/features/basic-features/output/basic-features-storage-bytes.mxsc.json +++ b/test/features/basic-features/output/basic-features-storage-bytes.mxsc.json @@ -1,11 +1,11 @@ { "buildInfo": { "rustc": { - "version": "1.76.0-nightly", - "commitHash": "d86d65bbc19b928387f68427fcc3a0da498d8a19", - "commitDate": "2023-12-10", - "channel": "Nightly", - "short": "rustc 1.76.0-nightly (d86d65bbc 2023-12-10)" + "version": "1.80.1", + "commitHash": "3f5fd8dd41153bc5fdca9427e9e05be2c767ba23", + "commitDate": "2024-08-06", + "channel": "Stable", + "short": "rustc 1.80.1 (3f5fd8dd4 2024-08-06)" }, "contractCrate": { "name": "basic-features", @@ -13,7 +13,7 @@ }, "framework": { "name": "multiversx-sc", - "version": "0.47.1" + "version": "0.52.3" } }, "abi": { @@ -246,6 +246,28 @@ } } }, - "size": 539, - "code": "0061736d0100000001230760000060027f7f017f6000017f60027f7f0060037f7f7f017f60017f017f60017f0002b4010803656e76126d427566666572476574417267756d656e74000103656e760f6765744e756d417267756d656e7473000203656e760b7369676e616c4572726f72000303656e760f6d4275666665725365744279746573000403656e760e636865636b4e6f5061796d656e74000003656e76126d42756666657253746f726167654c6f6164000103656e760d6d42756666657246696e697368000503656e76136d42756666657253746f7261676553746f72650001030807020602000000000503010003060f027f0041ac80080b7f0041b080080b075207066d656d6f7279020004696e6974000b0a6c6f61645f6279746573000c0b73746f72655f6279746573000d0863616c6c4261636b000e0a5f5f646174615f656e6403000b5f5f686561705f6261736503010a8501071901017f41a8800841a8800828020041016b220036020020000b1400100120004604400f0b4180800841191002000b1301017f1008220041998008410d10031a20000b08001004410010090b1801017f100441001009100a1008220010051a200010061a0b1a01017f10044101100941001008220010001a100a200010071a0b0300010b0b390200418080080b2677726f6e67206e756d626572206f6620617267756d656e747373746f726167655f62797465730041a880080b049cffffff" + "code": "0061736d0100000001230760000060027f7f017f6000017f60027f7f0060037f7f7f017f60017f017f60017f0002b4010803656e76126d427566666572476574417267756d656e74000103656e760f6765744e756d417267756d656e7473000203656e760b7369676e616c4572726f72000303656e760f6d4275666665725365744279746573000403656e760e636865636b4e6f5061796d656e74000003656e76126d42756666657253746f726167654c6f6164000103656e760d6d42756666657246696e697368000503656e76136d42756666657253746f7261676553746f72650001030807020602000000000503010003060f027f0041ac80080b7f0041b080080b075207066d656d6f7279020004696e6974000b0a6c6f61645f6279746573000c0b73746f72655f6279746573000d0863616c6c4261636b000e0a5f5f646174615f656e6403000b5f5f686561705f6261736503010a8401071901017f41a8800841a8800828020041016b220036020020000b1400100120004604400f0b4180800841191002000b1301017f1008220041998008410d10031a20000b08001004410010090b1801017f100441001009100a1008220010051a200010061a0b1a01017f10044101100941001008220010001a100a200010071a0b02000b0b390200418080080b2677726f6e67206e756d626572206f6620617267756d656e747373746f726167655f62797465730041a880080b0438ffffff", + "report": { + "imports": [ + "checkNoPayment", + "getNumArguments", + "mBufferFinish", + "mBufferGetArgument", + "mBufferSetBytes", + "mBufferStorageLoad", + "mBufferStorageStore", + "signalError" + ], + "isMemGrow": false, + "eiCheck": { + "eiVersion": "1.3", + "ok": true + }, + "codeReport": { + "path": "../output/basic-features-storage-bytes.wasm", + "size": 538, + "hasAllocator": false, + "hasPanic": "none" + } + } } diff --git a/test/features/basic-features/output/basic-features.mxsc.json b/test/features/basic-features/output/basic-features.mxsc.json index 066ef6a2c..e7809570b 100644 --- a/test/features/basic-features/output/basic-features.mxsc.json +++ b/test/features/basic-features/output/basic-features.mxsc.json @@ -1,11 +1,11 @@ { "buildInfo": { "rustc": { - "version": "1.76.0-nightly", - "commitHash": "d86d65bbc19b928387f68427fcc3a0da498d8a19", - "commitDate": "2023-12-10", - "channel": "Nightly", - "short": "rustc 1.76.0-nightly (d86d65bbc 2023-12-10)" + "version": "1.80.1", + "commitHash": "3f5fd8dd41153bc5fdca9427e9e05be2c767ba23", + "commitDate": "2024-08-06", + "channel": "Stable", + "short": "rustc 1.80.1 (3f5fd8dd4 2024-08-06)" }, "contractCrate": { "name": "basic-features", @@ -13,7 +13,7 @@ }, "framework": { "name": "multiversx-sc", - "version": "0.47.1" + "version": "0.52.3" } }, "abi": { @@ -2018,11 +2018,7 @@ "type": "bytes" } ], - "outputs": [ - { - "type": "bool" - } - ] + "outputs": [] }, { "name": "verify_ed25519_signature", @@ -3317,25 +3313,6 @@ } ] }, - { - "name": "managed_vec_array_push", - "mutability": "mutable", - "inputs": [ - { - "name": "mv", - "type": "List>" - }, - { - "name": "item", - "type": "array5" - } - ], - "outputs": [ - { - "type": "List>" - } - ] - }, { "name": "managed_ref_explicit", "mutability": "mutable", @@ -4597,6 +4574,71 @@ } ] }, + { + "name": "set_mapper_front", + "mutability": "mutable", + "inputs": [], + "outputs": [ + { + "type": "u32" + } + ] + }, + { + "name": "set_mapper_back", + "mutability": "mutable", + "inputs": [], + "outputs": [ + { + "type": "u32" + } + ] + }, + { + "name": "set_mapper_next", + "mutability": "mutable", + "inputs": [ + { + "name": "item", + "type": "u32" + } + ], + "outputs": [ + { + "type": "u32" + } + ] + }, + { + "name": "set_mapper_previous", + "mutability": "mutable", + "inputs": [ + { + "name": "item", + "type": "u32" + } + ], + "outputs": [ + { + "type": "u32" + } + ] + }, + { + "name": "set_mapper_iter_from_and_count", + "mutability": "mutable", + "inputs": [ + { + "name": "item", + "type": "u32" + } + ], + "outputs": [ + { + "type": "u32" + } + ] + }, { "name": "map_my_single_value_mapper", "mutability": "readonly", @@ -4705,6 +4747,21 @@ } ] }, + { + "name": "set_single_value_mapper_with_key", + "mutability": "mutable", + "inputs": [ + { + "name": "key", + "type": "u32" + }, + { + "name": "value", + "type": "bytes" + } + ], + "outputs": [] + }, { "name": "vec_mapper", "mutability": "readonly", @@ -5348,6 +5405,62 @@ } ] }, + { + "name": "unordered_set_mapper", + "mutability": "readonly", + "inputs": [], + "outputs": [ + { + "type": "variadic", + "multi_result": true + } + ] + }, + { + "name": "unordered_set_mapper_insert", + "mutability": "mutable", + "inputs": [ + { + "name": "item", + "type": "u32" + } + ], + "outputs": [ + { + "type": "bool" + } + ] + }, + { + "name": "unordered_set_mapper_contains", + "mutability": "mutable", + "inputs": [ + { + "name": "item", + "type": "u32" + } + ], + "outputs": [ + { + "type": "bool" + } + ] + }, + { + "name": "unordered_set_mapper_remove", + "mutability": "mutable", + "inputs": [ + { + "name": "item", + "type": "u32" + } + ], + "outputs": [ + { + "type": "bool" + } + ] + }, { "name": "managed_struct_eq", "mutability": "mutable", @@ -5638,6 +5751,19 @@ } ] }, + { + "name": "returns_egld_decimal", + "mutability": "mutable", + "payableInTokens": [ + "EGLD" + ], + "inputs": [], + "outputs": [ + { + "type": "ManagedDecimal<18>" + } + ] + }, { "name": "set_contract_address", "mutability": "mutable", @@ -5684,6 +5810,106 @@ } ] }, + { + "name": "next_at_address", + "mutability": "mutable", + "inputs": [ + { + "name": "item", + "type": "u32" + } + ], + "outputs": [ + { + "type": "u32" + } + ] + }, + { + "name": "previous_at_address", + "mutability": "mutable", + "inputs": [ + { + "name": "item", + "type": "u32" + } + ], + "outputs": [ + { + "type": "u32" + } + ] + }, + { + "name": "front_at_address", + "mutability": "mutable", + "inputs": [], + "outputs": [ + { + "type": "u32" + } + ] + }, + { + "name": "back_at_address", + "mutability": "mutable", + "inputs": [], + "outputs": [ + { + "type": "u32" + } + ] + }, + { + "name": "keys_at_address", + "mutability": "mutable", + "inputs": [], + "outputs": [ + { + "type": "List" + } + ] + }, + { + "name": "values_at_address", + "mutability": "mutable", + "inputs": [], + "outputs": [ + { + "type": "List" + } + ] + }, + { + "name": "contains_unordered_at_address", + "mutability": "mutable", + "inputs": [ + { + "name": "item", + "type": "u32" + } + ], + "outputs": [ + { + "type": "bool" + } + ] + }, + { + "name": "get_by_index", + "mutability": "mutable", + "inputs": [ + { + "name": "index", + "type": "u32" + } + ], + "outputs": [ + { + "type": "u32" + } + ] + }, { "name": "fill_set_mapper", "mutability": "mutable", @@ -5694,6 +5920,154 @@ } ], "outputs": [] + }, + { + "name": "fill_map_mapper", + "mutability": "mutable", + "inputs": [ + { + "name": "value", + "type": "u32" + } + ], + "outputs": [] + }, + { + "name": "fill_unordered_set_mapper", + "mutability": "mutable", + "inputs": [ + { + "name": "value", + "type": "u32" + } + ], + "outputs": [] + }, + { + "name": "get_value_from_address_with_keys", + "mutability": "readonly", + "inputs": [ + { + "name": "address", + "type": "Address" + }, + { + "name": "extra_key", + "type": "u32" + } + ], + "outputs": [ + { + "type": "bytes" + } + ] + }, + { + "name": "managed_decimal_addition", + "mutability": "mutable", + "inputs": [ + { + "name": "first", + "type": "ManagedDecimal<2>" + }, + { + "name": "second", + "type": "ManagedDecimal<2>" + } + ], + "outputs": [ + { + "type": "ManagedDecimal<2>" + } + ] + }, + { + "name": "managed_decimal_subtraction", + "mutability": "mutable", + "inputs": [ + { + "name": "first", + "type": "ManagedDecimal<2>" + }, + { + "name": "second", + "type": "ManagedDecimal<2>" + } + ], + "outputs": [ + { + "type": "ManagedDecimal<2>" + } + ] + }, + { + "name": "managed_decimal_eq", + "mutability": "mutable", + "inputs": [ + { + "name": "first", + "type": "ManagedDecimal<2>" + }, + { + "name": "second", + "type": "ManagedDecimal<2>" + } + ], + "outputs": [ + { + "type": "bool" + } + ] + }, + { + "name": "managed_decimal_trunc", + "mutability": "mutable", + "inputs": [], + "outputs": [ + { + "type": "BigUint" + } + ] + }, + { + "name": "managed_decimal_into_raw_units", + "mutability": "mutable", + "inputs": [], + "outputs": [ + { + "type": "BigUint" + } + ] + }, + { + "name": "managed_decimal_ln", + "mutability": "mutable", + "inputs": [ + { + "name": "x", + "type": "ManagedDecimal<9>" + } + ], + "outputs": [ + { + "type": "ManagedDecimalSigned<9>" + } + ] + }, + { + "name": "managed_decimal_log2", + "mutability": "mutable", + "inputs": [ + { + "name": "x", + "type": "ManagedDecimal<9>" + } + ], + "outputs": [ + { + "type": "ManagedDecimalSigned<9>" + } + ] } ], "events": [ @@ -5897,6 +6271,130 @@ } } }, - "size": 61709, - "code": "0061736d0100000001f2012460000060027f7f0060027f7f017f60017f017f60037f7f7f0060017f0060037f7f7f017f6000017f60047f7f7f7f0060047f7f7f7f017f6000017e60027f7e0060057f7f7f7f7f0060017f017e60037f7e7f0060037f7f7e017f60027f7f017e60057f7f7e7f7f017f60057f7f7f7e7f0060017e0060067f7f7f7f7f7f017f60047f7f7e7f0060027e7f0060027f7e017f60047f7f7f7e0060017e017f60067e7f7f7f7f7f017f60077f7f7f7f7f7f7f00600b7f7f7e7f7f7f7f7f7f7f7f0060037e7f7f017f60037f7f7f017e60017e017e60037f7f7e0060067f7f7f7f7f7f0060047f7e7f7f0060067f7e7f7f7f7f0002e2146e03656e76126d616e616765645369676e616c4572726f72000503656e760e626967496e74536574496e743634000b03656e7609626967496e74416464000403656e760b7369676e616c4572726f72000103656e760a6d4275666665724e6577000703656e760d6d427566666572417070656e64000203656e76096d4275666665724571000203656e76136d42756666657253746f7261676553746f7265000203656e760d6d42756666657246696e697368000303656e760a6765744761734c656674000a03656e76106d616e61676564534341646472657373000503656e7609626967496e744e6577001903656e761b6d616e61676564457865637574654f6e44657374436f6e74657874001a03656e760f636c65616e52657475726e44617461000003656e76126d427566666572417070656e644279746573000603656e76226d616e616765644d756c74695472616e73666572455344544e465445786563757465001103656e760d6d616e6167656443616c6c6572000503656e76186d616e616765644765744f726967696e616c547848617368000503656e76106d4275666665724765744c656e677468000303656e760f6d4275666665724765744279746573000203656e761c626967496e744765744553445445787465726e616c42616c616e6365001203656e76136d616e616765644f776e657241646472657373000503656e7612626967496e7447657443616c6c56616c7565000503656e761c6d616e616765644765744d756c74694553445443616c6c56616c7565000503656e76126d427566666572476574417267756d656e74000203656e76136765744e756d455344545472616e7366657273000703656e7611676574417267756d656e744c656e677468000303656e761b736d616c6c496e74476574556e7369676e6564417267756d656e74000d03656e7619626967496e74476574556e7369676e6564417267756d656e74000103656e7619736d616c6c496e744765745369676e6564417267756d656e74000d03656e7617626967496e744765745369676e6564417267756d656e74000103656e760f6765744e756d417267756d656e7473000703656e7616736d616c6c496e7446696e697368556e7369676e6564001303656e7614626967496e7446696e697368556e7369676e6564000503656e760666696e697368000103656e7609626967496e74537562000403656e760f6d4275666665725365744279746573000603656e7616656c6c6970746963437572766547657456616c756573001403656e761067657443757276654c656e6774684543000303656e76086372656174654543000203656e76146d427566666572436f707942797465536c696365000903656e7609626967496e7453686c000403656e7609626967496e74536872000403656e76176d42756666657246726f6d426967496e745369676e6564000203656e76156d427566666572546f426967496e745369676e6564000203656e7609626967496e74506f77000403656e76196d42756666657246726f6d426967496e74556e7369676e6564000203656e76176d427566666572546f426967496e74556e7369676e6564000203656e760a626967496e7453717274000103656e761776616c6964617465546f6b656e4964656e746966696572000303656e76126d42756666657253746f726167654c6f6164000203656e761d6d42756666657253746f726167654c6f616446726f6d41646472657373000403656e761b6d616e616765645472616e7366657256616c756545786563757465001103656e7609626967496e74436d70000203656e760f6973536d617274436f6e7472616374000303656e760f6d616e6167656457726974654c6f67000103656e760e636865636b4e6f5061796d656e74000003656e760a626967496e744c6f6732000303656e7612626967496e7446696e6973685369676e6564000503656e7614736d616c6c496e7446696e6973685369676e6564001303656e7609626967496e74416273000103656e7609626967496e744e6567000103656e7609626967496e744d756c000403656e760a626967496e7454446976000403656e760a626967496e74544d6f64000403656e7609626967496e74416e64000403656e7608626967496e744f72000403656e7609626967496e74586f72000403656e7611676574426c6f636b54696d657374616d70000a03656e760d676574426c6f636b4e6f6e6365000a03656e760d676574426c6f636b526f756e64000a03656e760d676574426c6f636b45706f6368000a03656e76196d616e61676564476574426c6f636b52616e646f6d53656564000503656e761567657450726576426c6f636b54696d657374616d70000a03656e761167657450726576426c6f636b4e6f6e6365000a03656e761167657450726576426c6f636b526f756e64000a03656e761167657450726576426c6f636b45706f6368000a03656e761d6d616e6167656447657450726576426c6f636b52616e646f6d53656564000503656e761167657453686172644f6641646472657373000303656e76176d616e616765644765745374617465526f6f7448617368000503656e76166d616e61676564476574436f64654d65746164617461000103656e76186d616e6167656449734275696c74696e46756e6374696f6e000303656e760d6d616e61676564536861323536000203656e76106d616e616765644b656363616b323536000203656e76106d616e61676564526970656d64313630000203656e76106d616e61676564566572696679424c53000603656e76146d616e6167656456657269667945643235353139000603656e76166d616e61676564566572696679536563703235366b31000603656e761c6d616e61676564566572696679437573746f6d536563703235366b31000903656e76226d616e61676564456e636f6465536563703235366b314465725369676e6174757265000603656e760f6d616e616765644372656174654543000303656e7616676574507269764b6579427974654c656e6774684543000303656e76056164644543001b03656e7608646f75626c654543000c03656e760b69734f6e43757276654543000603656e76136d616e616765645363616c61724d756c744543001403656e76176d616e616765645363616c6172426173654d756c744543000903656e76106d616e616765644d61727368616c4543000903656e761a6d616e616765644d61727368616c436f6d707265737365644543000903656e76126d616e61676564556e6d61727368616c4543000903656e761c6d616e61676564556e6d61727368616c436f6d707265737365644543000903656e76146d616e6167656447656e65726174654b65794543000903656e76106d42756666657253657452616e646f6d000203656e76136d42756666657253657442797465536c696365000903656e76176d616e6167656447657445534454546f6b656e44617461001c03656e760d626967496e744973496e743634000303656e760e626967496e74476574496e743634000d03656e760a626967496e745369676e000303656e76136d42756666657247657442797465536c696365000903656e76106d616e616765644173796e6343616c6c0008039f059d05070203070501010c0003020201040201080101040108050103050108070102010301010301010103040401150e010b011d0e07070f0507070507090210080006060806060601060306030601060602090601060c1e0602070606060303030502020409060403080501050500010305090516010101010105010501050105040308040308010c05070104040601080b0404010303080204010117021f0201010103020201010203070b0408040309040503030d0303030303010104040504010502100202020102080b060102020402010804010202060204020202080101090101080103010304010608060201020102040402040401040801040101050b01032017030e02101610050703010403080205210202020f010318040f0f15010618040c0112020503030501050704010c0301220304050103020505050503070707050705070705000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e230405030100030616037f01418080080b7f004195e7080b7f0041a0e7080b07e244fc02066d656d6f7279020004696e697400b4031070616e6963576974684d65737361676500b5030a636f756e745f6f6e657300b70319656e64706f696e745f776974685f6d757461626c655f61726700b8030d737172745f6269675f75696e7400b9030d6c6f67325f6269675f75696e7400ba030b706f775f6269675f696e7400bb030c706f775f6269675f75696e7400bc030f6269675f75696e745f746f5f75363400bd031562696775696e745f6f76657277726974655f75363400bf030d6269675f75696e745f7a65726f00c003136269675f75696e745f66726f6d5f7536345f3100c1031162696775696e745f66726f6d5f7531323800c2031c6269675f75696e745f66726f6d5f6d616e616765645f62756666657200c3030c6269675f696e745f7a65726f00c403126269675f696e745f66726f6d5f6936345f3100c5030f6269675f75696e745f65715f75363400c6030e6269675f696e745f746f5f69363400c70314626967696e745f6f76657277726974655f69363400c803106269675f696e745f746f5f706172747300c903146269675f696e745f66726f6d5f62696775696e7400ca030b6164645f6269675f696e7400cb03146164645f6269675f696e745f6269675f75696e7400cc03146164645f6269675f75696e745f6269675f696e7400cd03186164645f6269675f696e745f6269675f75696e745f72656600ce03186164645f6269675f75696e745f6269675f696e745f72656600cf030f6164645f6269675f696e745f72656600d0030c6164645f6269675f75696e7400d103106164645f6269675f75696e745f72656600d2030b7375625f6269675f696e7400d3030f7375625f6269675f696e745f72656600d4030c7375625f6269675f75696e7400d503107375625f6269675f75696e745f72656600d6030b6d756c5f6269675f696e7400d7030f6d756c5f6269675f696e745f72656600d8030c6d756c5f6269675f75696e7400d903106d756c5f6269675f75696e745f72656600da030b6469765f6269675f696e7400db030f6469765f6269675f696e745f72656600dc030c6469765f6269675f75696e7400dd03106469765f6269675f75696e745f72656600de030b72656d5f6269675f696e7400df030f72656d5f6269675f696e745f72656600e0030c72656d5f6269675f75696e7400e1031072656d5f6269675f75696e745f72656600e203126164645f61737369676e5f6269675f696e7400e303166164645f61737369676e5f6269675f696e745f72656600e403136164645f61737369676e5f6269675f75696e7400e503127375625f61737369676e5f6269675f696e7400e603167375625f61737369676e5f6269675f696e745f72656600e703137375625f61737369676e5f6269675f75696e7400e803126d756c5f61737369676e5f6269675f696e7400e903136d756c5f61737369676e5f6269675f75696e7400ea03126469765f61737369676e5f6269675f696e7400eb03136469765f61737369676e5f6269675f75696e7400ec031272656d5f61737369676e5f6269675f696e7400ed031372656d5f61737369676e5f6269675f75696e7400ee03106269745f616e645f6269675f75696e7400ef03146269745f616e645f6269675f75696e745f72656600f0030f6269745f6f725f6269675f75696e7400f103136269745f6f725f6269675f75696e745f72656600f203106269745f786f725f6269675f75696e7400f303146269745f786f725f6269675f75696e745f72656600f403176269745f616e645f61737369676e5f6269675f75696e7400f503166269745f6f725f61737369676e5f6269675f75696e7400f603176269745f786f725f61737369676e5f6269675f75696e7400f7030c7368725f6269675f75696e7400f803107368725f6269675f75696e745f72656600f9030c73686c5f6269675f75696e7400fa031073686c5f6269675f75696e745f72656600fb03137368725f61737369676e5f6269675f75696e7400fc031373686c5f61737369676e5f6269675f75696e7400fd03136765745f626c6f636b5f74696d657374616d7000fe030f6765745f626c6f636b5f6e6f6e636500ff030f6765745f626c6f636b5f726f756e640080040f6765745f626c6f636b5f65706f6368008104156765745f626c6f636b5f72616e646f6d5f73656564008204186765745f707265765f626c6f636b5f74696d657374616d70008304146765745f707265765f626c6f636b5f6e6f6e6365008404146765745f707265765f626c6f636b5f726f756e64008504146765745f707265765f626c6f636b5f65706f63680086041a6765745f707265765f626c6f636b5f72616e646f6d5f736565640087040a6765745f63616c6c6572008804116765745f6f776e65725f61646472657373008904146765745f73686172645f6f665f61646472657373008a041169735f736d6172745f636f6e7472616374008b04136765745f73746174655f726f6f745f68617368008c040b6765745f74785f68617368008d040c6765745f6761735f6c656674008e041f6765745f63756d756c617465645f76616c696461746f725f72657761726473008f04116765745f636f64655f6d657461646174610090041369735f6275696c74696e5f66756e6374696f6e00910410636f6465635f6572725f66696e69736800920415636f6465635f6572725f73746f726167655f6b657900930415636f6465635f6572725f73746f726167655f67657400940415636f6465635f6572725f73746f726167655f73657400950415636f6465635f6572725f6576656e745f746f70696300960414636f6465635f6572725f6576656e745f6461746100970417636f6465635f6572725f636f6e74726163745f696e697400980417636f6465635f6572725f636f6e74726163745f63616c6c0099040e636f6d707574655f736861323536009a0411636f6d707574655f6b656363616b323536009b0411636f6d707574655f726970656d64313630009c04147665726966795f626c735f7369676e6174757265009d04187665726966795f656432353531395f7369676e6174757265009e041a7665726966795f736563703235366b315f7369676e6174757265009f04217665726966795f637573746f6d5f736563703235366b315f7369676e617475726500a0041f636f6d707574655f736563703235366b315f6465725f7369676e617475726500a104086563686f5f75363400a204086563686f5f69363400a304086563686f5f69333200a404086563686f5f75333200a5040a6563686f5f6973697a6500a604076563686f5f693800a704076563686f5f753800a804096563686f5f626f6f6c00a9040d6563686f5f6f70745f626f6f6c00aa040c6563686f5f6e6f7468696e6700ab040d6563686f5f61727261795f753800ac04146563686f5f6d756c74695f76616c75655f75333200ad04176563686f5f6d756c74695f76616c75655f7475706c657300ae04126563686f5f7365725f6578616d706c655f3200af04106563686f5f73696d706c655f656e756d00b0041c66696e6973685f73696d706c655f656e756d5f76617269616e745f3100b104136563686f5f6e6f6e5f7a65726f5f7573697a6500b2041c6563686f5f736f6d655f617267735f69676e6f72655f6f746865727300b3040d6563686f5f617272617976656300b4040d6563686f5f6269675f75696e7400b5040c6563686f5f6269675f696e7400b604136563686f5f6d616e616765645f62756666657200b704146563686f5f6d616e616765645f6164647265737300b804186563686f5f6269675f696e745f6d616e616765645f76656300b904126563686f5f6269675f696e745f7475706c6500ba04136563686f5f6269675f696e745f6f7074696f6e00bb041b6563686f5f7475706c655f696e746f5f6d756c7469726573756c7400bc041f6563686f5f6d616e616765645f7665635f6f665f6d616e616765645f76656300bd04246563686f5f6d616e616765645f7665635f6f665f746f6b656e5f6964656e74696669657200be041f6563686f5f6d616e616765645f6173796e635f726573756c745f656d70747900bf04176563686f5f7661726167735f6d616e616765645f73756d00c00412636f6d707574655f6765745f76616c75657300c10411636f6d707574655f6372656174655f656300c20415636f6d707574655f6765745f65635f6c656e67746800c30420636f6d707574655f6765745f707269765f6b65795f627974655f6c656e67746800c4040e636f6d707574655f65635f61646400c50411636f6d707574655f65635f646f75626c6500c60416636f6d707574655f69735f6f6e5f63757276655f656300c70413636f6d707574655f7363616c61725f6d756c7400c80418636f6d707574655f7363616c61725f626173655f6d756c7400c90412636f6d707574655f6d61727368616c5f656300ca041d636f6d707574655f6d61727368616c5f636f6d707265737365645f656300cb0414636f6d707574655f756e6d61727368616c5f656300cc041f636f6d707574655f756e6d61727368616c5f636f6d707265737365645f656300cd0417636f6d707574655f67656e65726174655f6b65795f656300ce04096c6f674576656e744100cf040f6c6f674576656e744152657065617400d004096c6f674576656e744200d104136f6e6c795f6f776e65725f656e64706f696e7400d2041a6f6e6c795f757365725f6163636f756e745f656e64706f696e7400d3040e726571756972655f657175616c7300d4040873635f70616e696300d504136d616464726573735f66726f6d5f617272617900d6041c6d616464726573735f66726f6d5f6d616e616765645f62756666657200d7040b6d6275666665725f6e657700d8040e6d6275666665725f636f6e63617400d904126d6275666665725f636f70795f736c69636500da04126d6275666665725f7365745f72616e646f6d00db040a6d6275666665725f657100dc04146d616e616765645f616464726573735f7a65726f00dd04126d616e616765645f616464726573735f657100de040f6d616e616765645f7665635f6e657700df04186d616e616765645f7665635f62696775696e745f7075736800e004166d616e616765645f7665635f62696775696e745f657100e104186d616e616765645f7665635f616464726573735f7075736800e2040f6d616e616765645f7665635f73657400e304126d616e616765645f7665635f72656d6f766500e404106d616e616765645f7665635f66696e6400e504146d616e616765645f7665635f636f6e7461696e7300e604166d616e616765645f7665635f61727261795f7075736800e704146d616e616765645f7265665f6578706c6963697400e8041073746f726167655f726561645f72617700e9041173746f726167655f77726974655f72617700ea041973746f726167655f726561645f66726f6d5f6164647265737300eb040a6c6f61645f627974657300ec040d6c6f61645f6269675f75696e7400ed040c6c6f61645f6269675f696e7400ee04086c6f61645f75363400ef040a6c6f61645f7573697a6500f004086c6f61645f69363400f104096c6f61645f626f6f6c00f204096c6f61645f6164647200f3040d6c6f61645f6f70745f6164647200f4041169735f656d7074795f6f70745f6164647200f5040f6765745f6e725f746f5f636c65617200f60413636c6561725f73746f726167655f76616c756500f7040a6c6f61645f7365725f3200f804096c6f61645f6d61703100f904096c6f61645f6d61703200fa04096c6f61645f6d61703300fb04156c6f61645f66726f6d5f616464726573735f72617700fc040b73746f72655f627974657300fd040e73746f72655f6269675f75696e7400fe040d73746f72655f6269675f696e7400ff040b73746f72655f7573697a650080050973746f72655f6933320081050973746f72655f7536340082050973746f72655f6936340083050a73746f72655f626f6f6c0084050a73746f72655f616464720085050e73746f72655f6f70745f616464720086050b73746f72655f7365725f320087050a73746f72655f6d6170310088050a73746f72655f6d6170320089050a73746f72655f6d617033008a051273746f72655f72657365727665645f693634008b051773746f72655f72657365727665645f6269675f75696e74008c051573746f72655f72657365727665645f7665635f7538008d051b616464726573735f746f5f69645f6d61707065725f6765745f6964008e0524616464726573735f746f5f69645f6d61707065725f6765745f69645f6e6f6e5f7a65726f008f0520616464726573735f746f5f69645f6d61707065725f6765745f616464726573730090051d616464726573735f746f5f69645f6d61707065725f636f6e7461696e7300910518616464726573735f746f5f69645f6d61707065725f73657400920525616464726573735f746f5f69645f6d61707065725f6765745f69645f6f725f696e7365727400930521616464726573735f746f5f69645f6d61707065725f72656d6f76655f62795f696400940526616464726573735f746f5f69645f6d61707065725f72656d6f76655f62795f616464726573730095050d6765744c6973744d6170706572009605126c6973744d6170706572507573684261636b009705136c6973744d61707065725075736846726f6e74009905126c6973744d6170706572506f7046726f6e74009a05116c6973744d6170706572506f704261636b009b050f6c6973744d617070657246726f6e74009c050e6c6973744d61707065724261636b009d05136c6973744d6170706572507573684166746572009e05146c6973744d6170706572507573684265666f7265009f05146c6973744d617070657252656d6f76654e6f646500a005186c6973744d617070657252656d6f76654e6f64654279496400a105126c6973744d617070657253657456616c756500a205166c6973744d617070657253657456616c75654279496400a305176c6973744d617070657249746572617465427948616e6400a405176c6973744d61707065724974657261746542794974657200a5050c71756575655f6d617070657200a6051671756575655f6d61707065725f707573685f6261636b00a7051671756575655f6d61707065725f706f705f66726f6e7400a8051271756575655f6d61707065725f66726f6e7400a9050a6d61705f6d617070657200aa050f6d61705f6d61707065725f6b65797300ab05116d61705f6d61707065725f76616c75657300ac05116d61705f6d61707065725f696e7365727400ad05176d61705f6d61707065725f636f6e7461696e735f6b657900ae050e6d61705f6d61707065725f67657400af05116d61705f6d61707065725f72656d6f766500b0052c6d61705f6d61707065725f656e7472795f6f725f64656661756c745f7570646174655f696e6372656d656e7400b105226d61705f6d61707065725f656e7472795f6f725f696e736572745f64656661756c7400b2051b6d61705f6d61707065725f656e7472795f616e645f6d6f6469667900b305236d61705f6d61707065725f656e7472795f6f725f696e736572745f776974685f6b657900b405176d61705f73746f726167655f6d61707065725f7669657700b505216d61705f73746f726167655f6d61707065725f696e736572745f64656661756c7400b6051f6d61705f73746f726167655f6d61707065725f636f6e7461696e735f6b657900b705166d61705f73746f726167655f6d61707065725f67657400b8051f6d61705f73746f726167655f6d61707065725f696e736572745f76616c756500b9051c6d61705f73746f726167655f6d61707065725f6765745f76616c756500ba05196d61705f73746f726167655f6d61707065725f72656d6f766500bb05186d61705f73746f726167655f6d61707065725f636c65617200bc05346d61705f73746f726167655f6d61707065725f656e7472795f6f725f64656661756c745f7570646174655f696e6372656d656e7400bd05386d61705f73746f726167655f6d61707065725f656e7472795f616e645f6d6f646966795f696e6372656d656e745f6f725f64656661756c7400be052a6d61705f73746f726167655f6d61707065725f656e7472795f6f725f64656661756c745f75706461746500bf050a7365745f6d617070657200c005117365745f6d61707065725f696e7365727400c105137365745f6d61707065725f636f6e7461696e7300c205117365745f6d61707065725f72656d6f766500c3051a6d61705f6d795f73696e676c655f76616c75655f6d617070657200c405226d795f73696e676c655f76616c75655f6d61707065725f696e6372656d656e745f3100c505226d795f73696e676c655f76616c75655f6d61707065725f696e6372656d656e745f3200c6052c6d795f73696e676c655f76616c75655f6d61707065725f73756274726163745f776974685f7265717569726500c705236d795f73696e676c655f76616c75655f6d61707065725f7365745f69665f656d70747900c80519636c6561725f73696e676c655f76616c75655f6d617070657200c905246765745f66726f6d5f616464726573735f73696e676c655f76616c75655f6d617070657200ca052769735f656d7074795f61745f616464726573735f73696e676c655f76616c75655f6d617070657200cb05237261775f627974655f6c656e6774685f73696e676c655f76616c75655f6d617070657200cc050a7665635f6d617070657200cd050f7665635f6d61707065725f7075736800ce050e7665635f6d61707065725f67657400cf05197665635f6d61707065725f6765745f61745f6164647265737300d0050e7665635f6d61707065725f6c656e00d105197665635f6d61707065725f6c656e5f61745f6164647265737300d20514746f6b656e5f617474726962757465735f73657400d30517746f6b656e5f617474726962757465735f75706461746500d4051f746f6b656e5f617474726962757465735f6765745f6174747269627574657300d5051a746f6b656e5f617474726962757465735f6765745f6e6f6e636500d60516746f6b656e5f617474726962757465735f636c65617200d7051f746f6b656e5f617474726962757465735f6861735f6174747269627574657300d805106164645f746f5f77686974656c69737400d9051572656d6f76655f66726f6d5f77686974656c69737400da050e636865636b5f636f6e7461696e7300db0519636865636b5f636f6e7461696e735f61745f6164647265737300dc0510726571756972655f636f6e7461696e7300dd051b726571756972655f636f6e7461696e735f61745f6164647265737300de051f69737375655f66756e6769626c655f64656661756c745f63616c6c6261636b00df051e69737375655f66756e6769626c655f637573746f6d5f63616c6c6261636b00e0052069737375655f616e645f7365745f616c6c5f726f6c65735f66756e6769626c6500e105187365745f6c6f63616c5f726f6c65735f66756e6769626c6500e2050d6d696e745f66756e6769626c6500e305166d696e745f616e645f73656e645f66756e6769626c6500e4050d6275726e5f66756e6769626c6500e505146765745f62616c616e63655f66756e6769626c6500e6051b726571756972655f73616d655f746f6b656e5f66756e6769626c6500e7051f726571756972655f616c6c5f73616d655f746f6b656e5f66756e6769626c6500e8051267657446756e6769626c65546f6b656e496400e9051c69737375655f616e645f7365745f616c6c5f726f6c65735f6d65746100ea05176d61707065725f6e66745f7365745f746f6b656e5f696400eb05116d61707065725f6e66745f63726561746500ec051a6d61707065725f6e66745f6372656174655f616e645f73656e6400ed05176d61707065725f6e66745f6164645f7175616e7469747900ee05206d61707065725f6e66745f6164645f7175616e746974795f616e645f73656e6400ef050f6d61707065725f6e66745f6275726e00f005166d61707065725f6e66745f6765745f62616c616e636500f1051b6d61707065725f6765745f746f6b656e5f6174747269627574657300f205156765744e6f6e46756e6769626c65546f6b656e496400f30515696e69745f756e697175655f69645f6d617070657200f40514756e697175655f69645f6d61707065725f67657400f5051c756e697175655f69645f6d61707065725f737761705f72656d6f766500f60514756e697175655f69645f6d61707065725f73657400f70510756e697175655f69645f6d617070657200f805116d616e616765645f7374727563745f657100f9050c6f766572666c6f775f75313600fa050f6e6f5f6f766572666c6f775f69313600fb050c6f766572666c6f775f69313600fc0515746f6b656e5f6964656e7469666965725f65676c6400fd051b746f6b656e5f6964656e7469666965725f69735f76616c69645f3100fe051b746f6b656e5f6964656e7469666965725f69735f76616c69645f3200ff05136e6f6e5f7a65726f5f7573697a655f69746572008006146e6f6e5f7a65726f5f7573697a655f6d6163726f008106147365745f636f6e74726163745f616464726573730082061369735f656d7074795f61745f6164647265737300830613636f6e7461696e735f61745f616464726573730084060e6c656e5f61745f616464726573730085060f66696c6c5f7365745f6d61707065720086060863616c6c4261636b008706196563686f5f7661726167735f6d616e616765645f656167657200ad04136269675f75696e745f66726f6d5f7536345f3200c103126269675f696e745f66726f6d5f6936345f3200c5031c69735f656d7074795f73696e676c655f76616c75655f6d617070657200ca050e6f766572666c6f775f7573697a6500fa050b6f766572666c6f775f753800fa050c6f766572666c6f775f75333200fa050c6f766572666c6f775f75363400fa050e6f766572666c6f775f6973697a6500fc050b6f766572666c6f775f693800fc050c6f766572666c6f775f69333200fc050c6f766572666c6f775f69363400fc050a6563686f5f7573697a6500a504116c6f67325f6269675f75696e745f72656600ba03176164645f61737369676e5f6269675f75696e745f72656600e503177375625f61737369676e5f6269675f75696e745f72656600e803166d756c5f61737369676e5f6269675f696e745f72656600e903176d756c5f61737369676e5f6269675f75696e745f72656600ea03166469765f61737369676e5f6269675f696e745f72656600eb03176469765f61737369676e5f6269675f75696e745f72656600ec031672656d5f61737369676e5f6269675f696e745f72656600ed031772656d5f61737369676e5f6269675f75696e745f72656600ee031b6269745f616e645f61737369676e5f6269675f75696e745f72656600f5031a6269745f6f725f61737369676e5f6269675f75696e745f72656600f6031b6269745f786f725f61737369676e5f6269675f75696e745f72656600f703177368725f61737369676e5f6269675f75696e745f72656600fc031773686c5f61737369676e5f6269675f75696e745f72656600fd0311737172745f6269675f75696e745f72656600b903206269675f75696e745f66726f6d5f6d616e616765645f6275666665725f72656600c303116e6f5f6f766572666c6f775f7573697a6500fb050e6e6f5f6f766572666c6f775f753800fb050f6e6f5f6f766572666c6f775f75333200fb050f6e6f5f6f766572666c6f775f75363400fb050f6e6f5f6f766572666c6f775f75313600fb05116e6f5f6f766572666c6f775f6973697a6500fb050e6e6f5f6f766572666c6f775f693800fb050f6e6f5f6f766572666c6f775f69333200fb050f6e6f5f6f766572666c6f775f69363400fb050f706f775f6269675f696e745f72656600bb0310706f775f6269675f75696e745f72656600bc030a5f5f646174615f656e6403010b5f5f686561705f6261736503020ae3e8029d050a0041808008410f106f0b1101017f107122022000200110241a20020b1601017f1071220142001001200120012000100220010b2701027f41b09808280200220141016b2200200148044041b09808200036020020000f0b1076000b0d0020004116418f8008108a060b7301027f230041106b22022400027f410020011095012201108e020d001a2001101241074604402002410036000b2002410036020820014100200241086a2203410710a8011a41012003410741e78f08410710d0010d011a0b41020b21032000200136020420002003360200200241106a24000b0900200020011003000b2e000240200120024d0440200220044d0d011076000b1076000b2000200220016b3602042000200120036a3602000b060010b603000b0f01017f10042201200010051a20010b0b0020002001100641004a0b1100200041024f0440200110771a0b20000b5b01037f230041106b2203240020012802042202047f200341086a200128020022042802002002107b2001200328020c36020420042802002002107c210241010541000b21012000200236020420002001360200200341106a24000b820101027f230041206b220324002003410c6a2204200141c98708410b200210cc02109401200410d30221012003410c6a10d3022102200328020c200328021010c40104402003411c6a2d0000044041c4e608410036020041c8e60841003a00000b2000200236020420002001360200200341206a24000f0b41a58008410e10ff01000b1200200041d487084106200110cc02109f020b0f002000200141db8008411b107e000b160020002001106f220020022003100e1a20001000000b820101017f230041306b2202240020002001280200047f200241286a2001410c6a2902003702002002410136021c200220012902043702202002410c6a2002411c6a10800120012001280214280200200241146a22012802001081012000410c6a20012902003702002000200229020c37020441010541000b360200200241306a24000b280020012802004504401076000b20002001290204370200200041086a2001410c6a2902003702000b2401017f20002001200210dd02047f410005200041046a2001200210de0241010b3602000b7001027f230041106b22022400200241086a2001107a20002002280208410146047f200220012802082201280200200141086a280200200228020c2201108301200228020421032002280200108401200041086a20033602002000200136020441010541000b360200200241106a24000b2a002001200310ba02047f2002200310b902210341010541000b210120002003360204200020013602000b0b0020004504401076000b0b0c002001200010860110071a0b0f01017f107122012000102e1a20010b6f01027f230041106b220124002000027f41c8e6082d0000220245044041c8e60841013a000041c4e6084100360200200141086a41001088012001280208200128020c41d894084100108901108a010c010b41d894084100106f0b360200200020024101733a0004200141106a24000b3e01017f230041106b22022400200241086a41b498084190ce00200110fb01200228020c21012000200228020836020020002001360204200241106a24000bb50201067f200120034604402001220341104f04402000410020006b41037122046a210520040440200221010340200020012d00003a0000200141016a2101200041016a22002005490d000b0b2005200320046b2203417c7122066a21000240200220046a22044103710440200641004c0d012004410374220141187121072004417c71220841046a2102410020016b4118712109200828020021010340200520012007762002280200220120097472360200200241046a2102200541046a22052000490d000b0c010b200641004c0d0020042102034020052002280200360200200241046a2102200541046a22052000490d000b0b20034103712103200420066a21020b20030440200020036a21010340200020022d00003a0000200241016a2102200041016a22002001490d000b0b0f0b1076000b1301017f1071220041d89408410010241a20000b0c0020002001108c0110081a0b4901017f230041106b22022400200220013a000c20022000360208200241086a109d02200228020820022d000c044041c4e608410036020041c8e60841003a00000b200241106a24000b0c0020002001108e01108f010b0d0020001071220010181a20000b3301017f200110122102200041106a41003a00002000410c6a20023602002000200136020820002002360204200041003602000b0c00200010910120011092010b0f01017f107122012000102b1a20010b5101027f230041106b22022400200220001012220341187420034180fe03714108747220034108764180fe03712003411876727236020c20012002410c6a410410f7012001200010e401200241106a24000b0c00200010860120011092010b0c0020002001109501108f010b0d0020001071220010321a20000b3b01017f230041106b22032400200341086a20011095012002109701200328020c21012000200328020836020020002001360204200341106a24000b5b01027f230041106b2203240020011012220441084d0440200341086a2002200410fe012001410020032802082201200328020c220210a8011a2000200236020420002001360200200341106a24000f0b41a58008410e10ff01000b0900200020011074000be90101047f108a012106108a012107230041106b22042400108a0121052001107721012003107021032004200242388620024280fe0383422886842002428080fc0783421886200242808080f80f834208868484200242088842808080f80f832002421888428080fc07838420024228884280fe038320024238888484843702042004200141187420014180fe03714108747220014108764180fe0371200141187672723602002004200341187420034180fe03714108747220034108764180fe03712003411876727236020c200520044110100e1a20002005420020062007100f1a200441106a24000b150020002001200241ba8108410b41ad81081089060b0f00108a011a20002001107710b3010b1501017f108a012202200110fc012000200210b3010b1000108a011a2000200110860110b3010b1d004167100a200041674200100b2001200210712201100c1a100d20010b150020002001200241d28108411241c581081089060b0c01017f10712200101020000b0c01017f10712200101120000b2e01027f10712103200110122104200010a301200141f5e60810131a41d5e60841f5e608200420022003101420030b0b00200041d5e60810131a0b0c01017f10712200101520000b2b01017f41d0e6082d000022000440417541ffffffff0720001b0f0b41d0e60841013a00004175101641750bbd01020a7f017e230041206b22012400024010a701220410124170714110460440200410122105200141106a2106410121030340200241106a220720054b0d02200642003703002001420037030820042002200141086a2202411010a8011a2001410036021c200320022001411c6a220310a90121092002200310aa01210b2002200310a901210a20072102410021030d000b10b603000b4191820841221003000b2000200a36020c200020093602082000200b370300200141206a24000b2b01017f41d4e6082d000022000440416b41ffffffff0720001b0f0b41d4e60841013a0000416b1017416b0b0f002000200120032002106c4100470b7f01037f230041106b220224002002410036020c2001280200220341046a220420034904401076000b2002200320042000411010752002410c6a41042002280200200228020410890120012004360200200228020c2100200241106a2400200041187420004180fe03714108747220004108764180fe0371200041187672720bb30102017e037f230041106b22032400200342003703082001280200220441086a220520044904401076000b200320042005200041101075200341086a4108200328020020032802041089012001200536020020032903082102200341106a2400200242388620024280fe0383422886842002428080fc0783421886200242808080f80f834208868484200242088842808080f80f832002421888428080fc07838420024228884280fe038320024238888484840b2e01017f41b382084117106f220420002001100e1a200441ca82084103100e1a200420022003100e1a20041000000b120010194504400f0b41cd820841251003000b3001017f2000280200220341cce6082802004e04402001200241f28208411110ab01000b2000200341016a36020020030b2c01017e2000101d22034280808080087d42ffffffff6f5804402001200241a99008411210ab01000b2003a70b5d01027f027f410020012002200310b001220445200441ebde0146720d001a200128020041cce6082802004e0440108a01210541010c010b20012002200310b101210541010b21012000200536020820002004360204200020013602000b120020002001200210ad012001200210bb010b0e0020002001200210ad01108e010b2f01017f108a0121030340200028020041cce6082802004e450440200320002001200210b10110b3010c010b0b20030b4601017f230041106b220224002002200141187420014180fe03714108747220014108764180fe03712001411876727236020c20002002410c6a4104100e1a200241106a24000b21002000108e012200101241204704402001200241ee8f08411010ab01000b20000b2b00200041bb9008410e10b601107722001012412047044041bb9008410e41ee8f08411010ab01000b20000b5e01027f230041106b22032400200341086a200028020020002802082204109902024020032802084101460440200441016a22010d011076000b2001200241f28208411110ab01000b200328020c200020013602081077200341106a24000b0d00200041bb8e08410b10b8010b0d0020002001200210b60110770ba70101027f230041106b22022400027f200141b98f08410610b001220341ebde0147410020031b450440200141b98f08410610ad01108e0121012002410036020441040c010b027f200128020041cce6082802004e0440108a010c010b200141b98f08410610b1010b2101200220033602082002410136020441080b200241046a6a200136020020002002290204370200200041086a2002410c6a280200360200200241106a24000b0b0020002001200210bb010b2601017e2000101b220342ffffffff0f5804402003a70f0b2001200241a58008410e10ab01000b1300200020014d0440200120006b0f0b1076000b6101027f230041106b22042400200441086a2000280208200028020022052001108202024020042802084101460440200120056a220120054f0d011076000b2002200341d18508410f10ab01000b200428020c20002001360200200441106a24000b2301017e2000101b220342ff015804402003a70f0b2001200241a58008410e10ab01000bde0102037f017e230041206b22022400200241046a22032001108d01200341cb8f08410a10c0012104200242003703182003200241186a2201410841cb8f08410a10c10120014108410010c2012105200341cb8f08410a10c3012101108a0121030340200104402003200241046a41cb8f08410a10c30110b301200141016b21010c010b0b2002280204200228020810c4010440200241146a2d0000044041c4e608410036020041c8e60841003a00000b2000200336020c2000200436020820002005370300200241206a24000f0b41cb8f08410a41a58008410e10ab01000b0e0020002001200210c7011081020b43000240200041086a200028020020012002109b024504402000280200220120026a220220014f0d011076000b2003200441d18508410f10ab01000b200020023602000b4401017e02402001450d002002044020002c0000410775ac21030b03402001450d01200141016b210120003100002003420886842103200041016a21000c000b000b20030b3902017f017e230041106b220324002003410036020c20002003410c6a220041042001200210c10120004104410010c201200341106a2400a70b0a002000200110bc01450b0d00410041dc8d08410110ae010b3001017f230041106b22032400200341003a000f20002003410f6a41012001200210c10120032d000f200341106a24000b1400200020002001200210c3012001200210bd010b0b0020002001200210b4010b1000200041cb8b08410110c7011080020ba10101037f230041206b220124002001410c6a22022000108d01200241cb8f08410a10c60121002001410c6a41cb8f08410a10c60121022001410c6a41cb8f08410a10c6012103200128020c200128021010c40104402001411c6a2d0000044041c4e608410036020041c8e60841003a00000b200141206a2400200041ff01712003411074200241ff017141087472720f0b41cb8f08410a41a58008410e10ab01000b0c00200010712200101c20000b1f01017f230041106b220124002000450440200141106a24000f0b10b603000b3301017e027f02402000101b2202420158044041002002a741016b0d021a0c010b2001410141a99008411210ab01000b41010b0b2601017e4100101d22024280017d42ff7d5804402000200141a99008411210ab01000b2002a70bfa0102027f017e230041206b22032400024002404100101a450d002003410c6a22044100108d010240024002400240024020042001200210c60141ff017122040e0404010203000b2001200241b38008410d10ab01000b2003410c6a2001200210c301ad2105410121040c020b2003410c6a2001200210c301ad2003410c6a2001200210c301ad422086842105410221040c010b2003410c6a2001200210c301ad2105410321040b200328020c200328021010c401450d012003411c6a2d0000450d0041c4e608410036020041c8e60841003a00000b2000200537020420002004360200200341206a24000f0b2001200241a58008410e10ab01000b5301027f2001200346047f4100210302402001450d00034020002d0000220420022d00002205460440200041016a2100200241016a2102200141016b22010d010c020b0b200420056b21030b20030541010b450b9a0101047f230041206b220324002000108e012104108a0121052004101221002003411c6a41003a0000200341186a200036020020032004360214200320003602102003410036020c037f2006200010bc01047f20052003410c6a2001200210c00110b30120032802102100200328020c21060c010520032d001c044041c4e608410036020041c8e60841003a00000b200341206a240020050b0b0b920101037f230041206b220324002003410c6a22042001108d0120042002410210c001210120042002410210c301210520042002410210c7012104200328020c200328021010c40104402003411c6a2d0000044041c4e608410036020041c8e60841003a00000b200020043602082000200536020420002001360200200341206a24000f0b2002410241a58008410e10ab01000b0c00200010712200101e20000be20102057f017e230041206b2204240020042001108d01200441186a21074105210103402001044020042002200310c6012106200541044b2208450440200520076a20063a0000200541016a21050b200810cc01200141016b21010c01050240200541054f0d002002200341869008411210ab01000b0b0b200429021821092004280200200428020410c4010440200441106a2d0000044041c4e608410036020041c8e60841003a00000b20002009a722013b0000200020094218883d0003200041026a20014110763a0000200441206a24000f0b2002200341a58008410e10ab01000b1900200041cce6082802004e04400f0b4183830841121003000b1400200020014d04400f0b4183830841121003000b1400101f20004604400f0b4195830841191003000b1900200041cce6082802004c04400f0b41f2820841111003000b0b0041cce608101f3602000b2001017f200110db0121022000410036020820002002360204200020013602000b0900200010124102760bab0101047f230041206b22012400200141086a108701200120012d000c3a00182001200128020836021420001012210402400340200241046a22032002490d01200320044d04402001410036021c200020022001411c6a410410dd011a200128021c220241187420024180fe03714108747220024108764180fe037120024118767272200141146a109301200321020c010b0b200128021420012d0018108b01200141206a24000f0b1076000b0d00200020012002200310a8010b5d01027f230041106b220124002001108701200120012d00043a000c200120012802003602082000280208200141086a22021092012000290300200210df01200028020c2002109301200128020820012d000c108b01200141106a24000b7801017f230041106b220224002002200042388620004280fe0383422886842000428080fc0783421886200042808080f80f834208868484200042088842808080f80f832000421888428080fc07838420004228884280fe038320004238888484843703082001200241086a410810f701200241106a24000b0d0020004504402001ad10200b0b0a0020001021200110210b6001017f230041106b220224000240200045044041d89408410010220c010b2002108701200220022d00043a000c20022002280200360208200241086a2200410110e3012000200110e401200228020820022d000c108b010b200241106a24000b2701017f230041106b22022400200220013a000f20002002410f6a410110f701200241106a24000b8b0101027f230041106b220324000240024020002d000404402001101221021099032002490d0141c4e608280200220020026a220220004f0440200341086a20002002109a03200141002003280208200328020c10dd011a41c4e60820023602000c030b1076000b20002802002001108d020c010b2000109d0220002802002001108d020b200341106a24000b5001017f230041206b2201240020012000280200101236021c20014100360218200120003602140340200141086a200141146a10e60120012802080440200128020c10081a0c010b0b200141206a24000b9c0101047f230041106b22032400027f02402001280204220241046a220420024f0440200420012802084d0d0141000c020b1076000b20012802002003410036020c28020020022003410c6a410410dd011a200328020c210220012004360204200241187420024180fe03714108747220024108764180fe037120024118767272210241010b21012000200236020420002001360200200341106a24000bff0101027f230041206b2201240002400240024002400240200028020041016b0e03010203000b420010200c030b2001108701200120012d00043a001c20012001280200360218200141186a2202410110e3012000280204200210e801200128021820012d001c108b010c020b200141086a108701200120012d000c3a001c20012001280208360218200141186a2202410210e3012000280204200210e8012000280208200210e801200128021820012d001c108b010c010b200141106a108701200120012d00143a001c20012001280210360218200141186a2202410310e3012000280204200210e801200128021820012d001c108b010b200141206a24000b4601017f230041106b220224002002200041187420004180fe03714108747220004108764180fe03712000411876727236020c20012002410c6a410410f701200241106a24000b2a00200028020004402000280204200041086a2802001074000b2000280204200041086a28020010ea010b6001017f230041106b220224000240200045044041d89408410010220c010b2002108701200220022d00043a000c20022002280200360208200241086a2200410110e3012001200010e801200228020820022d000c108b010b200241106a24000b7b01027f230041106b220124002001108701200120012d00043a000c200120012802003602082000280200200141086a22021093012000280204200210930120002802082002109301200028020c2002109301200028021020021093012000280214200210e801200128020820012d000c108b01200141106a24000b20002000200120021023200010ed0141ff017104400f0b41cc830841301003000b1500410241012000106b22001b4100200041004e1b0b220020002001200210ef0120004181840841fc830820031b4104410520031b10ef010b0d00200020012002106f10b3010b080020004120106f0b2b0020022003106f2102108a0121032000427f3703082000200336020420002002360200200020013602100b1601017f108a0122022001ad10fc012000200210b3010bbc0101027f230041206b22052400200541e3840810f00141908508411610f101200541186a22062001360200200528020422012002109b0120002005290308370308200041106a200541106a290300370300200041186a20062903003703002005280200210220012003109b01200441ff0171410274220341f093086a28020021042003418494086a2802002103108a0122062003200410241a2001200610b3012001410010f2012000200136020420002002360200200541206a24000bc90101057f230041306b2201240020002802102202044010f501200141106a108701200120012d00143a00202001200128021036021c200041146a28020022032001411c6a220410f60120042002200310f701200041186a2202280200220310db01200410f60120012003101236022c20014100360228200120023602240340200141086a200141246a10e60120012802080440200128020c2001411c6a1092010c010b0b200128021c20012d002010f8010b2000280208200028020c20002802002000280204106d000b1a01027f10a101210041c78508410a106f2201200010051a20010b09002000200110e8010b880101027f230041106b220324000240024020002d000404401099032002490d0141c4e608280200220020026a220420004f0440200341086a20002004109a032003280208200328020c2001200210890141c4e60820043602000c030b1076000b200028020020012002100e1a0c010b2000109d02200028020020012002100e1a0b200341106a24000b0e00200020012002108c0110071a0b4301027f230041106b2203240020022000280220460440200341086a410020022000412010752003280208200328020c2001200210d00121040b200341106a240020040b9e0101057f230041306b22022400200241286a22034200370300200241206a22044200370300200241186a2205420037030020024200370310200241086a200241106a412020011012220610fb01200141002002280208200228020c10dd011a20002006360220200041186a2003290300370000200041106a2004290300370000200041086a200529030037000020002002290310370000200241306a24000b3b01017f230041106b22042400200441086a41002003200120021075200428020c21012000200428020836020020002001360204200441106a24000b3801017f230041106b2202240020024200370308200220014100200241086a109f0320002002280200200228020410241a200241106a24000b6101027f230041106b2203240020011012220441084d0440200341086a2002200410fe012001410020032802082201200328020c220210a8011a2000200236020420002001360200200341106a24000f0b41fe8f08410841a58008410e10ab01000b3a01017f230041106b22032400200341086a20014108200210fb01200328020c21012000200328020836020020002001360204200341106a24000b1a01017f41b58b084116106f220220002001100e1a20021000000b0d00200010712200102c1a20000b0d00200010712200102f1a20000b1f0020012002200310042201102821022000200136020420002002453602000b5d01027f230041106b22022400200241086a2000280208200028020022032001108202024020022802084101460440200120036a220120034f0d011076000b41d18508410f10ff01000b200228020c20002001360200200241106a24000b0b00200020012002100e1a0b0900200120001086020b1601017f108a0122022000ad10fc012001200210b3010b1e002001500440200010ed0141016b0f0b417220011001200041721088020b1500417f200020011035220041004720004100481b0b15002000420053044041e0850841111003000b20000b0e002000200110880241ff0171450b5301057f20014200100b22024200100b22034200100b22044200100b22054200100b220610251a200020011026360214200020063602102000200536020c2000200436020820002003360204200020023602000b5c01017f027f027f41f18508200141e001460d001a2001418904470440200141800347044041002001418002470d031a41f585080c020b41f985080c010b41fd85080b41041027210241010b210120002002360204200020013602000b09002000200110051a0b070020001012450b0c00200020002001100220000b1001017f1071220220002001100220020b0a0020002000200110020b0a0020002000200110230b1301017f1071220220002001109402102d20020b0b0041722000ad100141720b0e01017f107122004200100120000b0b002000200110890210010bb40101077f230041106b2204240020011012210703400240027f02402008220541ffffffff03470440200641046a220920074d0d0141000c020b1076000b2004410036020c200120062004410c6a410410dd011a200428020c220341187420034180fe03714108747220034108764180fe0371200341187672722002108a02450d012005210341010b21012000200336020420002001360200200441106a24000f0b200541016a210820092106200521030c000b000b5301017f230041106b2204240020034102742203200241027422024f0440200441086a20012002200320026b108202200428020c21012000200428020836020020002001360204200441106a24000f0b1076000b7501017f230041106b22032400200241ffffffff034d04402003410036020c200120024102742003410c6a410410dd012102200328020c2101200020024101733602002000200141187420014180fe03714108747220014108764180fe037120014118767272360204200341106a24000f0b1076000b0900200010314100470bc50101037f230041106b220424000240027f024020002d000845044020002802002205101222064190ce004b0d0141c8e6082d00000d0141c4e608200636020041c8e60841013a0000200441086a2006108801200541002004280208200428020c10dd011a200041013a00080b200120036a22002001490d024101200041c4e6082802004b0d011a200420012000109c02200220032004280200200428020410890141000c010b200041003a0008200520012002200310dd010b200441106a24000f0b1076000b32000240200120024d044020024190ce004d0d011076000b1076000b2000200220016b3602042000200141b498086a3602000b5801027f230041106b2201240020002d0004200041003a00040440200141086a410041c4e608280200109c0220002802002001280208200128020c100e1a41c4e608410036020041c8e60841003a00000b200141106a24000b0a0020001095011080020b2201017e200010a00222014280808080105a044041a58008410e10ff01000b2001a70b3802017f017e230041106b220124002001420037030820012000200141086a10960120012802002001280204410010c201200141106a24000b1d00200010950122001012412047044041ee8f08411010ff01000b20000b3001017e027f0240200010a0022201420158044041002001a741016b0d021a0c010b41a99008411210ff01000b41010b0b0a0020001095011081020b1f01017e200010a00222014280025a044041a58008410e10ff01000b2001a70b0d002000416710321a416710120b09002000200110a7020b09002000200110071a0b3400024002400240200141016b0e020102000b41d894084100200010a9020f0b41e78f084107200010a9020f0b2000200210a7020b0b0020022000200110ab020b0d00200041d89408410010ab020b0d00200020012002106f10071a0b0c002000200110910110071a0b1400416c41d89408410010241a2000416c10071a0b2401017e2000200110af0222024280808080105a044041a58008410e10ff01000b2002a70b3d02017f017e230041106b220224002002420037030820022000200110b202200241086a10970120022802002002280204410010c201200241106a24000b09002000200110b1020b0e002000200141671033416710120b0e002000200110712200103320000b0c002000200110b40210ad020b1a0020001077220041b587084107100e1a2001200010b80220000b5602037f017e230041106b22042400200441086a20012802002205200128020822062002108301200429030821072006200210b4022003ad10b60220052001280204200210b7021a20002007370300200441106a24000b0b002000200141001088060b2c01017f2000200210ba0222034504402001200210c20221012000200210c1022001ad10b6020b20034101730b4601017f230041106b220224002002200041187420004180fe03714108747220004108764180fe03712000411876727236020c20012002410c6a4104108402200241106a24000b0c002000200110b402109f020b0c002000200110c4024100470b2801017f2001280200200210ba022103200041086a200236020020002001360204200020033602000b3801017f230041106b22022400200241086a2000280200200041086a2802002001108301200228020c2002280208108401200241106a24000b5601037f230041106b22022400200141086a28020021042001280204210320002001280200047f200405200241086a20032004410010be0220022802082103200228020c0b36020420002003360200200241106a24000b3001017f230041106b22042400200441086a20012002200310b5022000200136020020002002360204200441106a24000b2801017f20011077210320002002107736020c2000200336020820002002360204200020013602000b0c002000200110c10210aa020b1a0020001077220041bc87084108100e1a2001200010b80220000bb10101047f230041206b22022400200241106a200010ce020240200228021c41016a220304402002200336021c024020022802102205450440200220033602140c010b200241086a200020022802182204107b200020042002280208200310cf020b200020032004410010cf0220022003360218200041d487084106200310cc022001ad10b602200541016a22010d011076000b1076000b200220013602102000200241106a10d002200241206a240020030b3801027f230041106b220324002000200210c40222040440200341086a2001200410c5022000200210c0020b200341106a240020044100470b0c002000200110c102109f020be00101037f230041306b2203240002402002047f200341186a20012002107b200328021c210420032802182105200341206a200110ce02024020050440200341106a20012005107b200120052003280210200410cf020c010b200320043602240b024020040440200341086a20012004107b200120042005200328020c10cf020c010b200320053602280b2001200210cb0220012002107c21042001200210cd0220032802202202450d012003200241016b3602202001200341206a10d00241010541000b21012000200436020420002001360200200341306a24000f0b1076000b0c002000200110c702109f020b1a0020001077220041c487084105100e1a2001200010ca0220000b2401017e2001200010af0222024280808080105a044041a58008410e10ff01000b2002a70b2b0002402002450d002001109f022002490d002000200210c7022003ad10b6020f0b41eb950841121003000b09002000200110b8020b1200200041c98708410b200110cc0210aa020b180020001077220020012002100e1a2003200010b80220000b1200200041d487084106200110cc0210aa020bb30101047f230041206b2202240002400240200110d102220110a502450440410021010c010b2002410c6a22032001109401200310d30221012002410c6a10d30221032002410c6a10d30221042002410c6a10d3022105200228020c200228021010c401450d012002411c6a2d0000450d0041c4e608410036020041c8e60841003a00000b2000200536020c200020043602082000200336020420002001360200200241206a24000f0b41a58008410e10ff01000b5a01017f230041106b22042400200041c98708410b200110cc022004108701200420042d00043a000c200420042802003602082002200441086a220110e8012003200110e801200428020820042d000c10f801200441106a24000b870101027f230041106b22022400200010d102210002402001280200220304402002108701200220022d00043a000c200220022802003602082003200241086a220310e8012001280204200310e8012001280208200310e801200128020c200310e8012000200228020820022d000c10f8010c010b200041d89408410010ab020b200241106a24000b130020001077220041da87084105100e1a20000b2f01017f230041106b220224002002200128020010ce022000200228020436020420002001360200200241106a24000b3502017f017e230041106b220124002001410036020c20002001410c6a2200410410870320004104410010c201200141106a2400a70bed0101037f230041206b2203240020021077220241da87084105100e1a024002402001200210b10245044041002101410021020c010b2001200210b2022202101221012003411c6a41003a0000200341186a200136020020032002360214200320013602102003410036020c2003410c6a10d30221012003410c6a10d30221022003410c6a10d30221042003410c6a10d3022105200328020c200328021010c401450d0120032d001c450d0041c4e608410036020041c8e60841003a00000b2000200536020c200020043602082000200236020420002001360200200341206a24000f0b41a58008410e10ff01000b190020001077220041ee87084104100e1a20002001ad10b6020b2f0002402002450d002001109f022002490d002000200210c702109f022200200220001b0f0b41eb950841121003000b15002000200120022003410020022003471b10c9020b110020012000200210d90210b0024100470b0f00200120001077220010da0220000b5101027f230041106b22022400200220001012220341187420034180fe03714108747220034108764180fe03712003411876727236020c20012002410c6a410410840220012000108d02200241106a24000b0f002000200110d90210a5024100470bc80101047f230041206b22022400024020002001280204220510dd024504402002200010ce020240200128020c22030440200241106a22042000200310de0220022001280208220136021820002003200410df020c010b2002200128020822013602040b024020010440200241106a22042000200110de022002200336021c20002001200410df020c010b200220033602080b2000200510e0024101410010ab0220022802002201450d012002200141016b3602002000200210d0020b200241206a24000f0b1076000b0d002000200110e00210a502450b9e0101037f230041206b220324002003410c6a22042001200210e002109401200410d30221012003410c6a10d30221022003410c6a10d30221042003410c6a10d3022105200328020c200328021010c40104402003411c6a2d0000044041c4e608410036020041c8e60841003a00000b2000200536020c200020043602082000200236020420002001360200200341206a24000f0b41a58008410e10ff01000b6e01017f230041106b220324002000200110e0022003108701200320032d00043a000c200320032802003602082002280200200341086a220110e8012002280204200110e8012002280208200110e801200228020c200110e801200328020820032d000c10f801200341106a24000b1a0020001077220041f287084105100e1a2001200010b80220000b2401017f20002001280204220310dd024504402001200236020020002003200110df020b0b6301027f230041306b2203240020002001200210dd02047f4100052003411c6a2204200120021081012003410c6a220220041080012001200210dc022000410c6a200341146a2902003702002000200329020c37020441010b360200200341306a24000b2701017f230041106b220224002002200110ce02200020012002280204108101200241106a24000b2f01017f230041106b2203240020032001280200200141086a280200200210e5022000200310e602200341106a24000b2401017f20002001200310ba02047f200041046a2002200310e70241010541000b3602000b280020012802004504401076000b20002001290204370200200041086a2001410c6a2802003602000b1f0020011077220141f787084108100e1a2002200110b8022000200110e8020b3501027f230041106b22022400200110772103200241086a20011097032000200229030837020020002003360208200241106a24000b3f01027f200141086a28020021032001280204210220012802004504402002280200200241046a280200200310b7021a0b20002003360204200020023602000b09002000420110eb020b0b002000200141011088060b09002000200110ac020b0800200010a502450b2f01017f2001200210ef02220110a502047f200110a102210141010541000b210320002001360204200020033602000b1a0020001077220041cc95084106100e1a2001200010f40220000b130020001077220041d695084106100e1a20000b16002000200210f20210ad022000200110ef0210ad020b1a0020001077220041d295084104100e1a20002001108d0220000b3e01017e200010f00210a00242017c2202504504402000200110f202200210b6022000200210ef02200110a602200010f002200210b60220020f0b1076000b7801017f230041106b220224002002200042388620004280fe0383422886842000428080fc0783421886200042808080f80f834208868484200042088842808080f80f832000421888428080fc07838420004228884280fe038320004238888484843703082001200241086a4108108402200241106a24000b0c002000200110f20210a0020b4601017f230041106b22012400200141086a20001073024002400240200128020841016b0e020102000b200141106a24000f0b4199880841181003000b41b1880841141003000b0c01017f10712200100a20000b1c0020002802004102460440200041046a0f0b41c5880841101003000b0f00108a011a20012000107710b3010b4001017f10a001200210fb022102108a01220310f90220032001109b01200020033602082000411c411020021b3602042000419a8908418a890820021b3602000b10002000420010870241ff01714101460b27002001200210fd02220142002003109f012000200336020c20004200370300200020013602080b180020004102460440200110770f0b41c5880841101003000b2d01017f230041106b22012400200141086a2000107320012802084101460440200010ad020b200141106a24000be503010a7f230041e0006b22062400200010f60202402005280200450440200641086a2000200410fa020c010b200641106a200541086a280200360200200620052902003703080b2006428182848080a0c0800137021c2006410036021820004101200610a802230041206b22072400200641186a22002d000b210820002d000a210920002d0009210a20002d0008210b20002d0007210c20002d0006210d20002d0005210e20002d0004210f20002802002105200741e3840810f00141a68508410510f101200741186a22002001360200200728020422012002109b0120012003109b01108a011a2001200410860110b3012001200510f2012001418584084109200f10ee012001418e84084107200e10ee012001419584084108200d10ee012001419d84084107200c10ee01200141a484084107200b10ee01200141ab8408410e200a10ee01200141b98408410a200910ee01200141c384084112200810ee01200641406b220141186a2000290300370300200141106a200741106a290300370300200141086a200741086a29030037030020012007290300370300200741206a24002006413c6a200641106a28020036020020062006290308370234200620062802583602302006200628025036022c20062006290340370224200641246a10f401000b0c002000200110810310a4020b1a0020001077220041f189084108100e1a2001200010da0220000b0f002000200110810310a5024100470b210020001077220041e489084105100e1a200120001084032002200010f40220000b2701017f230041106b22022400200220003a000f20012002410f6a4101108402200241106a24000b130020001077220041e989084108100e1a20000bd00101037f230041206b22042400200441046a22052001200220031083031094012005200510d3021083021081022106200442003703182005200441186a2201410810870320014108410010c2012103200441046a10d3022102108a0121010340200204402001200441046a10d30210b301200241016b21020c010b0b2004280204200428020810c4010440200441146a2d0000044041c4e608410036020041c8e60841003a00000b2000200136020c2000200636020820002003370300200441206a24000f0b41a58008410e10ff01000b3f000240200041086a200028020020012002109b024504402000280200220120026a220220014f0d011076000b41d18508410f10ff01000b200020023602000b0e002000200120021089034101730b0f0020002001200210830310a502450b6601017f230041106b220424002000200120021083032004108701200420042d00043a000c200420042802003602082003280208200441086a22011093012003290300200110df012003410c6a2001108b03200428020820042d000c10f801200441106a24000b5f01027f230041206b220224002000280200220310db01200110f60120022003101236021c20024100360218200220003602140340200241086a200241146a10e60120022802080440200228020c200110e8010c0105200241206a24000b0b0b900101017f230041206b2203240020001077220041f989084106100e1a200120001084032002280208108601200010da022002290300200010f402200228020c220110db01200010ca0220032001101236021c2003410036021820032002410c6a3602140340200341086a200341146a10e60120032802080440200328020c200010b8020c010b0b200341206a240020000b1000200020012002108c03200310b6020b0e00200020012002108c0310ad020bac0302047f017e230041306b220524002001200210fd022107108a01210210950221082005108a01220636021c108a0122012007109b0120012003109d0120012002109b0120012008109d0120012006109b01108a011077210220042d0000200210840320042d0001200210840320042d000220021084032001200210b30102402006101204402005200610123602282005410036022420052005411c6a3602200340200541106a200541206a10e6012005280210450d0220052802142102108a011a20012002107710b3010c000b000b108a01220241d89408410010241a2001200210b3010b200541086a100941e48108410d106f2001109e014100109902024020052802084101470d00200528020c22021012220141084b0d002005420037032020024100200520016b41286a200110a8010d002005290320220942388620094280fe0383422886842009428080fc0783421886200942808080f80f834208868484200942088842808080f80f832009421888428080fc07838420094228884280fe0383200942388884848421090b2000200336020c2000200937030020002007360208200541306a24000b1600200020012802082001290300200128020c1099010b27002001200210fd02220120032004109f012000200436020c20002003370300200020013602080b1401017f108a01220220002001106f10b30120020bb90101037f230041406a22012400200141186a200041046a220210d202200120012903183702300340200141106a200141306a107a200128021004402000280200200128021410c0020c0105200141206a200228020010ce0220012802242100034020000440200141086a20022802002000107b200128020c2002280200200010cb022002280200200010cd0221000c010b0b200141386a4200370300200142003703302002280200200141306a10d002200141406b24000b0b0b6a01037f230041106b2201240020001095032102200141086a2000280208200028020022032002108202024020012802084101460440200220036a22022003490d01200128020c20002002360200200141106a24000f0b41948108411941d18508410f107e000b1076000b3b02017f017e230041106b220124002001410036020c20002001410c6a22004104419481084119109c0320004104410010c201200141106a2400a70b5701017f230041206b22012400200141106a200041046a10d202200120012903103702180340200141086a200141186a107a200128020804402000280208200128020c10b3020c01052000109303200141206a24000b0b0b1801017f20011077210220002001360204200020023602000b4f01017f230041206b2201240020012000280200101236021c20014100360218200120003602140340200141086a200141146a10e60120012802080440200135020c10200c010b0b200141206a24000b2001017f41c4e60828020022004190ce004d04404190ce0020006b0f0b1076000b3f01017f230041106b22032400200341086a2001200241b498084190ce001075200328020c21012000200328020836020020002001360204200341106a24000b4e00024020002802002000280204107941024704402001109a02450d01200028020841022001107710a80220002001360204200041023602000f0b41b1880841141003000b41c5880841101003000b42000240200041086a200028020020012002109b024504402000280200220120026a220220014f0d011076000b2003200441d18508410f107e000b200020023602000b3201017f230041106b22012400200141003a000f20002001410f6a410141e186084120109c0320012d000f200141106a24000b4001017f230041106b220224002002200136020c2002200036020803402002200241086a107a20022802000440200235020410200c0105200241106a24000b0b0b9e0202047f027e2003200142388620014280fe0383422886842001428080fc0783421886200142808080f80f834208868484200142088842808080f80f832001421888428080fc07838420014238882208200142288822094280fe0383848484370000200041084100200142005322072002716b41ff017122042008a746220520042001423088a741ff01714671220620056a20042009a741ff01714620067122056a20042001422088a741ff01714620057122056a200520042001a72205411876467122066a2004200541107641ff01714620067122066a2004200541087641ff01714620067122046a2004200150716a22042007200320044107716a2c0000410048732004410047712002716b22026b3602042000200220036a3602000b2c01017f230041106b22012400200141003a000f20002001410f6a410110870320012d000f200141106a24000b920301047f230041406a220324002003200110fa01024002402003280220450d00024002402003418a8908411010f9014504402003419a8908411c10f9010d012000200136020420004101360200200041086a20023602000c040b10d901410010d80120034100360224200341306a2201200341246a220410b901200328022410d5012003280230200328023421062004200210da0110d901200410b5012102200341386a22042003412c6a28020036020020032003290224370330200110b70121012003280234200428020010d6010d0120014102200610a8020c020b10d901410010d80120034100360224200341306a2201200341246a220441b98f08410610af01200328022410d50120032802302004200210da0110d901200410b5012102200341386a22062003412c6a28020036020020032003290224370330200110b70121012003280234200628020010d601450440200341306a10a60120014102200328023810a8020c020b200210a203200110ad020c010b200210a203200110ad020b200041003602000b200341406b24000b2f01017f10a501220110ed0141ff01714102460440416741d89408410010241a200020014200108a01416710341a0b0b0d00108a011a20002001107d000b1000200010a30141d5e608103641004a0b11002000280200200128020010784101730b1c01027f41f490084107109203108a0122022000ad10fc01200210370b0f00200041d79108410a106f10e8020b3c01027f230041106b22012400200141086a41c18f08410a106f109703200128020c21022000200128020836020020002002360204200141106a24000b2901027f41e19108410a106f22011077220241ee87084104100e1a20002002360204200020013602000b6402017f017e230041106b22012400200041fe8f08410810b60121002001420037030820012000200141086a10fd0120012802002001280204410010c20122024280808080105a044041fe8f08410841a58008410e10ab01000b200141106a24002002a70b0a0041b29208410c106f0b0a0041e592084116106f0b0a0041fb9208410b106f0b3d01037f230041106b22012400418693084112106f220210772103200141086a20021097032000200129030837020020002003360208200141106a24000b0a0041989308410b106f0b3601037f41a393084110106f22011077210220011077220341ee87084104100e1a2000200336020420002001360200200020023602080b0a0041b393084110106f0b0a0041c39308410f106f0b0d002000411341d29308108a060b09001038410010d7010b0d001038410010d70110b603000b0b0041a19808410e1003000b10001038410110d7014100101b7b10200b4502027f017e1038410310d701410010cb0121004101101b2102410241a88c08410410ba0121014172200210960220002000417210022000200020011094021002200010210b1e01027f1038410110d701410010cb0121001071220120001030200110210b13001038410110d701410010cb011039ad10200b1e001038410210d701410010d301410141f88b08410110ba01109302103a0b1e001038410210d701410010cb01410141f88b08410110ba0110930210210b3501017f230041106b220024001038410110d7012000410010cb0110be032000290300a70440200029030810200b200041106a24000b2901027e2001106941004c047e4200052001106a210242010b210320002002370308200020033703000b1d01017f1038410210d701410010cb0122004101101b109602200010210b0e001038410010d70110950210210b2002017e017f1038410110d7014100101b2100107122012000109602200110210b3f01027f230041106b220024001038410010d7012000427f3703082000427f37030041672000411010241a416710712201102f1a20011021200041106a24000b13001038410110d7014100108e0110810210210b1701017f1038410010d70110712200420010012000103a0b1f02017e017f1038410110d7014100101d210010712201200010012001103a0b20001038410210d701410010cb014101101b10890210870241ff017145ad103b0b3501017f230041106b220024001038410110d7012000410010d30110be032000290300a704402000290308103b0b200041106a24000b1c01017f1038410210d701410010d30122004101101d10012000103a0b2b01037f1038410110d701410010d301220010ed01107122022000103cad42ff018342017d103b200210210b4101027f1038410210d7014102410141948c08410410ce01220041ff01711b41002000c041004e1b410110cb01210041ff017145044020002000103d0b2000103a0b18001038410210d701410010d301410110d301108f02103a0b18001038410210d701410010d301410110cb01108f02103a0b18001038410210d701410010cb01410110d301108f02103a0b18001038410210d701410010d301410110cb01109002103a0b18001038410210d701410010cb01410110d301109002103a0b18001038410210d701410010d301410110d301109002103a0b1f01017f1038410210d701410010cb0122002000410110cb011002200010210b2701037f1038410210d701410010cb012100410110cb01210110712202200020011002200210210b1f01017f1038410210d701410010d30122002000410110d30110232000103a0b2701037f1038410210d701410010d3012100410110d3012101107122022000200110232002103a0b2001017f1038410210d701410010cb0122002000410110cb0110ec01200010210b2801037f1038410210d701410010cb012100410110cb012101107122022000200110ec01200210210b1f01017f1038410210d701410010d30122002000410110d301103e2000103a0b2701037f1038410210d701410010d3012100410110d30121011071220220002001103e2002103a0b1f01017f1038410210d701410010cb0122002000410110cb01103e200010210b2701037f1038410210d701410010cb012100410110cb0121011071220220002001103e200210210b1f01017f1038410210d701410010d30122002000410110d301103f2000103a0b2701037f1038410210d701410010d3012100410110d30121011071220220002001103f2002103a0b1f01017f1038410210d701410010cb0122002000410110cb01103f200010210b2701037f1038410210d701410010cb012100410110cb0121011071220220002001103f200210210b1f01017f1038410210d701410010d30122002000410110d30110402000103a0b2701037f1038410210d701410010d3012100410110d3012101107122022000200110402002103a0b1f01017f1038410210d701410010cb0122002000410110cb011040200010210b2701037f1038410210d701410010cb012100410110cb01210110712202200020011040200210210b2501027f1038410210d701410010d301410110d3012101107022002000200110022000103a0b2401027f1038410210d701410010d301410110d30121011070220020011091022000103a0b2501027f1038410210d701410010cb01410110cb01210110702200200020011002200010210b2501027f1038410210d701410010d301410110d3012101107022002000200110232000103a0b2401027f1038410210d701410010d301410110d30121011070220020011092022000103a0b2601027f1038410210d701410010cb01410110cb012101107022002000200110ec01200010210b2501027f1038410210d701410010d301410110d30121011070220020002001103e2000103a0b2501027f1038410210d701410010cb01410110cb0121011070220020002001103e200010210b2501027f1038410210d701410010d301410110d30121011070220020002001103f2000103a0b2501027f1038410210d701410010cb01410110cb0121011070220020002001103f200010210b2501027f1038410210d701410010d301410110d3012101107022002000200110402000103a0b2501027f1038410210d701410010cb01410110cb01210110702200200020011040200010210b1f01017f1038410210d701410010cb0122002000410110cb011041200010210b2701037f1038410210d701410010cb012100410110cb01210110712202200020011041200210210b1f01017f1038410210d701410010cb0122002000410110cb011042200010210b2701037f1038410210d701410010cb012100410110cb01210110712202200020011042200210210b1f01017f1038410210d701410010cb0122002000410110cb011043200010210b2701037f1038410210d701410010cb012100410110cb01210110712202200020011043200210210b2501027f1038410210d701410010cb01410110cb01210110702200200020011041200010210b2501027f1038410210d701410010cb01410110cb01210110702200200020011042200010210b2501027f1038410210d701410010cb01410110cb01210110702200200020011043200010210b2501017f1038410210d701410010cb0122002000410141f88b08410110ba01102a200010210b2d01037f1038410210d701410010cb012100410141f88b08410110ba0121011071220220002001102a200210210b2501017f1038410210d701410010cb0122002000410141f88b08410110ba011029200010210b2d01037f1038410210d701410010cb012100410141f88b08410110ba01210110712202200020011029200210210b2b01027f1038410210d701410010cb01410141f88b08410110ba0121011070220020002001102a200010210b2b01027f1038410210d701410010cb01410141f88b08410110ba01210110702200200020011029200010210b0d001038410010d701104410200b0d001038410010d701104510200b0d001038410010d701104610200b0d001038410010d701104710200b1601017f1038410010d701107122001048200010081a0b0d001038410010d701104910200b0d001038410010d701104a10200b0d001038410010d701104b10200b0d001038410010d701104c10200b1601017f1038410010d70110712200104d200010081a0b0f001038410010d70110a00110081a0b0f001038410010d70110a40110081a0b20001038410110d701410041b28d08410710c80110a30141d5e608104ead10200b1a001038410110d701410041b28d08410710c80110a403ad103b0b1601017f1038410010d70110712200104f200010081a0b0f001038410010d70110a10110081a0b0d001038410010d701100910200b2a01017f1038410010d701416741919608410c10241a4167416610321a416610712200102f1a200010210baf0101037f230041206b220024001038410110d701410041b28d08410710c80141671050200041003b011441671012220141034f044041818608411c1003000b200041086a200041146a22024102200110fb01416741002000280208200028020c10a8011a20002f011421012000108701200020002d00043a0018200020002802003602142000200141850c713b011e20022000411e6a410210f701200028021420002d0018108b01200041206a24000b13001038410110d7014100108e011051ad103b0b18001038410010d70141ae8308411e41db8008411b107e000b21001038410010d701419f91084111106f1a41858708411a41f68008411e107e000b1c001038410010d70141b091084113106f1a41c08008411b10ff01000b21001038410010d70141c391084114106f1a419f8708411641db8008411b107e000b1d001038410010d70141909108410f1092031a41848b08411810a303000b20001038410010d70141829108410e1092031a108a011a41ed8a084117107d000b1b001038410010d7011095021a108a011a41ab8508411c10a303000b4a01027f230041206b220024001038410010d70141f1810810f001220141feffffff07460440419c8b0841191003000b200041086a200141d58b08411310f10141ab8508411c10a303000b1c01017f1038410110d7014100108e011071220010521a200010081a0b1c01017f1038410110d7014100108e011071220010531a200010081a0b1c01017f1038410110d7014100108e011071220010541a200010081a0b1e001038410310d7014100108e014101108e014102108e01105545ad103b0b1b001038410310d7014100108e014101108e014102108e0110561a0b1e001038410310d7014100108e014101108e014102108e01105745ad103b0b5601017f1038410410d7014100108e014101108e014102108e0102404103101a450d004103419c8c08410910be01220041ff01714105490d00419c8c08410941b38008410d10ab01000b200041ff0171105845ad103b0b2101017f1038410210d7014100108e014101108e011071220010591a200010081a0b0f001038410110d7014100101b10200b0f001038410110d7014100101d103b0b0f001038410110d70110c501ac103b0b17001038410110d701410041dc8d08410110ba01ad10200b3701017e1038410110d7014100101d22004280808080087d42ffffffff6f58044041dc8d08410141a99008411210ab01000b2000c4103b0b16001038410110d70141dc8d08410110ce01adc2103b0b1b001038410110d701410041dc8d08410110be01ad42ff018310200b15001038410110d701410041dc8d0810cd01ad103b0bb50201037f230041106b220124001038410110d7010240027f230041206b220024002000410c6a4100108d014102210202400240200028020c200028021010c401450440024002402000410c6a41dc8d08410110c60141ff01710e020100040b4100210202402000410c6a41dc8d08410110c60141ff01710e020100040b410121020b200028020c200028021010c401450d010b2000411c6a2d0000044041c4e608410036020041c8e60841003a00000b200041206a240020020c020b41dc8d08410141a58008410e10ab01000b41dc8d08410141b38008410d10ab01000b220041ff0171410246044041d89408410010220c010b2001108701200120012d00043a000c20012001280200360208200141086a2202410110e3012002200010e301200128020820012d000c108b010b200141106a24000b1100103810d901410010d801410010d5010b3301027f230041106b220024001038410110d7012000410b6a22014100419b8c08410110d401200141051022200041106a24000b800101037f230041106b22002400103810d901410010d8012000410036020c2000410c6a2101108a0121020340200128020041cce6082802004804402002200141ce8b08410110b00110b3010c010b0b200028020c10d501200210db01210120002002360208200020013602042001ad1020200041086a109803200041106a24000bc50202047f017e230041306b22002400103810d901410010d80120004100360220200041206a220341ce8b08410110b2012101200028022010d501108a0121022003200110da010240034020002802282000280224490440200041206a41fe8f08410810b601210120004200370318200041086a2001200041186a10fd012000280208200028020c410110c20122044280808080087d42ffffffff6f580d02200041206a41fe8f08410810b8012103108a01210120004200370318200020044101200041186a109f0320012000280200200028020410241a2002200110b30120022003109b010c010b0b20002002360218200020021012360228200041003602242000200041186a3602200340200041106a200041206a10e60120002802100440200028021410081a0c010b0b200041306a24000f0b41fe8f08410841a99008411210ab01000b3001027f230041106b220024001038410110d701200041046a220141dc8f08410210cf01200110e701200041106a24000b4401017f1038410110d70102404100101a450d00410041dc8f08410210be01220041ff01714103490d0041dc8f08410241b38008410d10ab01000b2000ad42ff018310200b0d001038410010d701420110200b3101017f1038410110d701410041de8f08410210bb01220045044041de8f08410241b38008410d10ab01000b2000ad10200ba70101047f230041106b22002400103810d901410110d80110c501200041013602080240200041086a220128020041cce6082802004e0440410121020c010b200141e08f08410310ad0141e08f08410310ae0121010b200020013602042000200236020020002802042101200028020021022000200028020836020c2000410c6a41cce608280200360200200028020c10d501ac103b20024504402001ac103b0b200041106a24000b920302077f017e230041206b220124001038410110d701200141086a2105230041406a22002400200041003602282000412c6a4100108d012000411c6a21034101210202400340200028022c22042000280230220610c4010d01200041003602082000412c6a200041086a2204410441da8f08410210c10120044104410110c201210720024104470440200320073e0200200341046a210320002002360228200241016a21020c010b0b41da8f08410241989008411110ab01000b02402004200610c4010440200041106a2202200041246a2902003703002000200029021c3703082000413c6a2d0000044041c4e608410036020041c8e60841003a00000b20052000290308370200200541086a2002290300370200200041406b24000c010b41da8f08410241a58008410e10ab01000b20012802142001108701200120012d00043a001c20012001280200360218410274210241002100034020002002470440200141086a20006a280200200141186a10e801200041046a21000c010b0b200128021820012d001c108b01200141206a24000b10001038410110d701410010cb0110210b10001038410110d701410010d301103a0b11001038410110d7014100108e0110081a0b17001038410110d701410041cc8b08410210c80110081a0bf30201077f230041206b220124001038410110d701230041206b220024004100108e012106108a012104200610122102200041186a41003a0000200041146a2002360200200020063602102000200236020c20004100360208037f2005200210bc01047f2000200041086a10c901220241187420024180fe03714108747220024108764180fe03712002411876727236021c20042000411c6a4104100e1a200028020c2102200028020821050c010520002d0018044041c4e608410036020041c8e60841003a00000b200041206a240020040b0b2102200141086a108701200120012d000c3a00182001200128020836021420021012210402400340200341046a22002003490d01200020044d04402001410036021c200220032001411c6a410410a8011a200128021c220341187420034180fe03714108747220034108764180fe037120034118767272200141146a109001200021030c010b0b200128021420012d0018108b01200141206a24000f0b1076000be40101057f230041206b220024001038410110d701200041106a2102230041206b220124002001410c6a22034100108d01200310c9012104200341cb8b08410110c70121030240200128020c200128021010c40104402001411c6a2d0000044041c4e608410036020041c8e60841003a00000b2002200336020420022004360200200141206a24000c010b41cb8b08410141a58008410e10ab01000b20002802142000280210200041086a108701200020002d000c3a001c20002000280208360218200041186a22021090012002109201200028021820002d001c108b01200041206a24000bb50201057f230041206b220024001038410110d701200041106a2103230041206b220124002001410c6a4100108d0102400240200128020c200128021010c4014504400240024002402001410c6a41cb8b08410110c60141ff017122020e020201000b41cb8b08410141b38008410d10ab01000b2001410c6a10c9012104410121020b200128020c200128021010c401450d010b2001411c6a2d0000044041c4e608410036020041c8e60841003a00000b2003200436020420032002360200200141206a24000c010b41cb8b08410141a58008410e10ab01000b0240200028021045044041d89408410010220c010b2000280214200041086a108701200020002d000c3a001c20002000280208360218200041186a2202410110e3012002109001200028021820002d001c108b010b200041206a24000bb80201077f230041306b220024001038410210d701410041d29508410410c8012104230041206b220124004101108e012106108a0121032006101221022001411c6a41003a0000200141186a200236020020012006360214200120023602102001410036020c2000037f2005200210bc01047f20032001410c6a41cf8b08410310c70110b30120012802102102200128020c21050c010520012d001c044041c4e608410036020041c8e60841003a00000b200141206a240020030b0b36021820002004360214200410081a200041086a108701200020002d000c3a00202000200028020836021c20002003101236022c200041003602282000200041186a36022403402000200041246a10e6012000280200044020002802042000411c6a1092010c010b0b200028021c20002d0020108b01200041306a24000bca0401087f230041206b220124001038410110d701230041206b220024004100108e012105108a012106200510122102200041186a41003a0000200041146a2002360200200020053602102000200236020c20004100360208037f2004200210bc01047f200041086a41d38b08410210c3012104108a0121020340200404402000200041086a41d38b08410210c301220541187420054180fe03714108747220054108764180fe03712005411876727236021c20022000411c6a4104100e1a200441016b21040c010b0b2000200241187420024180fe03714108747220024108764180fe03712002411876727236021c20062000411c6a4104100e1a200028020c2102200028020821040c010520002d0018044041c4e608410036020041c8e60841003a00000b200041206a240020060b0b2105200141086a108701200120012d000c3a00182001200128020836021420051012210602400340200341046a22042003490d01200420064d0440410021002001410036021c200520032001411c6a410410a8011a200128021c220341187420034180fe03714108747220034108764180fe03712003411876727222021012410276200141146a10f601200210122107034002402000200041046a22034d0440200320074d0d01200421030c040b1076000b2001410036021c200220002001411c6a410410a8011a200128021c220041187420004180fe03714108747220004108764180fe037120004118767272200141146a10f601200321000c000b000b0b200128021420012d0018108b01200141206a24000f0b1076000bf90201077f230041206b220124001038410110d701230041206b220024004100108e012106108a012104200610122102200041186a41003a0000200041146a2002360200200020063602102000200236020c20004100360208037f2005200210bc01047f2000200041086a41d38b08410210c701220241187420024180fe03714108747220024108764180fe03712002411876727236021c20042000411c6a4104100e1a200028020c2102200028020821050c010520002d0018044041c4e608410036020041c8e60841003a00000b200041206a240020040b0b2102200141086a108701200120012d000c3a00182001200128020836021420021012210402400340200341046a22002003490d01200020044d04402001410036021c200220032001411c6a410410a8011a200128021c220341187420034180fe03714108747220034108764180fe037120034118767272200141146a109201200021030c010b0b200128021420012d0018108b01200141206a24000f0b1076000b4d01017f230041106b22002400103810d901410010d8012000410036020c20002000410c6a41d28b08410110af01200028020c10d5012000280200044020002802081000000b200041106a24000bd50101057f230041206b22002400103810d901410010d80120004100360210200041106a220341ce8b08410110b2012102200028021010d501108a0121012003200210da0102400340200028021820002802144f0d01200041106a10aa032202200041106a10aa0322036a220420024f04402002200110860220032001108602200420011086020c010b0b1076000b2000200136020c2000200110123602182000410036021420002000410c6a36021003402000200041106a10e60120002802000440200028020410081a0c010b0b200041206a24000b910101067f230041206b220024001038410110d7012000410041818e08410d10ba01108c0202402000280200450440109502210110950221021095022103109502210410950221052000410036021c2000200536021820002004360214200020033602102000200236020c200020013602080c010b200041086a2000280204108b020b200041086a10eb01200041206a24000b3101027f230041206b220024001038410110d701200041086a22014100108e01105a108b02200110eb01200041206a24000b4501027f230041106b220024001038410110d701200041086a410041818e08410d10ba012201108c022000280208047f200028020c10260520010bad1020200041106a24000b4301017f230041106b220024001038410110d701200041086a410041818e08410d10ba01108c022000280208047e200028020c105bad0542000b1020200041106a24000b8c0101087f230041106b220024001038410510d701410041818e08410d10ba012101410110cb012103410210cb012104410310cb012105410410cb012106200041086a2001108c0202402000280208450440109502210110950221020c010b200028020c21074200100b22014200100b220220072003200420052006105c0b2001200210e101200041106a24000b7a01067f230041106b220024001038410310d701410041818e08410d10ba012101410110cb012103410210cb012104200041086a2001108c0202402000280208450440109502210110950221020c010b200028020c21054200100b22014200100b2202200520032004105d0b2001200210e101200041106a24000b5c01047f230041106b220024001038410310d701410041818e08410d10ba012101410110cb012102410210cb012103200041086a2001108c022000280208047e200028020c20022003105e41004aad0542000b103b200041106a24000b840101077f230041106b220024001038410410d701410041818e08410d10ba012101410110cb012103410210cb0121044103108e012105200041086a2001108c0202402000280208450440109502210110950221020c010b200028020c21064200100b22014200100b22022006200320042005105f1a0b2001200210e101200041106a24000b7201057f230041106b220024001038410210d701410041818e08410d10ba0121014101108e012103200041086a2001108c0202402000280208450440109502210110950221020c010b200028020c21044200100b22014200100b22022004200310601a0b2001200210e101200041106a24000b6801047f230041106b220024001038410310d701410041818e08410d10ba012101410110cb012102410210cb012103200041086a2001108c0202402000280208450440108a0121010c010b20022003200028020c1071220110611a0b200110081a200041106a24000b6801047f230041106b220024001038410310d701410041818e08410d10ba012101410110cb012102410210cb012103200041086a2001108c0202402000280208450440108a0121010c010b20022003200028020c1071220110621a0b200110081a200041106a24000b7201057f230041106b220024001038410210d701410041818e08410d10ba0121014101108e012103200041086a2001108c0202402000280208450440109502210110950221020c010b200028020c21044200100b22014200100b22022004200310631a0b2001200210e101200041106a24000b7201057f230041106b220024001038410210d701410041818e08410d10ba0121014101108e012103200041086a2001108c0202402000280208450440109502210110950221020c010b200028020c21044200100b22014200100b22022004200310641a0b2001200210e101200041106a24000b7401047f230041106b220024001038410110d701200041086a410041818e08410d10ba01108c020240200028020845044010950221021095022103108a0121010c010b200028020c21014200100b22024200100b220320011071220110651a0b2002102120031021200110081a200041106a24000b17001038410110d701410041e88b08410410ba0110a6030b3201027f1038410110d701410041f08b08410810ba01210103402000200146450440200010a603200041016a21000c010b0b0bc90101057f230041206b22002400103810d901410210d801410010cb012101410141ec8b08410410c801210420004102360214200041146a41e88b08410410b2012103200028021410d50141fb900841071092032102108a011a2002200110860110b301108a011a20022004107710b30120002003360210108a011077210120002003101236021c200041003602182000200041106a3602140340200041086a200041146a10e60120002802080440200028020c200110da020c010b0b200220011037200041206a24000b1e00103810a40110a001107845044041fc940841241003000b410010d7010b1e00103841671010416710a403044041a09508412c1003000b410010d7010b2d001038410210d701410041d28b08410110ba01410141f88b08410110ba0147044041f98b08410e109801000b0b13001038410010d70141878c08410d109801000b8f0301087f230041206b220224001038410110d701230041e0006b22002400200041046a4100108d0141202103034020030440200041046a41b68e08410510c60121042001411f4b2205450440200041386a20016a20043a0000200141016a21010b200510cc01200341016b21030c01052001412049044041b68e08410541869008411210ab01000b0b0b200041306a2201200041d0006a2203290200370300200041286a2204200041c8006a2205290200370300200041206a2206200041406b22072902003703002000200029023837031802402000280204200028020810c401044020032001290300370300200520042903003703002007200629030037030020002000290318370338200041146a2d0000044041c4e608410036020041c8e60841003a00000b20022000290338370000200241186a200041d0006a290300370000200241106a200041c8006a290300370000200241086a200041406b290300370000200041e0006a24000c010b41b68e08410541a58008410e10ab01000b200210f00110081a200241206a24000b2901017f1038410110d7014100108e0122001012412047044041ee8f084110109801000b200010081a0b0f001038410010d701108a0110081a0b1f01017f1038410210d7014100108e0122004101108e0110051a200010081a0b4e01017f230041106b220024001038410310d701200041086a4100108e014101419d8e08411110ba01410241948e08410910ba0110820220002802080440200028020c10081a0b200041106a24000b2601027f1038410110d701410041ae8e08410810ba01210010712201200010661a200110081a0b18001038410210d7014100108e014101108e011078ad103b0b13001038410010d70141f1810810f00110081a0b24001038410210d701410041918e08410310c8014101418e8e08410310c8011078ad103b0b0f001038410010d701108a0110dc010b2501017f1038410210d701410041d38b08410210d1012200410110cb0110b301200010dc010bfa0102067f017e230041106b220124001038410210d701420121060240410041c68d08410310d1012203410141c38d08410310d101220410780d00024020031012220520041012470d000340200220054f0d022001410036020820032002200141086a410410a8011a200128020821002001410036020c200420022001410c6a410410a8011a200041187420004180fe03714108747220004108764180fe037120004118767272200128020c220041187420004180fe03714108747220004108764180fe037120004118767272108a02450d012002200241046a22004d0440200021020c010b0b1076000b420021060b2006103b200141106a24000bdc0201077f230041206b220124001038410210d701230041206b220024004100108e012106108a0121042006101221022000411c6a41003a0000200041186a200236020020002006360214200020023602102000410036020c037f2005200210bc01047f20042000410c6a412041d38b08410210bd0110b30120002802102102200028020c21050c010520002d001c044041c4e608410036020041c8e60841003a00000b200041206a240020040b0b2202410141fe8c08410410c80110b301200141086a108701200120012d000c3a00182001200128020836021420021012210402400340200341046a22002003490d01200020044d04402001410036021c200220032001411c6a410410a8011a200141146a200128021c220341187420034180fe03714108747220034108764180fe03712003411876727210e401200021030c010b0b200128021420012d0018108b01200141206a24000f0b1076000b960101047f230041106b220124001038410310d701410041d38b08410210d1012102410141ad8d08410510ba012103410210cb012100024020034180808080044904402001200041187420004180fe03714108747220004108764180fe03712000411876727236020c2002200341027441042001410c6a10670d01200210dc01200141106a24000f0b1076000b41c98d084113109801000ba10101057f230041106b220024001038410210d701410041d38b08410210d1012102410141ad8d08410510ba01210120012002101241027622044904400240027f2001450440108a010c010b200041086a2002410020011098022000280208450d01200028020c0b210320002002200141016a20041098022000280200450d002003200028020410051a200310dc01200041106a24000f0b0b419d8608411d1003000b880101037f230041206b220024001038410210d701200041106a410041d38b08410210d101410110cb011097020240200028021045044041d89408410010220c010b2000280214200041086a108701200020002d000c3a001c20002000280208360218200041186a2202410110e301200210f601200028021820002d001c108b010b200041206a24000b3e01017f230041106b220024001038410210d701200041086a410041d38b08410210d101410110cb011097022000280208410047ad103b200041106a24000bb20101047f230041206b220024001038410210d7014100108e012102200041146a2203410141fe8c08410410d4012000410c6a200041186a2d00003a000020002000280214360208200341003a0000200041003602100340200141054704402000200041086a20016a2d00003a001f20002001200141016a2201200041106a41051075200028020020002802042000411f6a41011089010c010b0b2002200041106a4105100e1a200210081a200041206a24000b930101037f230041106b220124001038410210d701410041d38b08410210d10121000240410141ad8d08410510ba0122024180808080044904402001410036020c200020024102742001410c6a410410a8010d01200128020c220041187420004180fe03714108747220004108764180fe03712000411876727210701021200141106a24000f0b1076000b419d8608411d1003000b14001038410110d7014100108e0110950110081a0b16001038410210d7014100108e014101108e0110a6020b24001038410210d701410041b28d08410710c8014101108e01416710334167107710081a0b17001038410010d70141eb9108410d106f10950110081a0b16001038410010d701418992084108106f10a30210210b16001038410010d701418292084107106f109e02103a0b16001038410010d701419f92084103106f10a00210200b17001038410010d70141fd91084105106f109f02ad10200b4901027f230041106b220024001038410010d701419c92084103106f21012000420037030820002001200041086a10960120002802002000280204410110c201103b200041106a24000b17001038410010d70141a292084104106f10a202ad103b0b17001038410010d70141d295084104106f10a10210081a0bb70101037f230041206b220024001038410010d7012000410c6a41dd8d084108106f1094010240200028020c200028021010c4014504400240024002402000410c6a10a00341ff017122010e020201000b41b38008410d10ff01000b410121012000410c6a412010830221020b200028020c200028021010c401450d010b2000411c6a2d0000044041c4e608410036020041c8e60841003a00000b20010440200210081a0b200041206a24000f0b41a58008410e10ff01000b18001038410010d70141dd8d084108106f10a50245ad103b0b17001038410010d70141919208410b106f109f02ad10200b14001038410010d70141919208410b106f10ad020bf60102037f017e230041206b220024001038410010d7010240024041f891084105106f220210a502450d002000410c6a2201200210940102400240024002400240200110a00341ff017122010e0404010203000b41b38008410d10ff01000b2000410c6a10d302ad2103410121010c020b2000410c6a10d302ad2000410c6a10d302ad422086842103410221010c010b2000410c6a10d302ad2103410321010b200028020c200028021010c401450d012000411c6a2d0000450d0041c4e608410036020041c8e60841003a00000b200020033702102000200136020c2000410c6a10e701200041206a24000f0b41a58008410e10ff01000b2e01027f1038410110d701410041d29508410410c801210041a692084104106f2201200010051a200110a30210210b4201037f1038410210d701410041be8d08410510c8012101410141b98d08410510c801210241aa92084104106f2200200110051a2000200210051a200010a30210210b2b01017f1038410110d701410041cb8b08410110ba0141ae92084104106f220010ca02200010a202ad103b0b2601017f1038410210d701410041b28d08410710c8014101108e01107122001033200010081a0b1f01017f1038410110d7014100108e01210041eb9108410d106f200010a6020b19001038410110d701410010cb01418992084108106f1085010b1f01017f1038410110d701410010d3012100418292084107106f200010ac020b2601017f1038410110d701410041dc8d08410110ba01210041fd91084105106f2000ad10b6020b1e01017f1038410110d70110c501210041e292084103106f2000ac10eb020b1e01017e1038410110d7014100101b2100419f92084103106f200010b6020b1e01017e1038410110d7014100101d2100419c92084103106f200010eb020b2401017f1038410110d701410041dc8d0810cd01210041a292084104106f2000ad10eb020b2501017f1038410110d701410041a58c08410310c801210041d295084104106f200010a6020be10101047f230041206b22002400103810d901410010d80120004100360218200041106a21030240200041186a220228020041cce6082802004e0440410121010c010b200241dd8d08410810ad0141dd8d08410810b40121020b20032002360204200320013602002000280214210320002802102101200028021810d50141dd8d084108106f2102024020010440200241d89408410010ab020c010b200041086a108701200020002d000c3a001c20002000280208360218200041186a2201410110e3012001200310e4012002200028021820002d001c10f8010b200041206a24000ba70201037f230041306b220024001038410110d7012000411c6a41a58c08410310cf0141f891084105106f210202400240024002400240200028021c41016b0e03010203000b2002420010b6020c030b2000108701200020002d00043a002c20002000280200360228200041286a2201410110e3012000280220200110e8012002200028022820002d002c10f8010c020b200041086a108701200020002d000c3a002c20002000280208360228200041286a2201410210e3012000280220200110e8012000280224200110e8012002200028022820002d002c10f8010c010b200041106a108701200020002d00143a002c20002000280210360228200041286a2201410310e3012000280220200110e8012002200028022820002d002c10f8010b200041306a24000b3101037f1038410210d701410041d29508410410c8012100410110cb0141a692084104106f2202200010051a20021085010b4501047f1038410310d701410041be8d08410510c8012101410141b98d08410510c8012102410210cb0141aa92084104106f2200200110051a2000200210051a20001085010b3601027f1038410210d701410041cb8b08410110ba01410141f88b0810cd01210141ae92084104106f220010ca0220002001ad10eb020b1e01017e1038410110d7014100101d210041be92084109106f200010eb020b19001038410110d701410010cb0141d59208410d106f1085010b1f01017f1038410110d7014100108e01210041c79208410e106f200010a6020b2201017f1038410110d701410041b28d08410710c801210010af03200010f50210200b3502017f017e1038410110d701410041b28d08410710c801210010af03200010f502220150044041dc9508410f1003000b200110200b3d02017f017e230041106b220024001038410110d7014100101b2101200041086a10af03200110ee022000280208200028020c10e201200041106a24000b2201017e1038410110d7014100101b210010af03200010ef0210a502410047ad103b0b3901027f1038410110d701410041b28d08410710c801210010af032201200010f5025045044041ff8708411a1003000b2001200010f30210200b3902027f017e1038410110d701410041b28d08410710c801210010af032201200010f20210a002220250047e2001200010f3020520020b10200b5402037f017e230041106b220024001038410110d7014100101b2103200041086a10af032202200310ee02200028020c21012000280208047f20022003200110f10241010541000b200110e201200041106a24000b3802027f017e1038410110d701410041b28d08410710c801210010af032201200010f50222025045044020012002200010f1020b200210200b830101027f230041406a220024001038410010d701200010ad03220136020c200041106a200110e30220002000410c6a360224200041386a200041206a290200370300200041306a200041186a290200370300200020002902103703280340200041106a200041286a107f20002802100440200035021410200c010b0b200041406b24000bbe0101077f230041206b220024001038410110d701410041fe8c08410410ba012104200010ad03220210ce0220001098052101024020002802002205450440200020013602040c010b200041106a220620022000280208220310de022000200136021820022003200610df020b2000200336021c20004100360218200020013602142000200436021020022001200041106a10df0220002001360208200541016a22014504401076000b200020013602002002200010d002200041206a24000b1e01017f200028020c41016a220104402000200136020c20010f0b1076000bbe0101077f230041206b220024001038410110d701410041fe8c08410410ba012104200010ad03220210ce0220001098052101024020002802002205450440200020013602080c010b200041106a220620022000280204220310de022000200136021c20022003200610df020b2000410036021c20002003360218200020013602142000200436021020022001200041106a10df0220002001360204200541016a22014504401076000b200020013602002002200010d002200041206a24000b4701027f230041306b220024001038410010d701200041206a10ad03220110ce022000410c6a2001200028022410e202200028020c410173200028021010e001200041306a24000b4701027f230041306b220024001038410010d701200041206a10ad03220110ce022000410c6a2001200028022810e202200028020c410173200028021010e001200041306a24000b3601017f230041206b220024001038410010d7012000410c6a10ad0310e302200028020c410173200028021010e001200041206a24000b4701027f230041306b220024001038410010d701200041206a10ad03220110ce022000410c6a20012000280228108101200028020c410173200028021010e001200041306a24000bc90202077f017e230041d0006b220024001038410210d70141012101410041cf8e08410710ba012102410141d68e08410710ba0121052000410c6a10ad03200210810102400240200028020c0440200041206a2000410c6a10800110ad0322032000280224220410dd020d02200041306a2201200310ce0220011098052101200028022821022000200136022820032004200041206a10df02024020020440200041406b22062003200210de022000200136024c20032002200610df020c010b200020013602380b2000200436024c20002002360248200020013602442000200536024020032001200041406b10df02200028023041016a22010d011076000b0c010b200020013602302003200041306a10d002200041186a200041c8006a2902003702002000200029024022073702102007a72102410021010b2001200210e001200041d0006a24000bc90202077f017e230041d0006b220024001038410210d70141012101410041cf8e08410710ba012102410141d68e08410710ba0121052000410c6a10ad03200210810102400240200028020c0440200041206a2000410c6a10800110ad0322032000280224220410dd020d02200041306a2201200310ce0220011098052101200028022c21022000200136022c20032004200041206a10df02024020020440200041406b22062003200210de022000200136024820032002200610df020c010b200020013602340b2000200236024c20002004360248200020013602442000200536024020032001200041406b10df02200028023041016a22010d011076000b0c010b200020013602302003200041306a10d002200041186a200041c8006a2902003702002000200029024022073702102007a72102410021010b2001200210e001200041d0006a24000b5401027f230041306b220024001038410110d701410041cf8e08410710ba0121012000410c6a10ad032001108101200028020c0440200041206a22012000410c6a10800110ad03200110dc020b200041306a24000b4501027f230041206b220024001038410110d701410041cf8e08410710ba0121012000410c6a10ad03200110e202200028020c410173200028021010e001200041206a24000b5a01047f230041306b220024001038410210d701410041cf8e08410710ba012101410141c68e08410910ba0121022000411c6a220310ad0320011081012000410c6a2201200310800110ad032001200210e102200041306a24000b7201047f230041306b220024001038410210d701410041cf8e08410710ba012101410141c68e08410910ba0121022000410c6a10ad0322032001108101200028020c0440200041286a200041186a290200370300200020002902103703202003200041206a200210e1020b200041306a24000b7c01037f230041306b220024001038410110d701410041cf8e08410710ba012101108a0121022000410c6a10ad0320011081010340200028020c0440200041206a2000410c6a220110800120022000280220108502200110ad0320002802281081010c010b0b20002002360220200041206a10e501200041306a24000ba90101047f230041406a220024001038410110d701410041cf8e08410710ba012102108a012101200010ad0322033602242000410c6a200320021081012000200041246a360220200041386a2000411c6a290200370300200041306a200041146a2902003703002000200029020c37032803402000410c6a200041286a107f200028020c0440200120002802101085020c010b0b20002001360208200041086a10e501200041406b24000b3a01017f230041106b220024001038410010d701200010ab0336020c20002000410c6a10d20220002802002000280204109e03200041106a24000b2101017f1038410110d701410041fe8c08410410ba01210010ab03200010c2021a0b4401027f230041206b220024001038410010d701200041106a10ab03220110ce02200041086a2001200028021410c5022000280208200028020c10ea01200041206a24000b4301037f230041106b220024001038410010d701200010ab03220110ce022000280204220245044041e58d08410c109801000b20012002107cad1020200041106a24000b6a02027f017e230041306b220024001038410010d7012000410c6a220110a7032000200041106a10d20220002000290300370318200020013602200340200041246a200041186a10820120002802240440200035022c2000350228102010200c010b0b200041306a24000b7101027f230041306b220024001038410010d701108a0121012000411c6a10a703200041106a200041206a10d202200020002903103702280340200041086a200041286a107a200028020804402001200028020c10b3010c010b0b20002001360218200041186a109803200041306a24000ba90101037f230041406a220024001038410010d701108a012102200041286a220110a703200041186a2000412c6a10d202200020002903183702342000200136023c0340200041106a200041346a107a2000280210410147450440200041086a200028023c2201280200200141086a2802002000280214108301200028020c210120002802081084012002200110b3010c010b0b20002002360224200041246a109803200041406b24000b5a01047f230041206b220024001038410210d701410041fe8c08410410ba012101410141828d08410510ba012102200041146a220310a703200041086a20032001200210b5022000280208200028020c10ea01200041206a24000b3d01027f230041106b220024001038410110d701410041fe8c08410410ba012101200041046a10a7032000280204200110ba02ad103b200041106a24000b5101027f230041206b220024001038410110d701410041fe8c08410410ba012101200041146a10a703200041086a2000280214200028021c20011083012000280208200028020c10ea01200041206a24000b6101047f230041106b220024001038410110d701410041fe8c08410410ba012102200041046a10a70320002802042000280208200210c302047f200028020c2201200210b90221032001200210b30241010541000b200310ea01200041106a24000b870101057f230041306b220024001038410210d701410041fe8c08410410ba012102410141908d08410910ba01200041246a220310a703200041186a22042003200210bb02200041106a200410bd02200028021022032000280214220410bc0222026a220120024904401076000b200041086a20032004200110b5022001ad1020200041306a24000b880101047f230041206b220024001038410210d701410041fe8c08410410ba012101410141998d08410710ba012103200041086a220210a703200041146a2002200110bb022000411c6a2802002101200028021821022000280214450440200020022001200310be0220002802002102200028020421010b2002200110bc02ad1020200041206a24000bc40101057f230041306b220024001038410310d701410041fe8c08410410ba012101410141908d08410910ba012103410241878d08410910ba012104200041246a220210a703200041186a2002200110bb02200041206a2802002101200028021c2102024002402000280218044020032002200110bc0222036a22042003490d02200041106a20022001200410b5020c010b200041086a20022001200410be02200028020c2101200028020821020b2002200110bc02ad1020200041306a24000f0b1076000b9b0101047f230041206b220024001038410210d701410041fe8c08410410ba012101410141a08d08410d10ba012103200041146a220210a703200041086a2002200110bb02200041106a2802002101200028020c210202402000280208450440200120036a22032001490d01200020022001200310be0220002802002102200028020421010b2002200110bc02ad1020200041206a24000f0b1076000ba60201067f230041f0006b220024001038410010d701108a012102200041206a220110ae03200041186a200041246a10d2022000200029031837022c20002001360234200041cc006a210403400240200041106a2000412c6a107a20002802104101470d00200041e0006a220320002802342201280200200141086a2802002000280214220110e502200041386a200310e602200041d0006a200041406b28020036020020002000290338370348200041086a200410d202200020002903083702542000200041c8006a36025c0340200041e0006a200041d4006a1082012000280260450d0220002802682103200028026421052002200110850220022005108502200220031085020c000b000b0b20002002360260200041e0006a10e501200041f0006a24000b4201027f230041106b220024001038410110d701410041fe8c08410410ba012101200041046a10ae0320002802042000280208200110b702ad103b200041106a24000b3d01027f230041106b220024001038410110d701410041fe8c08410410ba012101200041046a10ae032000280204200110ba02ad103b200041106a24000bda0101037f230041d0006b220024001038410110d701410041fe8c08410410ba0121012000410c6a10ae03200041186a200028020c2000280214200110e50220002802180440200041306a200041246a2802003602002000200029021c370328108a0121012000200041286a220241047210d20220002000290300370238200020023602400340200041c4006a200041386a10820120002802440440200028024c210220012000280248108502200120021085020c010b0b20002001360208200041086a10e501200041d0006a24000f0b41e28e08410b109801000b980101047f230041306b220024001038410310d701410041fe8c08410410ba012101410141988c08410310ba012102410241828d08410510ba012103200041146a10ae03200041206a2000280214200028021c200110e502200028022045044041e28e08410b109801000b2000200041246a2002200310b502200041003602082000200029030037020c200041086a10e901200041306a24000b910101037f230041306b220024001038410210d701410041fe8c08410410ba012101410141988c08410310ba012102200041146a10ae03200041206a2000280214200028021c200110e502200028022045044041e28e08410b109801000b200020002802242000412c6a2802002002108301200041003602082000200029030037020c200041086a10e901200041306a24000b5f01047f230041206b220024001038410110d701410041fe8c08410410ba012101200041086a10ae032000280208200028020c200110c30222020440200041146a22032000280210200110e70220031096030b2002ad103b200041206a24000bb90101047f230041d0006b220024001038410010d701200041186a220110ae03200041106a2000411c6a10d202200020002903103702242000200136022c200041346a21010340200041086a200041246a107a2000280208410147450440200041406b2202200028022c2203280200200341086a280200200028020c10e5022001200210e602200041c8006a200141086a2802003602002000200129020037034020021096030c010b0b200041186a109303200041d0006a24000bb30101067f230041306b220024001038410310d701410041fe8c08410410ba012103410141988c08410310ba012104410241908d08410910ba01200041246a220110ae03200041186a22052001200310bb02200041106a200510e90220052000280210200028021410e40220012005200410bb02200041086a200110bd0220002802082201200028020c220310bc0222046a220220044904401076000b200020012003200210b5022002ad1020200041306a24000bf50101077f230041406a220024001038410410d701410041fe8c08410410ba012102410141988c08410310ba012104410241828d08410510ba012105410341dd8e08410510ba012106200041286a220310ae032000411c6a2003200210bb02200041246a280200210220002802202103200028021c0440200041346a22012003200210e402200041106a20012004200510b502410121010b2000413c6a20023602002000200336023820002001360234200041086a200041346a220110e90220012000280208200028020c10e40220002000280234200028023c20041083012000280204200620002802001bad1020200041406b24000b8e0101067f230041306b220024001038410310d701410041fe8c08410410ba012102410141988c08410310ba012103410241828d08410510ba012104200041186a220510ae03200041246a22012005200210bb02200041106a200110e90220012000280210200028021410e402200041086a20012003200410b5022000280208200028020c10ea01200041306a24000b4701017f230041206b220024001038410010d701200041106a10a80320002000290310370218200041086a2000411c6a10d2022000280208200028020c109e03200041206a24000b4201027f230041106b220024001038410110d701410041fe8c08410410ba012101200041086a10a8032000280208200028020c200110b702ad103b200041106a24000b3d01027f230041106b220024001038410110d701410041fe8c08410410ba012101200041086a10a8032000280208200110ba02ad103b200041106a24000b4201027f230041106b220024001038410110d701410041fe8c08410410ba012101200041086a10a8032000280208200028020c200110c302ad103b200041106a24000b11001038410010d70110ac03109e02103a0b2401027f1038410110d701410010d301210010ac0322012001109e022000108f0210ec020b2801037f1038410110d701410010d301210010ac032201109e02220220001091022001200210ec020b4301037f1038410110d701410010d301210010ac032202109e022201200010880241ff017141024f044041f18d084110109801000b200120001092022002200110ec020b2401027f1038410110d701410010d301210010ac03220110ed0204402001200010ac020b0b0f001038410010d70110ac0310ad020b12001038410010d70110ac0310ed02ad103b0b1e001038410110d701410041b28d08410710c80110ac0310b00245ad103b0b12001038410010d70110ac0310a502ad10200b6401047f230041106b220124001038410010d701200141086a10a90320012802082102200128020c109f0221034101210002400340200020034d04402000417f460d022002200010c602ad1020200041016a21000c010b0b200141106a24000f0b1076000b5e01057f230041106b220024001038410110d701410041fe8c08410410ba012102200041086a10a9032000280208200028020c2204109f0241016a22014504401076000b200110c7022002ad10b60220042001ad10b602200041106a24000b5c01037f230041106b220024001038410110d701410041ad8d08410510ba012101200041086a10a90302402001450d002000280208200028020c109f022001490d00200110c602ad1020200041106a24000f0b41eb950841121003000b7401047f230041106b220024001038410210d701410041b28d08410710c8012102410141ad8d08410510ba012101200041086a10a90302402001450d0020002802082103200028020c200210c8022001490d0020022003200110c70210ae02ad1020200041106a24000f0b41eb950841121003000b2e01017f230041106b220024001038410010d701200041086a10a903200028020c109f02ad1020200041106a24000b3d01027f230041106b220024001038410110d701410041b28d08410710c8012101200041086a10a903200028020c200110c802ad1020200041106a24000be00102047f027e230041306b220124001038410310d7014100108e0121004101101b2104200141206a410210bf01200141106a200141286a2903003703002001200129032037030802400240106e22022000108203450440200210850310a402220341ff017141ff01460d0120022000108103200341016a2200ad42ff0183220510b6022002108503200510b6020c020b2002200010800321000c010b41ff890841d7001003000b200220002004108803450440200220002004200141086a2203108a032002200020032004108d03200141306a24000f0b41d68a0841171003000bb70102047f017e230041306b220024001038410310d7014100108e0121014101101b2104200041206a410210bf01200041106a200041286a290300370300200020002903203703080240106e22022001108203044020022002200110800322012004108803450d01200041186a2203200220012004108603200220012003108e03200220012004200041086a2203108a032002200120032004108d03200041306a24000f0b41b6890841101003000b41c68908411e1003000bb60102037f017e230041206b220024001038410210d7014100108e0121024101101b21030240106e22012002108203044020012001200210800322022003108803450d01200041086a2001200220031086032000108701200020002d00043a001c200020002802003602182000280210200041186a22011093012000290308200110df01200041146a2001108b03200028021820002d001c108b01200041206a24000f0b41b6890841101003000b41c68908411e1003000b920101037f230041306b220024001038410210d7014100108e012101200041206a410110bf01200041106a200041286a290300370300200020002903203703080240106e2202200110820304402002200220011080032201200041086a108c0310a502450d0120022001200041086a108c0310a0021020200041306a24000f0b41b6890841101003000b41c68908411e1003000b6c02037f017e230041106b220224001038410210d7014100108e0121004101101b21030240106e22012000108203450d0020012001200010800322002003108803450d00200220012000200310860320012000200310830310ad02200120002002108e030b200241106a24000b3a02027f017e1038410210d7014100108e0121004101101b2102106e22012000108203047e2001200120001080032002108903ad0542010b103b0b1d01017f1038410110d7014100108e01210010b203200010d90210ea020b1d01017f1038410110d7014100108e01210010b203200010d90210ad020b1d01017f1038410110d7014100108e01210010b203200010db02ad103b0b2c01027f1038410210d701410041b28d08410710c80121004101108e01210110b2032000200110d802ad103b0b2701017f1038410110d7014100108e01210010b203200010db0245044041fd950841141003000b0b3601027f1038410210d701410041b28d08410710c80121004101108e01210110b2032000200110d80245044041fd950841141003000b0b5401057f230041206b2200240010ac01410210d7014100108e012102410110cb01210310a501200041086a10b30310702101108a0121042000410036021420002802102001200420022003200041146a10ff02000b7c01077f230041206b2200240010ac01410210d7014100108e012104410110cb01210210a501200210fb022103108a012105200041086a10b30310702101108a0121062000200536021c2000411f411b20031b3602182000419a8f0841ff8e0820031b36021420002802102001200620042002200041146a10ff02000be10101067f230041206b2201240010ac01410110d7014100108e01210410a501200141086a10b30310702102108a0121052001410036021420012802102103230041d0006b22002400200310f6020240200141146a2201280200450440200041086a200310950210fa020c010b200041106a200141086a280200360200200020012902003703080b20034101200010a802200041306a200220052004410010f3012000412c6a200041106a28020036020020002000290308370224200020002802483602202000200028024036021c20002000290330370214200041146a10f401000bd20201087f230041206b220024001038410010d70120004181043b0006108a012102200041086a220110b3032000200236021c20004112360218200041ed8e08360214200041066a2105200041146a210210f7022103230041206b22002400200128020810ed02450440200110f802200041e3840810f00141d58408410e10f101108a011a2802001077210120002802042204200110b30120002802102106200028020021072003200410f90241002101034020014102470440200120056a2d00002203044020042003410274220341b494086a2802002802002003419494086a280200280200106f10b3010b200141016a21010c010b0b200010950236020c2000200636020820004100360210200020043602042000200736020020022802000440200041106a22012002290200370200200141086a200241086a2802003602000b200010f401000b41ea880841201003000b4001027f230041206b220024001038410110d701410010cb012101200041146a10b303200020002802142000280218200110fc02200010de01200041206a24000b7901037f230041306b220024001038410210d701410041bf8f08410210c801410110cb012102200041146a10b303200041206a20002802142000280218200210fc02200041286a22012802004200200028022c109901200041086a200129030037030020002000290320370300200010de01200041306a24000b3b01037f230041106b220024001038410110d701410010cb012101200041046a220210b303200210f80228020042002001109a01200041106a24000b3701027f230041106b220024001038410010d701200041046a220110b30310f702200110f802280200420010a2011021200041106a24000b4b01027f230041206b22002400410010d701200041106a220110a6012000200028021836020c200110b303200110f8022000410c6a10a503044041d5880841151003000b200041206a24000bd90102097f017e230041306b22002400410010d70110a70121022000410c6a220110b303200041206a2103200110f802210620021012210741002101024002400340200141106a22042001490d02200420074b0d01200342003703002000420037031820022001200041186a2205411010a8011a2000410036022c20052000412c6a220810a90121012005200810aa0121092000200041186a2000412c6a10a90136022420002001360220200020093703182006200310a503450440200421010c010b0b41d5880841151003000b200041306a24000f0b1076000b4701017f230041106b220024001038410010d701200041046a10b303027f200028020c10ed024504402000280204200028020810fd020c010b108a010b10081a200041106a24000b920201087f230041206b2200240010ac01410110d7014100108e01210610a501200041086a107210702102108a0121072000410036021420002802102103200041146a2101230041d0006b22002400200041086a20031073024002400240200028020841016b0e020001020b4199880841181003000b41b1880841141003000b027f2001280200220545044010a001108a01220410f90220042003109b01418a8908210541100c010b2001280208210420012802040b210120034101200010a802200041306a200220072006410310f3012000412c6a2004360200200041286a200136020020002005360224200020002802483602202000200028024036021c20002000290330370214200041146a10f401000b6701027f230041106b220024001038410110d7014100108e012101200041046a1072024020002802042000280208107941024704402001109a02450d01200028020c41022001107710a802200041106a24000f0b41b1880841141003000b41c5880841101003000b5a01037f230041206b220024001038410210d701410010cb0121012000410110ca0122024110763a0012200020023b0110200041146a10722000200028021420002802182001200041106a108f03200010de01200041206a24000b890101047f230041306b220024001038410310d701410041bf8f08410210c801410110cb0121032000410210ca0122014110763a0012200020013b0110200041146a1072200041206a2201200028021420002802182003200041106a108f032001109003200041086a200041286a29030037030020002000290320370300200010de01200041306a24000b4902027f017e230041206b220024001038410210d7014100101b2102410110cb012101200041146a107220002000280214200028021820022001109103200010de01200041206a24000b7802047f017e230041306b220024001038410310d701410041bf8f08410210c8014101101b2104410210cb012102200041146a1072200041206a220320002802142000280218200420021091032003109003200041086a200041286a29030037030020002000290320370300200010de01200041306a24000b4202037f017e230041106b220024001038410210d7014100101b2103410110cb012101200041046a22021072200210f80228020020032001109a01200041106a24000b3e02027f017e230041106b220024001038410110d7014100101b2102200041046a2201107210f702200110f802280200200210a2011021200041106a24000be402020b7f017e230041306b220024001038410110d7014100101b210b200041106a2201107210f702200110f8024200100b210610042102100421071004210810042103100421014200100b21091004210a280200200b2006200220072008200320012009200a106820011012450440200141f18108412010241a0b200041003b011c200241002000411c6a22042202410210a8011a200310772203101221012000412c6a41003a0000200041286a200136020020002003360224200020013602202000410036021c2002109d0321022004109d0321032000411c6a109d032104200028021c200028022010c401044020002d002c044041c4e608410036020041c8e60841003a00000b200041086a108701200020002d000c3a00202000200028020836021c2000411c6a2201200210e3012001200310e3012001200410e301200028021c20002d0020108b01200041306a24000f0b41e18608412041a58008410e107e000b4501017f230041106b220024001038410010d701200041046a1072027f200028020c10a50204402000280204200028020810fd020c010b108a010b10081a200041106a24000b4e01027f230041106b220024001038410110d701410041d78f08410310ba012101200041046a10b0032000280208109f02044041df8708410f1003000b200028020c200110d502200041106a24000b4201027f230041106b220024001038410110d701410041ad8d08410510ba012101200041046a10b00320002802042000280208200110d602ad1020200041106a24000b990101077f230041106b220024001038410110d701410041ad8d08410510ba012103200041046a10b00320002802082202109f022101200028020422042002200110d6022105024020012003460440200521060c010b20042002200310d6022106200420022003200510d7020b200420022001410010c90220014504401076000b200028020c200141016b10d5022006ad1020200041106a24000b4e01037f230041106b220024001038410210d701410041ad8d08410510ba012101410141d58f08410210ba012102200041046a10b003200028020420002802082001200210d702200041106a24000b6801057f230041106b220124001038410010d701200141046a10b00320012802082202109f022103200128020421044101210002400340200020034d04402000417f460d0220042002200010d602ad1020200041016a21000c010b0b200141106a24000f0b1076000b7e02057f017e230041206b220024001038410210d701200041086a410041e58f0810d201200041146a410141e38f0810d2012000411c6a2802002101200041186a280200210220002802102103200028020c210420002802082000280214108a0245200220044772047e420005200320011078ad0b103b200041206a24000b0d001038410010d701420010200b0c001038410010d7011076000b0d001038410010d701427e103b0b11001038410010d70141818708410410220b7101037f1038410110d701230041106b220124004100108e012200101241044604402001410036020c200041002001410c6a2202410410a8011a41feffffff0720002002410441818708410410d0011b21000b200141106a2400200041feffffff0747047e2000109a02ad0542010b103b0b14001038410110d7014100108e01109a02ad103b0b970102037f027e230041206b220024001038410110d701410041f08c08410810ba01ad2104108a01210103402003200451450440108a012202200342017c220310fc012001200210b3010c010b0b2000200136021020002001101236021c200041003602182000200041106a3602140340200041086a200041146a10e60120002802080440200028020c10081a0c010b0b200041206a24000b2b01017f1038410110d701410041f88c08410610ba01220045044041e28c08410e109801000b2000ad10200b2001017f1038410110d701410041b28d08410710c801210010b103200010a6020b4901017f230041206b220024001038410010d701200010b10310a10241c18f08410a106f10bf02200041106a2000280200200028020410d402200028021045ad103b200041206a24000b6001037f230041106b220024001038410110d701410041fe8c08410410ba01200010b10310a10241c18f08410a106f10bf02200028020c1077220141bc87084108100e1a200110b8022000280208200110ae02410047ad103b200041106a24000b4701017f230041206b220024001038410010d701200010b10310a10241c18f08410a106f10bf02200041106a2000280200200028020410d40220003502101020200041206a24000b6e01047f230041106b220124001038410110d701410041828d08410510ba0121024101210003402003200020024b72450440200141086a41c18f08410a106f1097032001280208200128020c200010b7021a200020024f2103200020002002496a21000c010b0b200141106a24000be10501057f230041e0006b220024000240024010f50122041095012201108e020d0020011077220210122101200041cc006a41003a0000200041c8006a200136020020002002360244200020013602402000410036023c2000413c6a2201109403210220011095032103108a01210103402003044020012000413c6a10940310b301200341016b21030c010b0b200028023c200028024010c401450d0120002d004c044041c4e608410036020041c8e60841003a00000b200410ad022000200210fa012000280220450d002000413c6a200210fa01200028025c450d00024002402000413c6a41ff8e08411b10f9014504402000413c6a419a8f08411f10f9010d012000413c6a41ed8e08411210f9010d02200041286a2002200110a1032000280228450d03200041306a28020021012000413c6a200028022c220210fa01200028025c450d03200041286a2002200110a1032000280228450d032000413c6a200028022c200041306a28020010a103200028023c450d0341ac8c0841361003000b10d901410010d80120004100360224200041286a2202200041246a10b901200028022410d5012000280228200028022c21042002200110da0110d901200028022c200028023010d601450440200041286a220110b30320012004109b030c030b200041286a10b303200028023010fe020c020b10d901410010d80120004100360224200041286a2202200041246a41b98f08410610af01200028022410d50120002802282002200110da0110d901200028022c200028023010d601450440200041286a220110a60120002802302102200110b30320012002109b030c020b200041286a10b303200028023010fe020c010b10d901410010d80120004100360224200041286a2202200041246a41b98f08410610af01200028022410d50120002802282002200110da0110d901200028022c200028023010d6010d0041e593084108106f10ea020b200041e0006a24000f0b41948108411941a58008410e107e000b3801017f230041106b2203240020034200370308200320012002200341086a109f0320002003280200200328020410ab02200341106a24000b4301027f108a0122062000109b01027f2001500440410d210720050c010b20062001109c012004210720030b210020062002109d01100920002007106f2006109e011a0b3401027f230041106b22032400200341086a20022001106f220410732000200329030837020020002004360208200341106a24000b0b9d180600418080080bf101546f6b656e417474726962757465736e6f6e46756e6769626c65546f6b656e4d6170706572696e70757420746f6f206c6f6e67696e76616c69642076616c756564656c6962657261746520746f70206465636f6465206572726f7264656c6962657261746520746f7020656e636f6465206572726f7264656c69626572617465206e657374656420656e636f6465206572726f7273657269616c697a6572206465636f6465206572726f723a20455344544c6f63616c4275726e455344544e46544275726e455344544c6f63616c4d696e74455344544e46544164645175616e74697479455344544e465443726561746500419182080bd202696e636f7272656374206e756d626572206f662045534454207472616e7366657273617267756d656e74206465636f6465206572726f722028293a2066756e6374696f6e20646f6573206e6f74206163636570742045534454207061796d656e74746f6f2066657720617267756d656e7473746f6f206d616e7920617267756d656e747377726f6e67206e756d626572206f6620617267756d656e7473656e64706f696e7420726573756c7420656e636f6465206572726f723a2063616e6e6f74207375627472616374206265636175736520726573756c7420776f756c64206265206e6567617469766566616c73657472756563616e467265657a6563616e5769706563616e506175736563616e4d696e7463616e4275726e63616e4368616e67654f776e657263616e5570677261646563616e4164645370656369616c526f6c65737365745370656369616c526f6c650041ec84080b010100418085080bd70f02ffff464e474e46545346544d4554417265676973746572416e64536574416c6c526f6c65736973737565636f6e74726163742063616c6c20656e636f6465206572726f723a2043425f434c4f53555245696e70757420746f6f2073686f72746361737420746f20693634206572726f72703232347032353670333834703532316661696c656420746f206c6f616420746f20627974652061727261794d616e6167656456656320696e646578206f7574206f662072616e6765000000000000617474656d707420746f206d756c7469706c792077697468206f766572666c6f776572726f72206465636f64696e67204553445420617474726962757465733a2045474c4473746f72616765206b657920656e636f6465206572726f723a2073746f7261676520656e636f6465206572726f723a202e6d61707065642e6e6f64655f69642e6974656d2e6e6f64655f6c696e6b732e76616c75652e696e666f6c656e20616c7265616479207365742e6c656e2e6e6f64652e73746f726167654164647265737320616c7265616479207265676973746572656449737375652077617320616c72656164792063616c6c6564546f6b656e20494420616c726561647920736574496e76616c696420746f6b656e204944496e76616c6964207061796d656e7420746f6b656e4d757374206973737565206f722073657420746f6b656e20494420666972737464656661756c745f69737375655f636264656661756c745f69737375655f696e69745f737570706c795f6362556e6b6e6f776e20746f6b656e206964412076616c756520776173206e6f742070726576696f75736c79207365742e617474722e636f756e7465722e6d617070696e672e6e6f6e6365436f756e746572206f766572666c6f772e2054686973206d6f64756c652063616e20686f6c642065766964656e636520666f72206d6178696d756d2075383a3a4d415820646966666572656e7420746f6b656e20494473412076616c75652077617320616c7265616479207365746c6f67206461746120656e636f6465206572726f723a206c6f6720746f70696320656e636f6465206572726f723a20726563697069656e742061646472657373206e6f742073657473746f72616765206465636f6465206572726f723a20786d616d766563616d76656e636f64655f6572726f725f6d6574686f6464617461617267326e756d5f6c6f67736261206d75737420657175616c206273635f70616e696320746573747369676e6b657973686173685f74797065617267617267336e6f2063616c6c6261636b2066756e6374696f6e20776974682074686174206e616d652065786973747320696e20636f6e747261637477616e7473206e6f6e2d7a65726f686f775f6d616e796e756d6265726974656d76616c75656f7468657277697365696e6372656d656e7464656661756c746b65795f696e6372656d656e74696e64657861646472657373616464723261646472316d76326d7631696e646578206f7574206f6620626f756e6473696f70745f61646472517565756520656d707479216e6f7420656e6f7567682066756e647363757276655f62697473697a656d62326d6231736c6963655f6c656e7374617274696e675f706f736974696f6e6e725f6279746573617272617973746f726167655f6b65796e65775f76616c75656e6f64655f6964656c656d656e746f746865724e6f2073746f72616765217365745f726f6c65735f63616c6c6261636b637573746f6d5f69737375655f7a65726f5f737570706c795f6362637573746f6d5f69737375655f6e6f6e5f7a65726f5f737570706c795f6362726573756c74746f7365745f6d61707065726174747269627574657369646c656e617673656e7a6f70747332733170656e64696e67626164206172726179206c656e67746876617220617267736172726179206465636f6465206572726f726361706163697479206578636565646564696e707574206f7574206f662072616e6765696e697469616c5f63616c6c657263616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75656576656e745f616576656e745f626576656e745f6572725f646174616576656e745f6572725f746f7069636c6f61645f776974685f6b65795f6572726c6f61645f776974685f76616c75655f65727273746f72655f776974685f76616c75655f6572726d61705f6d61707065727665635f6d617070657273746f726167655f62797465737365725f327573697a656269675f696e746269675f75696e746e725f746f5f636c656172693634753634626f6f6c6d6170316d6170326d61703371756575655f6d6170706572454c524f4e44693634454c524f4e447265736572766564454c524f4e4442696755696e746933326d795f73696e676c655f76616c75655f6d61707065726c6973745f6d61707065726d61705f73746f726167655f6d6170706572616464726573735f696473756e697175655f69645f6d6170706572636f6e74726163745f6164647265737377686974656c6973744d617070657266756e6769626c65546f6b656e4d6170706572726f6c657353657400000003000000030000000300000004000000000000008302020086020200890202008c020200580a0200340b0200500b02006c0b02008c0b0200a40b0200c00b0200e40b0200fc0b0200300b02004c0b0200680b0200880b0200a00b0200bc0b0200e00b0200f80b020041e094080bcf03617474656d707420746f206164642077697468206f766572666c6f77456e64706f696e742063616e206f6e6c792062652063616c6c6564206279206f776e6572456e64706f696e742063616e206f6e6c792062652063616c6c65642062792075736572206163636f756e7473616464724964616464726c6173744964556e6b6e6f776e2061646472657373696e646578206f7574206f662072616e67654974656d206e6f742077686974656c6973746564454c524f4e4472657761726445534454526f6c654c6f63616c4d696e7400001d0b02001100000045534454526f6c654c6f63616c4275726e000000380b02001100000045534454526f6c654e4654437265617465000000540b02001100000045534454526f6c654e46544164645175616e746974790000700b02001600000045534454526f6c654e46544275726e00900b02000f00000045534454526f6c654e4654416464555249000000a80b02001100000045534454526f6c654e46545570646174654174747269627574657300c40b02001b000000455344545472616e73666572526f6c65e80b020010000000617474656d707420746f2073756274726163742077697468206f766572666c6f7770616e6963206f636375727265640041b098080b049cffffff" + "code": "0061736d010000000186022660000060027f7f0060027f7f017f60017f017f60037f7f7f0060017f0060037f7f7f017f60047f7f7f7f006000017f60047f7f7f7f017f6000017e60027f7e0060057f7f7f7f7f0060017f017e60037f7e7f0060037f7f7e017f60027f7f017e60017e017f60047f7f7f7e0060057f7f7f7e7f0060017e0060057f7f7e7f7f017f60067f7f7f7f7f7f017f60027f7e017f60067e7f7f7f7f7f017f60077f7f7f7f7f7f7f00600b7f7f7e7f7f7f7f7f7f7f7f0060047e7f7f7f017f60027e7f0060017e017e60037f7f7e0060067f7f7f7f7f7f0060047f7f7e7f0060037f7f7f017e60047f7e7f7f0060057f7e7e7e7e0060067f7e7f7f7f7f0060087e7e7e7e7e7e7f7f0002e2146e03656e76126d616e616765645369676e616c4572726f72000503656e760e626967496e74536574496e743634000b03656e7609626967496e74416464000403656e760b7369676e616c4572726f72000103656e760a6d4275666665724e6577000803656e760d6d427566666572417070656e64000203656e76096d4275666665724571000203656e760d6d42756666657246696e697368000303656e76136d42756666657253746f7261676553746f7265000203656e761b6d616e61676564457865637574654f6e44657374436f6e74657874001803656e760d6d616e6167656443616c6c6572000503656e76186d616e616765644765744f726967696e616c547848617368000503656e76106d4275666665724765744c656e677468000303656e760f6d4275666665724765744279746573000203656e761c626967496e744765744553445445787465726e616c42616c616e6365001303656e76136d616e616765644f776e657241646472657373000503656e7612626967496e7447657443616c6c56616c7565000503656e761c6d616e616765644765744d756c74694553445443616c6c56616c7565000503656e7619626967496e74476574556e7369676e6564417267756d656e74000103656e76126d427566666572476574417267756d656e74000203656e76126d427566666572417070656e644279746573000603656e76136765744e756d455344545472616e7366657273000803656e7611676574417267756d656e744c656e677468000303656e761b736d616c6c496e74476574556e7369676e6564417267756d656e74000d03656e7619736d616c6c496e744765745369676e6564417267756d656e74000d03656e7617626967496e744765745369676e6564417267756d656e74000103656e760f6765744e756d417267756d656e7473000803656e760666696e697368000103656e7614626967496e7446696e697368556e7369676e6564000503656e7616736d616c6c496e7446696e697368556e7369676e6564001403656e7609626967496e74537562000403656e760f6d4275666665725365744279746573000603656e76226d616e616765644d756c74695472616e73666572455344544e465445786563757465001503656e760a6765744761734c656674000a03656e76106d616e61676564534341646472657373000503656e760f636c65616e52657475726e44617461000003656e7609626967496e744e6577001103656e7616656c6c6970746963437572766547657456616c756573001603656e761067657443757276654c656e6774684543000303656e76086372656174654543000203656e76146d427566666572436f707942797465536c696365000903656e76176d42756666657246726f6d426967496e745369676e6564000203656e76156d427566666572546f426967496e745369676e6564000203656e7609626967496e74506f77000403656e761776616c6964617465546f6b656e4964656e746966696572000303656e760a626967496e7454446976000403656e7609626967496e7453686c000403656e7609626967496e74536872000403656e7609626967496e744d756c000403656e760a626967496e744c6f6732000303656e76196d42756666657246726f6d426967496e74556e7369676e6564000203656e76176d427566666572546f426967496e74556e7369676e6564000203656e760a626967496e7453717274000103656e76126d42756666657253746f726167654c6f6164000203656e761d6d42756666657253746f726167654c6f616446726f6d41646472657373000403656e761b6d616e616765645472616e7366657256616c756545786563757465001503656e7609626967496e74436d70000203656e760f6973536d617274436f6e7472616374000303656e760f6d616e6167656457726974654c6f67000103656e760e636865636b4e6f5061796d656e74000003656e7612626967496e7446696e6973685369676e6564000503656e7614736d616c6c496e7446696e6973685369676e6564001403656e7609626967496e74416273000103656e7609626967496e744e6567000103656e760a626967496e74544d6f64000403656e7609626967496e74416e64000403656e7608626967496e744f72000403656e7609626967496e74586f72000403656e7611676574426c6f636b54696d657374616d70000a03656e760d676574426c6f636b4e6f6e6365000a03656e760d676574426c6f636b526f756e64000a03656e760d676574426c6f636b45706f6368000a03656e76196d616e61676564476574426c6f636b52616e646f6d53656564000503656e761567657450726576426c6f636b54696d657374616d70000a03656e761167657450726576426c6f636b4e6f6e6365000a03656e761167657450726576426c6f636b526f756e64000a03656e761167657450726576426c6f636b45706f6368000a03656e761d6d616e6167656447657450726576426c6f636b52616e646f6d53656564000503656e761167657453686172644f6641646472657373000303656e76176d616e616765644765745374617465526f6f7448617368000503656e76166d616e61676564476574436f64654d65746164617461000103656e76186d616e6167656449734275696c74696e46756e6374696f6e000303656e760d6d616e61676564536861323536000203656e76106d616e616765644b656363616b323536000203656e76106d616e61676564526970656d64313630000203656e76106d616e61676564566572696679424c53000603656e76146d616e6167656456657269667945643235353139000603656e76166d616e61676564566572696679536563703235366b31000603656e761c6d616e61676564566572696679437573746f6d536563703235366b31000903656e76226d616e61676564456e636f6465536563703235366b314465725369676e6174757265000603656e760f6d616e616765644372656174654543000303656e7616676574507269764b6579427974654c656e6774684543000303656e76056164644543001903656e7608646f75626c654543000c03656e760b69734f6e43757276654543000603656e76136d616e616765645363616c61724d756c744543001603656e76176d616e616765645363616c6172426173654d756c744543000903656e76106d616e616765644d61727368616c4543000903656e761a6d616e616765644d61727368616c436f6d707265737365644543000903656e76126d616e61676564556e6d61727368616c4543000903656e761c6d616e61676564556e6d61727368616c436f6d707265737365644543000903656e76146d616e6167656447656e65726174654b65794543000903656e76106d42756666657253657452616e646f6d000203656e76136d42756666657253657442797465536c696365000903656e76176d616e6167656447657445534454546f6b656e44617461001a03656e760d626967496e744973496e743634000303656e760e626967496e74476574496e743634000d03656e760a626967496e745369676e000303656e76136d42756666657247657442797465536c696365000903656e76106d616e616765644173796e6343616c6c000703d805d6050802030805010700110302110b020107060104020107010700080501030104010301010301010301010e04071207010e1b08080f05080805080902100307000706080606060601060306030601060606030602020602030201060c0603060408040609090105050500010301010101050105051c0509010501010403080707040404010c0806010001070b01050505050304040303070604010117021d0101030202010102030402070303020102020207090108010103030d100303030303010b050401010104040502020102070602020104040201070102020602040602060702040206020201010901010701030704010102040107060602020201020404020404010407040101050b01030e021710031e10020204020205080304030702051f0202020f010312070f0f20010612040c210113020503030501010105010c0301052202040504040302010505050501030808080508050801010105080105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000230e24042505030100030616037f01418080080b7f0041dde6080b7f0041e0e6080b07a64a9803066d656d6f7279020004696e697400ce031070616e6963576974684d65737361676500cf030a636f756e745f6f6e657300d10319656e64706f696e745f776974685f6d757461626c655f61726700d2030d737172745f6269675f75696e7400d3030d6c6f67325f6269675f75696e7400d4030b706f775f6269675f696e7400d5030c706f775f6269675f75696e7400d6030f6269675f75696e745f746f5f75363400d7031562696775696e745f6f76657277726974655f75363400d8030d6269675f75696e745f7a65726f00d903136269675f75696e745f66726f6d5f7536345f3100da031162696775696e745f66726f6d5f7531323800db031c6269675f75696e745f66726f6d5f6d616e616765645f62756666657200dc030c6269675f696e745f7a65726f00dd03126269675f696e745f66726f6d5f6936345f3100de030f6269675f75696e745f65715f75363400df030e6269675f696e745f746f5f69363400e00314626967696e745f6f76657277726974655f69363400e103106269675f696e745f746f5f706172747300e203146269675f696e745f66726f6d5f62696775696e7400e3030b6164645f6269675f696e7400e403146164645f6269675f696e745f6269675f75696e7400e503146164645f6269675f75696e745f6269675f696e7400e603186164645f6269675f696e745f6269675f75696e745f72656600e703186164645f6269675f75696e745f6269675f696e745f72656600e8030f6164645f6269675f696e745f72656600e9030c6164645f6269675f75696e7400ea03106164645f6269675f75696e745f72656600eb030b7375625f6269675f696e7400ec030f7375625f6269675f696e745f72656600ed030c7375625f6269675f75696e7400ee03107375625f6269675f75696e745f72656600ef030b6d756c5f6269675f696e7400f0030f6d756c5f6269675f696e745f72656600f1030c6d756c5f6269675f75696e7400f203106d756c5f6269675f75696e745f72656600f3030b6469765f6269675f696e7400f4030f6469765f6269675f696e745f72656600f5030c6469765f6269675f75696e7400f603106469765f6269675f75696e745f72656600f7030b72656d5f6269675f696e7400f8030f72656d5f6269675f696e745f72656600f9030c72656d5f6269675f75696e7400fa031072656d5f6269675f75696e745f72656600fb03126164645f61737369676e5f6269675f696e7400fc03166164645f61737369676e5f6269675f696e745f72656600fd03136164645f61737369676e5f6269675f75696e7400fe03176164645f61737369676e5f6269675f75696e745f72656600ff03127375625f61737369676e5f6269675f696e74008004167375625f61737369676e5f6269675f696e745f726566008104137375625f61737369676e5f6269675f75696e74008204177375625f61737369676e5f6269675f75696e745f726566008304126d756c5f61737369676e5f6269675f696e74008404136d756c5f61737369676e5f6269675f75696e74008504126469765f61737369676e5f6269675f696e74008604136469765f61737369676e5f6269675f75696e740087041272656d5f61737369676e5f6269675f696e740088041372656d5f61737369676e5f6269675f75696e74008904106269745f616e645f6269675f75696e74008a04146269745f616e645f6269675f75696e745f726566008b040f6269745f6f725f6269675f75696e74008c04136269745f6f725f6269675f75696e745f726566008d04106269745f786f725f6269675f75696e74008e04146269745f786f725f6269675f75696e745f726566008f04176269745f616e645f61737369676e5f6269675f75696e74009004166269745f6f725f61737369676e5f6269675f75696e74009104176269745f786f725f61737369676e5f6269675f75696e740092040c7368725f6269675f75696e74009304107368725f6269675f75696e745f7265660094040c73686c5f6269675f75696e740095041073686c5f6269675f75696e745f726566009604137368725f61737369676e5f6269675f75696e740097041373686c5f61737369676e5f6269675f75696e74009804136765745f626c6f636b5f74696d657374616d700099040f6765745f626c6f636b5f6e6f6e6365009a040f6765745f626c6f636b5f726f756e64009b040f6765745f626c6f636b5f65706f6368009c04156765745f626c6f636b5f72616e646f6d5f73656564009d04186765745f707265765f626c6f636b5f74696d657374616d70009e04146765745f707265765f626c6f636b5f6e6f6e6365009f04146765745f707265765f626c6f636b5f726f756e6400a004146765745f707265765f626c6f636b5f65706f636800a1041a6765745f707265765f626c6f636b5f72616e646f6d5f7365656400a2040a6765745f63616c6c657200a304116765745f6f776e65725f6164647265737300a404146765745f73686172645f6f665f6164647265737300a5041169735f736d6172745f636f6e747261637400a604136765745f73746174655f726f6f745f6861736800a7040b6765745f74785f6861736800a8040c6765745f6761735f6c65667400a9041f6765745f63756d756c617465645f76616c696461746f725f7265776172647300aa04116765745f636f64655f6d6574616461746100ab041369735f6275696c74696e5f66756e6374696f6e00ac0410636f6465635f6572725f66696e69736800ad0415636f6465635f6572725f73746f726167655f6b657900ae0415636f6465635f6572725f73746f726167655f67657400af0415636f6465635f6572725f73746f726167655f73657400b00415636f6465635f6572725f6576656e745f746f70696300b10414636f6465635f6572725f6576656e745f6461746100b20417636f6465635f6572725f636f6e74726163745f696e697400b30417636f6465635f6572725f636f6e74726163745f63616c6c00b4040e636f6d707574655f73686132353600b50411636f6d707574655f6b656363616b32353600b60411636f6d707574655f726970656d6431363000b704147665726966795f626c735f7369676e617475726500b804187665726966795f656432353531395f7369676e617475726500b9041a7665726966795f736563703235366b315f7369676e617475726500ba04217665726966795f637573746f6d5f736563703235366b315f7369676e617475726500bb041f636f6d707574655f736563703235366b315f6465725f7369676e617475726500bc04086563686f5f75363400bd04086563686f5f69363400be04086563686f5f69333200bf04086563686f5f75333200c0040a6563686f5f6973697a6500c104076563686f5f693800c204076563686f5f753800c304096563686f5f626f6f6c00c4040d6563686f5f6f70745f626f6f6c00c5040c6563686f5f6e6f7468696e6700c6040d6563686f5f61727261795f753800c704146563686f5f6d756c74695f76616c75655f75333200c804176563686f5f6d756c74695f76616c75655f7475706c657300c904126563686f5f7365725f6578616d706c655f3200ca04106563686f5f73696d706c655f656e756d00cb041c66696e6973685f73696d706c655f656e756d5f76617269616e745f3100cc04136563686f5f6e6f6e5f7a65726f5f7573697a6500cd041c6563686f5f736f6d655f617267735f69676e6f72655f6f746865727300ce040d6563686f5f617272617976656300cf040d6563686f5f6269675f75696e7400d0040c6563686f5f6269675f696e7400d104136563686f5f6d616e616765645f62756666657200d204146563686f5f6d616e616765645f6164647265737300d304186563686f5f6269675f696e745f6d616e616765645f76656300d404126563686f5f6269675f696e745f7475706c6500d504136563686f5f6269675f696e745f6f7074696f6e00d6041b6563686f5f7475706c655f696e746f5f6d756c7469726573756c7400d7041f6563686f5f6d616e616765645f7665635f6f665f6d616e616765645f76656300d804246563686f5f6d616e616765645f7665635f6f665f746f6b656e5f6964656e74696669657200d9041f6563686f5f6d616e616765645f6173796e635f726573756c745f656d70747900da04176563686f5f7661726167735f6d616e616765645f73756d00db0412636f6d707574655f6765745f76616c75657300dc0411636f6d707574655f6372656174655f656300dd0415636f6d707574655f6765745f65635f6c656e67746800de0420636f6d707574655f6765745f707269765f6b65795f627974655f6c656e67746800df040e636f6d707574655f65635f61646400e00411636f6d707574655f65635f646f75626c6500e10416636f6d707574655f69735f6f6e5f63757276655f656300e20413636f6d707574655f7363616c61725f6d756c7400e30418636f6d707574655f7363616c61725f626173655f6d756c7400e40412636f6d707574655f6d61727368616c5f656300e5041d636f6d707574655f6d61727368616c5f636f6d707265737365645f656300e60414636f6d707574655f756e6d61727368616c5f656300e7041f636f6d707574655f756e6d61727368616c5f636f6d707265737365645f656300e80417636f6d707574655f67656e65726174655f6b65795f656300e904096c6f674576656e744100ea040f6c6f674576656e744152657065617400eb04096c6f674576656e744200ec04136f6e6c795f6f776e65725f656e64706f696e7400ed041a6f6e6c795f757365725f6163636f756e745f656e64706f696e7400ee040e726571756972655f657175616c7300ef040873635f70616e696300f004136d616464726573735f66726f6d5f617272617900f1041c6d616464726573735f66726f6d5f6d616e616765645f62756666657200f2040b6d6275666665725f6e657700f3040e6d6275666665725f636f6e63617400f404126d6275666665725f636f70795f736c69636500f504126d6275666665725f7365745f72616e646f6d00f6040a6d6275666665725f657100f704146d616e616765645f616464726573735f7a65726f00f804126d616e616765645f616464726573735f657100f9040f6d616e616765645f7665635f6e657700fa04186d616e616765645f7665635f62696775696e745f7075736800fb04166d616e616765645f7665635f62696775696e745f657100fc04186d616e616765645f7665635f616464726573735f7075736800fd040f6d616e616765645f7665635f73657400fe04126d616e616765645f7665635f72656d6f766500ff04106d616e616765645f7665635f66696e64008005146d616e616765645f7665635f636f6e7461696e73008105146d616e616765645f7265665f6578706c696369740082051073746f726167655f726561645f7261770083051173746f726167655f77726974655f7261770084051973746f726167655f726561645f66726f6d5f616464726573730085050a6c6f61645f62797465730086050d6c6f61645f6269675f75696e740087050c6c6f61645f6269675f696e74008805086c6f61645f7536340089050a6c6f61645f7573697a65008a05086c6f61645f693634008b05096c6f61645f626f6f6c008c05096c6f61645f61646472008d050d6c6f61645f6f70745f61646472008e051169735f656d7074795f6f70745f61646472008f050f6765745f6e725f746f5f636c65617200900513636c6561725f73746f726167655f76616c75650091050a6c6f61645f7365725f32009205096c6f61645f6d617031009305096c6f61645f6d617032009405096c6f61645f6d617033009505156c6f61645f66726f6d5f616464726573735f7261770096050b73746f72655f62797465730097050e73746f72655f6269675f75696e740098050d73746f72655f6269675f696e740099050b73746f72655f7573697a65009a050973746f72655f693332009b050973746f72655f753634009c050973746f72655f693634009d050a73746f72655f626f6f6c009e050a73746f72655f61646472009f050e73746f72655f6f70745f6164647200a0050b73746f72655f7365725f3200a1050a73746f72655f6d61703100a2050a73746f72655f6d61703200a3050a73746f72655f6d61703300a4051273746f72655f72657365727665645f69363400a5051773746f72655f72657365727665645f6269675f75696e7400a6051573746f72655f72657365727665645f7665635f753800a7051b616464726573735f746f5f69645f6d61707065725f6765745f696400a80524616464726573735f746f5f69645f6d61707065725f6765745f69645f6e6f6e5f7a65726f00a90520616464726573735f746f5f69645f6d61707065725f6765745f6164647265737300aa051d616464726573735f746f5f69645f6d61707065725f636f6e7461696e7300ab0518616464726573735f746f5f69645f6d61707065725f73657400ac0525616464726573735f746f5f69645f6d61707065725f6765745f69645f6f725f696e7365727400ad0521616464726573735f746f5f69645f6d61707065725f72656d6f76655f62795f696400ae0526616464726573735f746f5f69645f6d61707065725f72656d6f76655f62795f6164647265737300af050d6765744c6973744d617070657200b005126c6973744d6170706572507573684261636b00b105136c6973744d61707065725075736846726f6e7400b305126c6973744d6170706572506f7046726f6e7400b405116c6973744d6170706572506f704261636b00b5050f6c6973744d617070657246726f6e7400b6050e6c6973744d61707065724261636b00b705136c6973744d617070657250757368416674657200b805146c6973744d6170706572507573684265666f726500b905146c6973744d617070657252656d6f76654e6f646500ba05186c6973744d617070657252656d6f76654e6f64654279496400bb05126c6973744d617070657253657456616c756500bc05166c6973744d617070657253657456616c75654279496400bd05176c6973744d617070657249746572617465427948616e6400be05176c6973744d61707065724974657261746542794974657200bf050c71756575655f6d617070657200c0051671756575655f6d61707065725f707573685f6261636b00c1051671756575655f6d61707065725f706f705f66726f6e7400c2051271756575655f6d61707065725f66726f6e7400c3050a6d61705f6d617070657200c4050f6d61705f6d61707065725f6b65797300c505116d61705f6d61707065725f76616c75657300c605116d61705f6d61707065725f696e7365727400c705176d61705f6d61707065725f636f6e7461696e735f6b657900c8050e6d61705f6d61707065725f67657400c905116d61705f6d61707065725f72656d6f766500ca052c6d61705f6d61707065725f656e7472795f6f725f64656661756c745f7570646174655f696e6372656d656e7400cb05226d61705f6d61707065725f656e7472795f6f725f696e736572745f64656661756c7400cc051b6d61705f6d61707065725f656e7472795f616e645f6d6f6469667900cd05236d61705f6d61707065725f656e7472795f6f725f696e736572745f776974685f6b657900ce05176d61705f73746f726167655f6d61707065725f7669657700cf05216d61705f73746f726167655f6d61707065725f696e736572745f64656661756c7400d0051f6d61705f73746f726167655f6d61707065725f636f6e7461696e735f6b657900d105166d61705f73746f726167655f6d61707065725f67657400d2051f6d61705f73746f726167655f6d61707065725f696e736572745f76616c756500d3051c6d61705f73746f726167655f6d61707065725f6765745f76616c756500d405196d61705f73746f726167655f6d61707065725f72656d6f766500d505186d61705f73746f726167655f6d61707065725f636c65617200d605346d61705f73746f726167655f6d61707065725f656e7472795f6f725f64656661756c745f7570646174655f696e6372656d656e7400d705386d61705f73746f726167655f6d61707065725f656e7472795f616e645f6d6f646966795f696e6372656d656e745f6f725f64656661756c7400d8052a6d61705f73746f726167655f6d61707065725f656e7472795f6f725f64656661756c745f75706461746500d9050a7365745f6d617070657200da05117365745f6d61707065725f696e7365727400db05137365745f6d61707065725f636f6e7461696e7300dc05117365745f6d61707065725f72656d6f766500dd05107365745f6d61707065725f66726f6e7400de050f7365745f6d61707065725f6261636b00df050f7365745f6d61707065725f6e65787400e005137365745f6d61707065725f70726576696f757300e1051e7365745f6d61707065725f697465725f66726f6d5f616e645f636f756e7400e2051a6d61705f6d795f73696e676c655f76616c75655f6d617070657200e305226d795f73696e676c655f76616c75655f6d61707065725f696e6372656d656e745f3100e405226d795f73696e676c655f76616c75655f6d61707065725f696e6372656d656e745f3200e5052c6d795f73696e676c655f76616c75655f6d61707065725f73756274726163745f776974685f7265717569726500e605236d795f73696e676c655f76616c75655f6d61707065725f7365745f69665f656d70747900e70519636c6561725f73696e676c655f76616c75655f6d617070657200e805246765745f66726f6d5f616464726573735f73696e676c655f76616c75655f6d617070657200e9052769735f656d7074795f61745f616464726573735f73696e676c655f76616c75655f6d617070657200ea05237261775f627974655f6c656e6774685f73696e676c655f76616c75655f6d617070657200eb05207365745f73696e676c655f76616c75655f6d61707065725f776974685f6b657900ec050a7665635f6d617070657200ed050f7665635f6d61707065725f7075736800ee050e7665635f6d61707065725f67657400ef05197665635f6d61707065725f6765745f61745f6164647265737300f0050e7665635f6d61707065725f6c656e00f105197665635f6d61707065725f6c656e5f61745f6164647265737300f20514746f6b656e5f617474726962757465735f73657400f30517746f6b656e5f617474726962757465735f75706461746500f4051f746f6b656e5f617474726962757465735f6765745f6174747269627574657300f5051a746f6b656e5f617474726962757465735f6765745f6e6f6e636500f60516746f6b656e5f617474726962757465735f636c65617200f7051f746f6b656e5f617474726962757465735f6861735f6174747269627574657300f805106164645f746f5f77686974656c69737400f9051572656d6f76655f66726f6d5f77686974656c69737400fa050e636865636b5f636f6e7461696e7300fb0519636865636b5f636f6e7461696e735f61745f6164647265737300fc0510726571756972655f636f6e7461696e7300fd051b726571756972655f636f6e7461696e735f61745f6164647265737300fe051f69737375655f66756e6769626c655f64656661756c745f63616c6c6261636b00ff051e69737375655f66756e6769626c655f637573746f6d5f63616c6c6261636b0080062069737375655f616e645f7365745f616c6c5f726f6c65735f66756e6769626c65008106187365745f6c6f63616c5f726f6c65735f66756e6769626c650082060d6d696e745f66756e6769626c65008306166d696e745f616e645f73656e645f66756e6769626c650084060d6275726e5f66756e6769626c65008506146765745f62616c616e63655f66756e6769626c650086061b726571756972655f73616d655f746f6b656e5f66756e6769626c650087061f726571756972655f616c6c5f73616d655f746f6b656e5f66756e6769626c650088061267657446756e6769626c65546f6b656e49640089061c69737375655f616e645f7365745f616c6c5f726f6c65735f6d657461008a06176d61707065725f6e66745f7365745f746f6b656e5f6964008b06116d61707065725f6e66745f637265617465008c061a6d61707065725f6e66745f6372656174655f616e645f73656e64008d06176d61707065725f6e66745f6164645f7175616e74697479008e06206d61707065725f6e66745f6164645f7175616e746974795f616e645f73656e64008f060f6d61707065725f6e66745f6275726e009006166d61707065725f6e66745f6765745f62616c616e63650091061b6d61707065725f6765745f746f6b656e5f61747472696275746573009206156765744e6f6e46756e6769626c65546f6b656e496400930615696e69745f756e697175655f69645f6d617070657200940614756e697175655f69645f6d61707065725f6765740095061c756e697175655f69645f6d61707065725f737761705f72656d6f766500960614756e697175655f69645f6d61707065725f73657400970610756e697175655f69645f6d617070657200980614756e6f7264657265645f7365745f6d61707065720099061b756e6f7264657265645f7365745f6d61707065725f696e73657274009a061d756e6f7264657265645f7365745f6d61707065725f636f6e7461696e73009b061b756e6f7264657265645f7365745f6d61707065725f72656d6f7665009c06116d616e616765645f7374727563745f6571009d060c6f766572666c6f775f753136009e060f6e6f5f6f766572666c6f775f693136009f060c6f766572666c6f775f69313600a00615746f6b656e5f6964656e7469666965725f65676c6400a1061b746f6b656e5f6964656e7469666965725f69735f76616c69645f3100a2061b746f6b656e5f6964656e7469666965725f69735f76616c69645f3200a306136e6f6e5f7a65726f5f7573697a655f6974657200a406146e6f6e5f7a65726f5f7573697a655f6d6163726f00a5061472657475726e735f65676c645f646563696d616c00a606147365745f636f6e74726163745f6164647265737300a7061369735f656d7074795f61745f6164647265737300a80613636f6e7461696e735f61745f6164647265737300a9060e6c656e5f61745f6164647265737300aa060f6e6578745f61745f6164647265737300ab061370726576696f75735f61745f6164647265737300ac061066726f6e745f61745f6164647265737300ad060f6261636b5f61745f6164647265737300ae060f6b6579735f61745f6164647265737300af061176616c7565735f61745f6164647265737300b0061d636f6e7461696e735f756e6f7264657265645f61745f6164647265737300b1060c6765745f62795f696e64657800b2060f66696c6c5f7365745f6d617070657200b3060f66696c6c5f6d61705f6d617070657200b4061966696c6c5f756e6f7264657265645f7365745f6d617070657200b506206765745f76616c75655f66726f6d5f616464726573735f776974685f6b65797300b606186d616e616765645f646563696d616c5f6164646974696f6e00b7061b6d616e616765645f646563696d616c5f7375627472616374696f6e00b806126d616e616765645f646563696d616c5f657100b906156d616e616765645f646563696d616c5f7472756e6300ba061e6d616e616765645f646563696d616c5f696e746f5f7261775f756e69747300bb06126d616e616765645f646563696d616c5f6c6e00bc06146d616e616765645f646563696d616c5f6c6f673200bd060863616c6c4261636b00be060e6f766572666c6f775f7573697a65009e060b6f766572666c6f775f7538009e060c6f766572666c6f775f753332009e060c6f766572666c6f775f753634009e060e6f766572666c6f775f6973697a6500a0060b6f766572666c6f775f693800a0060c6f766572666c6f775f69333200a0060c6f766572666c6f775f69363400a0061c69735f656d7074795f73696e676c655f76616c75655f6d617070657200e905136269675f75696e745f66726f6d5f7536345f3200da03126269675f696e745f66726f6d5f6936345f3200de03196563686f5f7661726167735f6d616e616765645f656167657200c8040a6563686f5f7573697a6500c004166d756c5f61737369676e5f6269675f696e745f726566008404176d756c5f61737369676e5f6269675f75696e745f726566008504166469765f61737369676e5f6269675f696e745f726566008604176469765f61737369676e5f6269675f75696e745f7265660087041672656d5f61737369676e5f6269675f696e745f7265660088041772656d5f61737369676e5f6269675f75696e745f7265660089041b6269745f616e645f61737369676e5f6269675f75696e745f7265660090041a6269745f6f725f61737369676e5f6269675f75696e745f7265660091041b6269745f786f725f61737369676e5f6269675f75696e745f726566009204177368725f61737369676e5f6269675f75696e745f7265660097041773686c5f61737369676e5f6269675f75696e745f7265660098040f706f775f6269675f696e745f72656600d50310706f775f6269675f75696e745f72656600d603116e6f5f6f766572666c6f775f7573697a65009f060e6e6f5f6f766572666c6f775f7538009f060f6e6f5f6f766572666c6f775f753332009f060f6e6f5f6f766572666c6f775f753634009f060f6e6f5f6f766572666c6f775f753136009f06116e6f5f6f766572666c6f775f6973697a65009f060e6e6f5f6f766572666c6f775f6938009f060f6e6f5f6f766572666c6f775f693332009f060f6e6f5f6f766572666c6f775f693634009f0611737172745f6269675f75696e745f72656600d303206269675f75696e745f66726f6d5f6d616e616765645f6275666665725f72656600dc03116c6f67325f6269675f75696e745f72656600d4030a5f5f646174615f656e6403010b5f5f686561705f6261736503020ad8fb02d6050a0041808008410f106f0b1101017f1071220220002001101f1a20020b1601017f1071220142001001200120012000100220010b2701027f41b89708280200220141016b2200200148044041b89708200036020020000f0b1075000b0d0020004116418f800810c2060b7301027f230041106b22022400027f410020011094012201108d020d001a2001100c41074604402002410036000b2002410036020820014100200241086a2203410710a7011a41012003410741809008410710d1010d011a0b41020b21032000200136020420002003360200200241106a24000b1b00200120034b04401075000b20002001360204200020023602000b060010d003000b0e01017f107122012000100120010b0f01017f10042201200010051a20010b0b0020002001100641004a0b0e01017f107122012000107a20010b0b0020002001108a0210010b1100200041024f0440200110771a0b20000b6a01047f230041106b2203240020012802042202047f200341086a20012802002204280200200441046a22052802002002107d2001200328020c360204200428020020052802002002107e210241010541000b21012000200236020420002001360200200341106a24000b890101027f230041206b220424002004410c6a22052001200241f18708410b200310d702220110e2022005200110e10221022004410c6a200110e1022103200428020c200428021010c001044020042d001c044041cce508410036020041d0e50841003a00000b2000200336020420002002360200200441206a24000f0b200141a58008410e108002000b14002000200141fc87084106200210d70210cc020b5d01037f230041106b2203240020012802042202047f200341086a2001280200220428020020021080012001200328020c36020420042802002002108101210241010541000b21012000200236020420002001360200200341106a24000b870101027f230041206b220324002003410c6a2204200141f18708410b200210d70222011093012004200110e10221022003410c6a200110e1022104200328020c200328021010c001044020032d001c044041cce508410036020041d0e50841003a00000b2000200436020420002002360200200341206a24000f0b200141a58008410e108002000b1200200041fc87084106200110d70210a9020b10002000200141db8008411b108301000b160020002001106f22002002200310141a20001000000b7501027f230041106b22022400200241086a2001107f024020002002280208410146047f200220012802082201280200200141086a280200200228020c22011085012002280200450d0120022802042103200020013602042000200336020841010541000b360200200241106a24000f0b108601000b2a002001200310be02047f2002200310bd02210341010541000b210120002003360204200020013602000b05001075000b080041014100106f0b0700200010071a0b0c0020012000108a0110081a0b0f01017f10712201200010321a20010b8e0102047f017e230041206b2202240020002001280200047f200141106a22032802002104200129020421062002410c6a2001280214280200200128020c2205108c0120032002411c6a280200360200200141086a200241146a2902003702002001200229020c370200200020043602102000200536020c2000200637020441010541000b360200200241206a24000b2401017f20002001200210eb02047f410005200041046a2001200210ec0241010b3602000b0c0020002001108e01108f010b0d0020001071220010131a20000b2d01017f2001100c2102200041003a00102000200236020c2000200136020820002002360204200041003602000b0c00200010910120011092010b0f01017f10712201200010291a20010b5101027f230041106b2202240020022000100c220341187420034180fe03714108747220034108764180fe03712003411876727236020c20012002410c6a41041085022001200010e701200241106a24000b0c0020002001109401108f010b0d0020001071220010351a20000b0c002000108a0120011092010b0900200020011003000b1500200020012002410b41d0830841c3830810c1060b190020012002106f2101200010af01360204200020013602000b1d0010af011a20022003107710b40120002002360204200020013602000b2301017f10af012204200310f8012002200410b40120002002360204200020013602000b1e0010af011a20022003108a0110b40120002002360204200020013602000b1701017e10214162102210ea0120002001109e011a10230b1500200020012002411241e8830841db830810c1060b1500200041622001200220031071220110091a20010b0c01017f10712200100a20000b0c01017f10712200100b20000b2e01027f107121032001100c2104200010a201200141bde608100d1a419de60841bde608200420022003100e20030b0b002000419de608100d1a0b0c01017f10712200100f20000b2b01017f41d8e5082d000022000440417541ffffffff0720001b0f0b41d8e50841013a00004175101041750bc201020a7f017e230041206b22012400024010a6012204100c41707141104604402004100c2105200141106a2106410121030340200241106a220720054b0d02200642003703002001420037030820042002200141086a2202411010a7011a2001410036021c200320022001411c6a220310a80121092002200310a901210b200141086a2001411c6a10a801210a20072102410021030d000b1075000b41d8810841221003000b2000200a36020c200020093602082000200b370300200141206a24000b2b01017f41dce5082d000022000440416b41ffffffff0720001b0f0b41dce50841013a0000416b1011416b0b0f002000200120032002106c4100470b800101037f230041106b220224002002410036020c02402001280200220441046a220320044f044020034111490d011075000b1075000b2002410c6a4104200020046a200320046b109e0220012003360200200228020c2100200241106a2400200041187420004180fe03714108747220004108764180fe0371200041187672720bb40102017e037f230041106b220324002003420037030802402001280200220541086a220420054f044020044111490d011075000b1075000b200341086a4108200020056a200420056b109e022001200436020020032903082102200341106a2400200242388620024280fe0383422886842002428080fc0783421886200242808080f80f834208868484200242088842808080f80f832002421888428080fc07838420024228884280fe038320024238888484840b0c00200010712200101220000b2e01017f41fa81084117106f22042000200110141a200441918208410310141a20042002200310141a20041000000b120010154504400f0b4194820841251003000b5d01027f027f410020012002200310ae01220445200441ebde0146720d001a200128020041d4e5082802004e044010af01210541010c010b20012002200310b001210541010b21012000200536020820002004360204200020013602000b120020002001200210b1012001200210bc010b1101017f1071220041014100101f1a20000b0e0020002001200210b101108e010b3001017f2000280200220341d4e5082802004e04402001200241b98208411110ab01000b2000200341016a36020020030b21002000108e012200100c41204704402001200241879008411010ab01000b20000b2c01017e2000101822034280808080087d42ffffffff6f5804402001200241b09008411210ab01000b2003a70b4601017f230041106b220224002002200141187420014180fe03714108747220014108764180fe03712001411876727236020c20002002410c6a410410141a200241106a24000b2f01017f10af0121030340200028020041d4e5082802004e450440200320002001200210b00110b4010c010b0b20030b0d00200041d58e08410b10b7010b0d0020002001200210b90110770b2b00200041c29008410e10b90110772200100c412047044041c29008410e41879008411010ab01000b20000b8b0101027f230041106b220324000240200028020822044180808080044904402003410036020c200028020020044102742003410c6a410410e301450d012001200241b98208411110ab01000b1075000b200328020c21012000200441016a360208200141187420014180fe03714108747220014108764180fe0371200141187672721077200341106a24000ba70101027f230041106b22022400027f200141d38f08410610ae01220341ebde0147410020031b450440200141d38f08410610b101108e0121012002410036020441040c010b027f200128020041d4e5082802004e044010af010c010b200141d38f08410610b0010b2101200220033602082002410136020441080b200241046a6a200136020020002002290204370200200041086a2002410c6a280200360200200241106a24000b0b0020002001200210bc010b2601017e20001017220342ffffffff0f5804402003a70f0b2001200241a58008410e10ab01000b2301017e20001017220342ff015804402003a70f0b2001200241a58008410e10ab01000b9e0101037f230041206b220124002001410c6a22022000108d01200241e48f08410a10bf0121002001410c6a41e48f08410a10bf0121022001410c6a41e48f08410a10bf012103200128020c200128021010c001044020012d001c044041cce508410036020041d0e50841003a00000b200141206a2400200041ff01712003411074200241ff017141087472720f0b41e48f08410a41a58008410e10ab01000b3001017f230041106b22032400200341003a000f20002003410f6a41012001200210c80120032d000f200341106a24000b0a002000200110c101450b1300200020014d0440200120006b0f0b1075000b1400200020002001200210c9012001200210d0010b3301017e027f0240200010172202420158044041002002a741016b0d021a0c010b2001410141b09008411210ab01000b41010b0b1000200041e58b08410110c2011081020b2601017e4100101822024280017d42ff7d5804402000200141b09008411210ab01000b2002a70ba60202037f017e230041206b22022400200241046a22032001108d01200341e48f08410a10c7012104200242003703182003200241186a410841e48f08410a10c80120022903182105200341e48f08410a10c901210110af0121030340200104402003200241046a41e48f08410a10c90110b401200141016b21010c010b0b2002280204200228020810c001044020022d0014044041cce508410036020041d0e50841003a00000b2000200336020c200020043602082000200542388620054280fe0383422886842005428080fc0783421886200542808080f80f834208868484200542088842808080f80f832005421888428080fc07838420054228884280fe03832005423888848484370300200241206a24000f0b41e48f08410a41a58008410e10ab01000b0e0020002001200210c2011082020b43000240200041086a200028020020012002109f024504402000280200220120026a220220014f0d011075000b2003200441fc8508410f10ab01000b200020023602000b5301017f230041106b220324002003410036020c20002003410c6a41042001200210c801200328020c2100200341106a2400200041187420004180fe03714108747220004108764180fe0371200041187672720b0c00200010712200101920000b0b0020002001200210b2010bf70102027f017e230041206b220324000240024041001016450d002003410c6a22044100108d010240024002400240024020042001200210bf0141ff017122040e0404010203000b2001200241b38008410d10ab01000b2003410c6a2001200210c901ad2105410121040c020b2003410c6a2001200210c901ad2003410c6a2001200210c901ad422086842105410221040c010b2003410c6a2001200210c901ad2105410321040b200328020c200328021010c001450d0120032d001c450d0041cce508410036020041d0e50841003a00000b2000200537020420002004360200200341206a24000f0b2001200241a58008410e10ab01000b0d00410041e88d08410110b3010b8f0101037f230041206b220324002003410c6a22042001108d0120042002410210c701210120042002410210c901210520042002410210c2012104200328020c200328021010c001044020032d001c044041cce508410036020041d0e50841003a00000b200020043602082000200536020420002001360200200341206a24000f0b2002410241a58008410e10ab01000b940101047f230041206b220324002000108e01210410af0121052004100c2100200341003a001c2003200036021820032004360214200320003602102003410036020c037f2006200010c101047f20052003410c6a2001200210c70110b40120032802102100200328020c21060c010520032d001c044041cce508410036020041d0e50841003a00000b200341206a240020050b0b0b6101027f230041106b22042400200441086a2000280208200028020022052001108302024020042802084101460440200120056a220120054f0d011075000b2002200341fc8508410f10ab01000b200428020c20002001360200200441106a24000b5301027f2001200346047f4100210302402001450d00034020002d0000220420022d00002205460440200041016a2100200241016a2102200141016b22010d010c020b0b200420056b21030b20030541010b450b1400200020014d04400f0b41ca820841121003000b1900200041d4e5082802004e04400f0b41ca820841121003000b1400101a20004604400f0b41dc820841191003000b1900200041d4e5082802004c04400f0b41b9820841111003000b0b0041d4e508101a3602000b2001017f200110d80121022000410036020820002002360204200020013602000b09002000100c4102760b2500200045044041014100101b0f0b1087012200410110da012001200010db0120001088010b2701017f230041106b22022400200220013a000f20002002410f6a4101108502200241106a24000b4601017f230041106b220224002002200041187420004180fe03714108747220004108764180fe03712000411876727236020c20012002410c6a4104108502200241106a24000b0a002000101c2001101c0b5001017f230041206b2201240020012000280200100c36021c20014100360218200120003602140340200141086a200141146a10de0120012802080440200128020c10071a0c010b0b200141206a24000b9c0101047f230041106b22032400027f02402001280204220241046a220420024f0440200420012802084d0d0141000c020b1075000b20012802002003410036020c28020020022003410c6a410410e3011a200328020c210220012004360204200241187420024180fe03714108747220024108764180fe037120024118767272210241010b21012000200236020420002001360200200341106a24000b4a01017f1087012101200028020020011095012000280204200110950120002802082001109501200028020c2001109501200028021020011095012000280214200110db0120011088010b2c01017f1087012101200028020820011092012000290300200110e101200028020c200110950120011088010b7801017f230041106b220224002002200042388620004280fe0383422886842000428080fc0783421886200042808080f80f834208868484200042088842808080f80f832000421888428080fc07838420004228884280fe038320004238888484843703082001200241086a4108108502200241106a24000b890101057f230041106b2202240010870121032000100c210502400340200141046a22042001490d01200420054d04402002410036020c200020012002410c6a410410e3011a200228020c220141187420014180fe03714108747220014108764180fe0371200141187672722003109501200421010c010b0b2003108801200241106a24000f0b1075000b0d00200020012002200310a7010b0d0020004504402001ad101d0b0b7a01017f0240024002400240200028020041016b0e03010203000b4200101d0f0b1087012201410110da012000280204200110db0120011088010f0b1087012201410210da012000280204200110db012000280208200110db0120011088010f0b1087012201410310da012000280204200110db0120011088010b2500200045044041014100101b0f0b1087012200410110da012000200110e70120001088010b09002000200110051a0b2000200020012002101e200010e90141ff017104400f0b4193830841301003000b1500410241012000106b22001b4100200041004e1b0b0a0041764200100141760b0d002000200120022003106d000b220020002001200210ed012000418c84084187840820031b4104410520031b10ed010b1701017f10af01220320012002101f1a2000200310b4010b4c01017f230041106b22032400200341086a20012802002001280204200210f70120012003290308370200200041086a200141086a28020036020020002001290200370200200341106a24000b3301027f200128020410af0122042002ad10f801200410b401200041086a200141086a280200360200200020012902003702000b0f0010af011a20012000107710b4010b900101027f230041306b22052400200541fb840841161098012005200136022c20052005290300370224200541186a2201200541246a2206200210ee012005410c6a22022001200310ee0120052802102004c04102742201419897086a280200200141a897086a28020010ed0120062002410010ef012000200528022c36020820002005290224370200200541306a24000b1a01027f10a001210041968508410a106f2201200010051a20010b1d01017f2002200028022046047f200020022001200210d1010541000b0b9d0101057f230041306b22022400200241286a22034200370300200241206a22044200370300200241186a2205420037030020024200370310200241086a2001100c2206200241106a41201074200141002002280208200228020c10e3011a20002006360220200041186a2003290300370000200041106a2004290300370000200041086a200529030037000020002002290310370000200241306a24000b0c0041a08508411c10f601000b0e0010af011a20002001108201000b17002002200310f90120002002360204200020013602000b3801017f230041106b2202240020024200370308200220014100200241086a10b103200020022802002002280204101f1a200241106a24000b0f0010af011a20002001107710b4010b930202067f017e230041206b22012400200029030021072000280210200028020c2000280208200141086a10fb01200128020c21052001280208210610af01210328020010772100280200107021022001200742388620074280fe0383422886842007428080fc0783421886200742808080f80f834208868484200742088842808080f80f832007421888428080fc07838420074228884280fe038320074238888484843702142001200041187420004180fe03714108747220004108764180fe0371200041187672723602102001200241187420024180fe03714108747220024108764180fe03712002411876727236021c2003200141106a411010141a280200200342002006200510201a200141206a24000b1801017f10af012101200010af01360204200020013602000bae0101047f200010fd01200028020c21022000280210210320002802142104230041206b220124002001200236020c2001200436021c200120033602182001200041186a36021420012001410c6a360210230041106b22022400200241bc850810fe0136020c230041106b22002400200141106a2201280200210320002002410c6a36020420002001290208370208200041046a220028020028020020032802002000280204200028020810eb01000b8a0101057f230041206b2201240010f20110870121022000280200210320002802042205200210d50220022003200510141a2000280208220310d801200210d50220012003100c36021c200141003602182001200041086a3602140340200141086a200141146a10de0120012802080440200128020c20021092010c010b0b200210b202200141206a24000b080020004120106f0b2f01017f2000100c220341084d044020004100200120036b41086a200310a7011a0f0b200241a58008410e108002000b2c01017f41ca8b08411b106f2203200010051a200341918208410310141a20032001200210141a20031000000b0d00200010712200102a1a20000b0d0020001071220010331a20000b1f0020012002200310042201102821022000200136020420002002453602000b5f01027f230041106b22032400200341086a2000280208200028020022042001108302024020032802084101460440200120046a220120044f0d011075000b200241fc8508410f108002000b200328020c20002001360200200341106a24000b0b0020002001200210141a0b0900200120001087020b1601017f10af0122022000ad10f8012001200210b4010b1e002001500440200010e90141016b0f0b417220011001200041721089020b1500417f200020011038220041004720004100481b0b150020004200530440418b860841111003000b20000b5301057f200142001024220242001024220342001024220442001024220542001024220610251a200020011026360214200020063602102000200536020c2000200436020820002003360204200020023602000b5c01017f027f027f419c8608200141e001460d001a2001418904470440200141800347044041002001418002470d031a41a086080c020b41a486080c010b41a886080b41041027210241010b210120002002360204200020013602000b07002000100c450b0c00200020002001100220000b1001017f1071220220002001100220020b0a0020002000200110020b0a00200020002001101e0b1301017f1071220220002001109302102b20020b0b0041722000ad100141720bb40101077f230041106b220424002001100c210703400240027f02402008220541ffffffff03470440200641046a220920074d0d0141000c020b1075000b2004410036020c200120062004410c6a410410e3011a200428020c220341187420034180fe03714108747220034108764180fe0371200341187672722002109502450d012005210341010b21012000200336020420002001360200200441106a24000f0b200541016a210820092106200521030c000b000b0e002000200110890241ff0171450b5301017f230041106b2204240020034102742203200241027422024f0440200441086a20012002200320026b108302200428020c21012000200428020836020020002001360204200441106a24000f0b1075000b3a01027f419c7f20006b2101200041dde5086a22022d00004504404172420a100141712000ad1001200141724171102b200241013a00000b20010b09002000102c4100470b0c00200020002001102d20000b0b0020002000200110e8010b0c00200020002001102e20000b1001017f1071220220002001102d20020b1001017f1071220220002001103020020bb40201067f200120034704401075000b2001220341104f04402000410020006b41037122046a210520040440200221010340200020012d00003a0000200141016a2101200041016a22002005490d000b0b2005200320046b2203417c7122066a21000240200220046a22044103710440200641004c0d012004410374220141187121072004417c71220841046a2102410020016b4118712109200828020021010340200520012007762002280200220120097472360200200241046a2102200541046a22052000490d000b0c010b200641004c0d0020042102034020052002280200360200200241046a2102200541046a22052000490d000b0b20034103712103200420066a21020b20030440200020036a21010340200020022d00003a0000200241016a2102200041016a22002001490d000b0b0bee0101037f230041106b2204240002400240027f024020002d000845044020002802002205100c22064190ce004b0d0141d0e5082d00000d0141cce508200636020041d0e50841013a0000200441086a200641bc97084190ce001074200541002004280208200428020c10e3011a20002d0008044041cce508410036020041d0e50841003a00000b200041013a00080b200120036a22002001490d024101200041cce5082802004b0d011a20004191ce004f0d0320022003200141bc97086a200020016b109e0241000c010b200041003a0008200520012002200310e3010b200441106a24000f0b1075000b1075000b1a00200020011031220136020420002001417f73411f763602000b0e01017f107122004200100120000b3701017f230041106b220224002002200110a302200228020021012000200229030837030820002001410047ad370300200241106a24000b2901027e2001106941004c047e4200052001106a210242010b210320002002370308200020033703000b0a0020001094011082020b0a0020001094011081020b09002000200010a7020b860102017e017f230041106b22032400200342003703082000109401200341086a200110ff0120032903082102200341106a2400200242388620024280fe0383422886842002428080fc0783421886200242808080f80f834208868484200242088842808080f80f832002421888428080fc07838420024228884280fe038320024238888484840b2301017e2000200010a70222014280025a0440200041a58008410e108002000b2001a70b2601017e2000200010a70222014280808080105a0440200041a58008410e108002000b2001a70b2101017f20001094012201100c41204704402000418790084110108002000b20010b3401017e027f02402000200010a7022201420158044041002001a741016b0d021a0c010b200041b090084112108002000b41010b0b0d002000416710351a4167100c0b0a0020002001ad10ae020b0b0020002001410010c0060b0b0020004101410010b0020b0d00200020012002106f10081a0b09002000200110b2020b09002000200110081a0b0c002000200110910110081a0b3200024002400240200141016b0e020102000b41014100200010b5020f0b418090084107200010b5020f0b2000200210b2020b0b0020022000200110b0020b1200416c41014100101f1a2000416c10081a0b0e002000200110712200103620000b0e0020002001416710364167100c0b0c002000200110ba0210b6020b1a0020001077220041dd8708410710141a2001200010db0120000b5602037f017e230041106b22042400200441086a20012802002205200128020822062002108501200429030821072006200210ba022003ad10ae0220052001280204200210bc021a20002007370300200441106a24000b2c01017f2000200210be0222034504402001200210c70221012000200210c6022001ad10ae020b20034101730b0c002000200110ba0210a9020b0c002000200110c9024100470b3401017f230041106b2202240020022001280200200128020410c0022000200228020436020420002001360200200241106a24000bc80101047f230041206b2203240020021077220241828808410510141a024002402001200210b802450440410021010c010b2003410c6a22042001200210e2022004200210e10221062003410c6a200210e10221012003410c6a200210e10221042003410c6a200210e1022105200328020c200328021010c001450d0120032d001c450d0041cce508410036020041d0e50841003a00000b2000200536020c200020043602082000200136020420002006360200200341206a24000f0b200241a58008410e108002000b2501017f2001280200200210be0221032000200236020820002001360204200020033602000b3d01017f230041106b22022400200241086a2000280200200041086a28020020011085012002280208450440108601000b200228020c200241106a24000b5301037f230041106b22022400200128020821042001280204210320002001280200047f200405200241086a20032004410010c40220022802082103200228020c0b36020420002003360200200241106a24000b3001017f230041106b22042400200441086a20012002200310bb022000200136020020002002360204200441106a24000b0c002000200110c60210af020b1a0020001077220041e48708410810141a2001200010db0120000bae0101047f230041206b22022400200241106a200010d9020240200228021c41016a220304402002200336021c024020022802102205450440200220033602140c010b200241086a200020022802182204108001200020042002280208200310da020b200020032004410010da0220022003360218200041fc87084106200310d702200110ad02200541016a22010d010b1075000b200220013602102000200241106a10db02200241206a240020030b3801027f230041106b220324002000200210c90222040440200341086a2001200410ca022000200210c5020b200341106a240020044100470b0c002000200110c60210a9020be40101037f230041306b2203240002402002047f200341186a20012002108001200328021c210420032802182105200341206a200110d902024020050440200341106a20012005108001200120052003280210200410da020c010b200320043602240b024020040440200341086a20012004108001200120042005200328020c10da020c010b200320053602280b2001200210d6022001200210810121042001200210d80220032802202202450d012003200241016b3602202001200341206a10db0241010541000b21012000200436020420002001360200200341306a24000f0b1075000b1f0020011077220141e48708410810141a2002200110db012000200110cc020ba10102017e017f230041106b22032400200342003703082000200110b702200341086a200110ff012003290308220242388620024280fe0383422886842002428080fc0783421886200242808080f80f834208868484200242088842808080f80f832002421888428080fc07838420024228884280fe0383200242388884848422024280808080105a0440200141a58008410e108002000b200341106a24002002a70b0e0020002001200210cb024100470b2a0002402002450d00200110a9022002490d002000200210cf02200310ad020f0b41f2940841121003000b1a0020001077220041ec8708410510141a2001200010d50220000b2801017f200110a90241016a220304402000200310cf02200210ad022001200310ad020f0b1075000b0c002000200110cf0210a9020b250002402002450d00200110a9022002490d002000200210d1020f0b41f2940841121003000b4a01017f02402001450d0020002802002202200028020810d4022001490d0020002802041077220041ec8708410510141a2001200010d5022002200010cc020f0b41f2940841121003000b09002000200110cc020b09002000200110db010b1200200041f18708410b200110d70210af020b18002000107722002001200210141a2003200010db0120000b1200200041fc87084106200110d70210af020bb60101057f230041206b2202240002400240200110dc02220110ac024504400c010b2002410c6a220320011093012003200110e10221062002410c6a200110e10221032002410c6a200110e10221042002410c6a200110e1022105200228020c200228021010c001450d0120022d001c450d0041cce508410036020041d0e50841003a00000b2000200536020c200020043602082000200336020420002006360200200241206a24000f0b200141a58008410e108002000b2500200041f18708410b200110d7022002108701220010db012003200010db01200010b2020b4e01017f200010dc0221022001280200220004402000108701220010db012001280204200010db012001280208200010db01200128020c200010db012002200010b2020f0b20024101410010b0020b130020001077220041828808410510141a20000b26002003047f200120022003107e210341010541000b210120002003360204200020013602000b25002002047f20012002108101210241010541000b210120002002360204200020013602000b2f01017f230041106b220224002002200128020010d9022000200228020436020420002001360200200241106a24000b3701017f230041206b22022400200241106a200110d902200241086a2001200228021410de0220002002290308370300200241206a24000b5101017f230041106b220224002002410036020c20002002410c6a41042001109703200228020c2100200241106a2400200041187420004180fe03714108747220004108764180fe0371200041187672720b0e0020002001200210b702108f010b190020001077220041968808410410141a20002001ad10ae020b15002000200120022003410020022003471b10ce020b2f0002402002450d00200110a9022002490d002000200210cf0210a9022200200220001b0f0b41f2940841121003000b1900200220011077220110920120001077200110e7024100470b09002000200110b8020b0f00200120001077220010920120000b0f002000200110e80210ac024100470bc80101047f230041206b22022400024020002001280204220510eb024504402002200010d9020240200128020c22030440200241106a22042000200310ec0220022001280208220136021820002003200410ed020c010b2002200128020822013602040b024020010440200241106a22042000200110ec022002200336021c20002001200410ed020c010b200220033602080b2000200510ee024101410010b00220022802002201450d012002200141016b3602002000200210db020b200241206a24000f0b1075000b0d002000200110ee0210ac02450ba70101047f230041206b220324002003410c6a22042001200210ee0222011093012004200110e10221022003410c6a200110e10221042003410c6a200110e10221052003410c6a200110e1022106200328020c200328021010c001044020032d001c044041cce508410036020041d0e50841003a00000b2000200636020c200020053602082000200436020420002002360200200341206a24000f0b200141a58008410e108002000b3b002000200110ee0210870121002002280200200010db012002280204200010db012002280208200010db01200228020c200010db01200010b2020b1a00200010772200419a8808410510141a2001200010db0120000b2401017f20002001280204220310eb024504402001200236020020002003200110ed020b0b810101027f230041306b22032400024020002001200210eb02047f4100052003411c6a20012002108c01200328021c450d01200341106a2202200341286a290200370300200320032902203703082001200341086a10ea022000410c6a20022903003702002000200329030837020441010b360200200341306a24000f0b108601000b2701017f230041106b220224002002200110d902200020012002280204108c01200241106a24000b4f01017f230041106b2203240020032001280200200141086a280200200210f3022003280200450440108601000b20002003290204370200200041086a2003410c6a280200360200200341106a24000b2401017f20002001200310be02047f200041046a2002200310f40241010541000b3602000b1f00200110772201419f8808410810141a2002200110db012000200110f5020b3501027f230041106b22022400200110772103200241086a200110a8032000200229030837020020002003360208200241106a24000b3c01027f200128020821032001280204210220012802004504402002280200200241046a280200200310bc021a0b20002003360204200020023602000b09002000420110f8020b0b0020002001410110c0060b09002000200110b3020b0800200010ac02450b16002000200210fc0210b6022000200110fd0210b6020b1a0020001077220041d99408410410141a2000200110e70120000b1a0020001077220041d39408410610141a2001200010e10120000b3e01017e200010ff0210a60242017c2202504504402000200110fc02200210ae022000200210fd02200110b102200010ff02200210ae0220020f0b1075000b130020001077220041dd9408410610141a20000b2f01017f2001200210fd02220110ac02047f200110aa02210141010541000b210320002001360204200020033602000b0c002000200110fc0210a6020b3801027f2000280208220220011083032203450440200028020020002802042200200110d00220022001200010a9021084030b20034101730b0c00200020011086034100470b0f00200020011085032002ad10ae020b1a0020001077220041c18808410610141a2001200010db0120000b0c002000200110850310a9020b4601017f230041106b22012400200141086a20001073024002400240200128020841016b0e020102000b200141106a24000f0b41c7880841181003000b41df880841141003000b0c01017f10712200102220000b1c0020002802004102460440200041046a0f0b41f3880841101003000b4001017f109f012002108b03210210af01220310f0012003200110f901200020033602082000411c411020021b360204200041c8890841b8890820021b3602000b10002000420010880241ff01714101460b270020012002108d03220142002003109d012000200336020c20004200370300200020013602080b180020004102460440200110770f0b41f3880841101003000b2d01017f230041106b22012400200141086a2000107320012802084101460440200010b6020b200141106a24000bfd03010a7f230041406a22062400200010870302402005280200450440200620002004108a030c010b200641086a200541086a280200360200200620052902003703000b2006428182848080a0c080013702102006410036020c20004101200610b402230041406a220024002006410c6a22052d000b210720052d000a210820052d0009210920052d0008210a20052d0007210b20052d0006210c20052d0005210d20052d0004210e20052802002105200041106a4191850841051098012000200136023c20002000290310370234200041286a2201200041346a220f200210ee01200041186a22022001200310ee01200041086a2000280218200028021c2004109b0120002000290308370318200f2002200510ef01200041206a22032000413c6a28020036020020002000290234370318200028021c2201419084084109200e10ec012001419984084107200d10ec01200141a084084108200c10ec01200141a884084107200b10ec01200141af84084107200a10ec01200141b68408410e200910ec01200141c48408410a200810ec01200141ce84084112200710ec01200641346a220220013602042002200328020036020820022000280218360200200041406b2400200641206a200641086a280200360200200620062902343703282006200628023c36022420062006290300370318200641186a10fc01000b0c002000200110910310a8020b1a00200010772200419f8a08410810141a2001200010920120000b0f002000200110910310ac024100470b210020001077220041928a08410510141a200120001094032002200010e10120000b2701017f230041106b22022400200220003a000f20012002410f6a4101108502200241106a24000b130020001077220041978a08410810141a20000ba60201037f230041206b22042400200441046a2205200120022003109303220110930120052005200110e10220011084021082022106200442003703182005200441186a4108200110970320042903182103200441046a200110e102210210af0121050340200204402005200441046a200110e10210b401200241016b21020c010b0b2004280204200428020810c001044020042d0014044041cce508410036020041d0e50841003a00000b2000200536020c200020063602082000200342388620034280fe0383422886842003428080fc0783421886200342808080f80f834208868484200342088842808080f80f832003421888428080fc07838420034228884280fe03832003423888848484370300200441206a24000f0b200141a58008410e108002000b41000240200041086a200028020020012002109f024504402000280200220120026a220220014f0d011075000b200341fc8508410f108002000b200020023602000b0e002000200120021099034101730b0f0020002001200210930310ac02450b33002000200120021093031087012100200328020820001095012003290300200010e1012003410c6a2000109b03200010b2020b5f01027f230041206b220224002000280200220310d801200110d50220022003100c36021c20024100360218200220003602140340200241086a200241146a10de0120022802080440200228020c200110db010c0105200241206a24000b0b0b900101017f230041206b2203240020001077220041a78a08410610141a200120001094032002280208108a0120001092012002290300200010e101200228020c220110d801200010d50220032001100c36021c2003410036021820032002410c6a3602140340200341086a200341146a10de0120032802080440200328020c200010db010c010b0b200341206a240020000b1000200020012002109c03200310ae020b0e00200020012002109c0310b6020beb0302047f017e230041e0006b2205240020012002108d03210810af01210110a1022102200510af01220736024c200541406b41fa8308410d109801200541386a200528024020052802442008109901200541306a2005280238200528023c2003109b01200541286a20052802302005280234200110f701200541206a2005280228200528022c2002109b01200541186a20052802202005280224200710f70120052802182101200528021c210210af011077210620042d0000200610940320042d0001200610940320042d000220061094032002200610b40102402007100c044020052007100c36025c200541003602582005200541cc006a3602540340200541106a200541d4006a10de012005280210450d02200541086a20012002200528021410f701200528020c2102200528020821010c000b000b10af01220441014100101f1a2002200410b4010b10214162102210ea0120012002109e01210110232005200136025010af01210220052001100c36025c200541003602582005200541d0006a36025403402005200541d4006a10de012005280200044020022005280204107710b4010c010b0b200541d4006a2201200210d701200141dc8508410b10b90141dc8508410b10a00321092000200336020c2000200937030020002008360208200541e0006a24000ba30102017e027f230041106b22042400200442003703082000100c220541094f04402001200241a58008410e10ab01000b20004100200420056b41106a200510a7011a20042903082103200441106a2400200342388620034280fe0383422886842003428080fc0783421886200342808080f80f834208868484200342088842808080f80f832003421888428080fc07838420034228884280fe038320034238888484840b4101017f230041206b220224002002200036021820022001410c6a3602142002200141086a36021020022001290300370308200241086a10fa01200241206a24000b270020012002108d03220120032004109d012000200436020c20002003370300200020013602080b1401017f10af01220220002001106f10b40120020bba0101037f230041406a22012400200141186a200041046a220210df02200120012903183702300340200141106a200141306a107f200128021004402000280200200128021410c5020c0105200141206a200228020010d90220012802242100034020000440200141086a20022802002000108001200128020c2002280200200010d6022002280200200010d80221000c010b0b200141386a4200370300200142003703302002280200200141306a10db02200141406b24000b0b0b6b01037f230041106b22012400200010a6032102200141086a2000280208200028020022032002108302024020012802084101460440200220036a22022003490d01200128020c20002002360200200141106a24000f0b419f8108411941fc8508410f108301000b1075000b5501017f230041106b220124002001410036020c20002001410c6a4104419f8108411910ad03200128020c2100200141106a2400200041187420004180fe03714108747220004108764180fe0371200041187672720b5701017f230041206b22012400200141106a200041046a10df02200120012903103702180340200141086a200141186a107f200128020804402000280208200128020c10b9020c0105200010a403200141206a24000b0b0b1801017f20011077210220002001360204200020023602000b2101017f20011077220241968808410410141a20002002360204200020013602000b3501027f230041106b22022400200110772103200241086a200110a9032000200229030837020020002003360208200241106a24000b4f01017f230041206b2201240020012000280200100c36021c20014100360218200120003602140340200141086a200141146a10de0120012802080440200135020c101d0c010b0b200141206a24000b4e00024020002802002000280204107b41024704402001109802450d01200028020841022001107710b40220002001360204200041023602000f0b41df880841141003000b41f3880841101003000b43000240200041086a200028020020012002109f024504402000280200220120026a220220014f0d011075000b2003200441fc8508410f108301000b200020023602000b3201017f230041106b22012400200141003a000f20002001410f6a410141e58608412010ad0320012d000f200141106a24000b4001017f230041106b220224002002200136020c2002200036020803402002200241086a107f200228020004402002350204101d0c0105200241106a24000b0b0b4901027f20002802082102200028020421012000280200210003400240200120024d04402001417f470d011075000b0f0b2000280200200110d102ad101d200141016a21010c000b000baa0202047f027e2003200142388620014280fe0383422886842001428080fc0783421886200142808080f80f834208868484200142088842808080f80f832001421888428080fc07838420014238882208200142288822094280fe0383848484370000200041084100200142005322072002716b41ff017122042008a746220520042001423088a741ff01714671220620056a2006410020042009a741ff0171461b22056a2005410020042001422088a741ff0171461b22056a2005410020042001a72205411876461b22066a200641002004200541107641ff0171461b22066a200641002004200541087641ff0171461b22046a200441002001501b6a22042007200320044107716a2c0000410048732004410047712002716b22026b3602042000200220036a3602000b2e01017f230041106b22022400200241003a000f20002002410f6a4101200110970320022d000f200241106a24000bf40201037f230041d0006b220324002003200110f4010240200328022004400240200341b88908411010f301450440200341c88908411c10f3010d012000200236020820002001360204200041013602000c030b10d601410010d5012003410036023c200341406b2003413c6a10ba01200328023c10d3012003280244210420032802402105200341246a2201200210d70110d601200110b8012102200110b60121012003280228200328022c10d2010240200545044020014102200410b4020c010b200210b403200110b6020b200041003602000c020b10d601410010d5012003410036023c200341406b22052003413c6a41d38f08410610ad01200328023c10d30120032802402104200341306a2201200210d70110d601200110b8012102200110b60121012003280234200328023810d20102402004450440200510a50120014102200328024810b4020c010b200210b403200110b6020b200041003602000c010b200041003602000b200341d0006a24000b5f02037f017e230041206b22012400200141106a10a40110a202200128021004402001290318220450450440200141086a10fb01200128020c21022001280208210320002004107942002003200210371a0b200141206a24000f0b108601000b2801017f20011077210320002002107736020c2000200336020820002002360204200020013602000b2801017f20021077220341968808410410141a2000200336020820002002360204200020013602000b1000200010a201419de608103941004a0b11002000280200200128020010784101730b5001037f024020012d00080d0020012802002203200128020422044b0d00200320044f044041012102200141013a00080c010b410121022001200341016a3602000b20002003360204200020023602000b1c01027f41d09008410710a30310af0122022000ad10f8012002103a0b0f00200041b39108410a106f10f5020b3c01027f230041106b22012400200141086a41bd9108410a106f10a803200128020c21022000200128020836020020002002360204200141106a24000b3c01027f230041106b22012400200141086a41c79108410a106f10a903200128020c21022000200128020836020020002002360204200141106a24000b11002000200141c79108410a106f10b6030b3701017e200041979008410810b90141979008410810a00322014280808080105a044041979008410841a58008410e10ab01000b2001a70b0a0041989208410c106f0b0a0041cb92084116106f0b0a0041fd9208410b106f0b3d01037f230041106b22012400418893084112106f220210772103200141086a200210a8032000200129030837020020002003360208200141106a24000b0a00419a9308410b106f0b3601037f41a593084110106f22011077210220011077220341968808410410141a2000200336020420002001360200200020023602080b0a0041b593084110106f0b3101037f41b39108410a106f210220011077210320021077210420002001200210b50320002004360214200020033602100b11002000200141bd9108410a106f10b5030b3401037f41c593084114106f2102200110772103200210772104200041086a2001200210b60320002004360204200020033602000b0f00200041c593084114106f10aa030b0a0041d99308410f106f0b1600200041d99308410f106f360204200020013602000b0d002000411341e8930810c2060b0900103b410010d4010b0d00103b410010d40110d003000b0b0041889708410e1003000b1000103b410110d401410010177b101d0b4402027f017e103b410310d401410010aa012100410110172102410241b48c08410410bb01210141722002107a200020004172100220002000200110930210022000101c0b1e01027f103b410110d401410010aa01210010712201200010342001101c0b3801017f230041106b22002400103b410110d401200041086a410010aa0110a002200028020c410020002802081bad101d200041106a24000b1e00103b410210d401410010ca01410141848c08410110bb01109202103c0b1e00103b410210d401410010aa01410141848c08410110bb01109202101c0b3501017f230041106b22002400103b410110d4012000410010aa0110a2022000290300a704402000290308101d0b200041106a24000b1c01017f103b410210d401410010aa01220041011017107a2000101c0b0e00103b410010d40110a102101c0b1100103b410110d401410010171079101c0b3f01027f230041106b22002400103b410010d4012000427f3703082000427f370300416720004110101f1a41671071220110331a2001101c200041106a24000b1300103b410110d4014100108e01108202101c0b1701017f103b410010d40110712200420010012000103c0b1100103b410110d401410010181076103c0b2000103b410210d401410010aa0141011017108a0210880241ff017145ad103d0b3501017f230041106b22002400103b410110d4012000410010ca0110a3022000290300a704402000290308103d0b200041106a24000b1c01017f103b410210d401410010ca0122004101101810012000103c0b2b01037f103b410110d401410010ca01220010e901107122022000103ead42ff018342017d103d2002101c0b4101027f103b410210d4014102410141a08c08410410c501220041ff01711b41002000c041004e1b410110aa01210041ff017145044020002000103f0b2000103c0b1800103b410210d401410010ca01410110ca01108e02103c0b1800103b410210d401410010ca01410110aa01108e02103c0b1800103b410210d401410010aa01410110ca01108e02103c0b1800103b410210d401410010ca01410110aa01108f02103c0b1800103b410210d401410010aa01410110ca01108f02103c0b1800103b410210d401410010ca01410110ca01108f02103c0b1f01017f103b410210d401410010aa0122002000410110aa0110022000101c0b2701037f103b410210d401410010aa012100410110aa012101107122022000200110022002101c0b1f01017f103b410210d401410010ca0122002000410110ca01101e2000103c0b2701037f103b410210d401410010ca012100410110ca0121011071220220002001101e2002103c0b2001017f103b410210d401410010aa0122002000410110aa0110e8012000101c0b2801037f103b410210d401410010aa012100410110aa012101107122022000200110e8012002101c0b1f01017f103b410210d401410010ca0122002000410110ca0110302000103c0b2701037f103b410210d401410010ca012100410110ca012101107122022000200110302002103c0b1f01017f103b410210d401410010aa0122002000410110aa0110302000101c0b1800103b410210d401410010aa01410110aa01109d02101c0b1f01017f103b410210d401410010ca0122002000410110ca01102d2000103c0b2701037f103b410210d401410010ca012100410110ca0121011071220220002001102d2002103c0b1800103b410210d401410010aa01410110aa01109902101c0b1800103b410210d401410010aa01410110aa01109c02101c0b1f01017f103b410210d401410010ca0122002000410110ca0110402000103c0b2701037f103b410210d401410010ca012100410110ca012101107122022000200110402002103c0b1f01017f103b410210d401410010aa0122002000410110aa0110402000101c0b2701037f103b410210d401410010aa012100410110aa012101107122022000200110402002101c0b2501027f103b410210d401410010ca01410110ca012101107022002000200110022000103c0b2401027f103b410210d401410010ca01410110ca0121011070220020011090022000103c0b2401027f103b410210d401410010aa01410110aa0121011070220020011090022000101c0b2501027f103b410210d401410010aa01410110aa012101107022002000200110022000101c0b2501027f103b410210d401410010ca01410110ca0121011070220020002001101e2000103c0b2401027f103b410210d401410010ca01410110ca0121011070220020011091022000103c0b2401027f103b410210d401410010aa01410110aa012101107022002001109a022000101c0b2601027f103b410210d401410010aa01410110aa012101107022002000200110e8012000101c0b2501027f103b410210d401410010ca01410110ca012101107022002000200110302000103c0b2501027f103b410210d401410010aa01410110aa012101107022002000200110302000101c0b2501027f103b410210d401410010ca01410110ca0121011070220020002001102d2000103c0b2501027f103b410210d401410010aa01410110aa0121011070220020002001102d2000101c0b2501027f103b410210d401410010ca01410110ca012101107022002000200110402000103c0b2501027f103b410210d401410010aa01410110aa012101107022002000200110402000101c0b1f01017f103b410210d401410010aa0122002000410110aa0110412000101c0b2701037f103b410210d401410010aa012100410110aa012101107122022000200110412002101c0b1f01017f103b410210d401410010aa0122002000410110aa0110422000101c0b2701037f103b410210d401410010aa012100410110aa012101107122022000200110422002101c0b1f01017f103b410210d401410010aa0122002000410110aa0110432000101c0b2701037f103b410210d401410010aa012100410110aa012101107122022000200110432002101c0b2501027f103b410210d401410010aa01410110aa012101107022002000200110412000101c0b2501027f103b410210d401410010aa01410110aa012101107022002000200110422000101c0b2501027f103b410210d401410010aa01410110aa012101107022002000200110432000101c0b2501017f103b410210d401410010aa0122002000410141848c08410110bb01102f2000101c0b2d01037f103b410210d401410010aa012100410141848c08410110bb0121011071220220002001102f2002101c0b1e00103b410210d401410010aa01410141848c08410110bb01109b02101c0b2d01037f103b410210d401410010aa012100410141848c08410110bb0121011071220220002001102e2002101c0b2b01027f103b410210d401410010aa01410141848c08410110bb0121011070220020002001102f2000101c0b2b01027f103b410210d401410010aa01410141848c08410110bb0121011070220020002001102e2000101c0b0d00103b410010d4011044101d0b0d00103b410010d4011045101d0b0d00103b410010d4011046101d0b0d00103b410010d4011047101d0b1601017f103b410010d401107122001048200010071a0b0d00103b410010d4011049101d0b0d00103b410010d401104a101d0b0d00103b410010d401104b101d0b0d00103b410010d401104c101d0b1601017f103b410010d40110712200104d200010071a0b0f00103b410010d401109f0110071a0b0f00103b410010d40110a30110071a0b2000103b410110d401410041be8d08410710cb0110a201419de608104ead101d0b1a00103b410110d401410041be8d08410710cb0110b703ad103d0b1601017f103b410010d40110712200104f200010071a0b0f00103b410010d40110a00110071a0b0d00103b410010d4011021101d0b2a01017f103b410010d401416741989508410c101f1a4167416610351a41661071220010331a2000101c0b8d0101037f230041106b22002400103b410110d401410041be8d08410710cb0141671050200041003b010c4167100c220141034f044041ac8608411c1003000b200020012000410c6a41021074416741002000280200200028020410a7011a20002f010c210210870121012000200241850c713b010e20012000410e6a410210141a2001108801200041106a24000b1300103b410110d4014100108e011051ad103d0b1900103b410010d40141f58208411e41db8008411b108301000b2200103b410010d40141fb90084111106f1a41ad8708411a41f68008411e108301000b1b00103b410010d401418c91084113106f41c08008411b108002000b2200103b410010d401419f91084114106f1a41c78708411641db8008411b108301000b1d00103b410010d40141ec9008410f10a3031a41b28b08411810f601000b2100103b410010d40141de9008410e10a3031a10af011a419b8b084117108201000b1100103b410010d40110af011a10f501000b2601017f230041106b22002400103b410010d401200041086a41ef8b08410510980110f501000b1c01017f103b410110d4014100108e011071220010521a200010071a0b1c01017f103b410110d4014100108e011071220010531a200010071a0b1c01017f103b410110d4014100108e011071220010541a200010071a0b1b00103b410310d4014100108e014101108e014102108e0110551a0b1b00103b410310d4014100108e014101108e014102108e0110561a0b1e00103b410310d4014100108e014101108e014102108e01105745ad103d0b5601017f103b410410d4014100108e014101108e014102108e01024041031016450d00410341a88c08410910bd01220041ff01714105490d0041a88c08410941b38008410d10ab01000b200041ff0171105845ad103d0b2101017f103b410210d4014100108e014101108e011071220010591a200010071a0b0f00103b410110d40141001017101d0b0f00103b410110d40141001018103d0b0f00103b410110d40110cd01ac103d0b1700103b410110d401410041e88d08410110bb01ad101d0b3701017e103b410110d4014100101822004280808080087d42ffffffff6f58044041e88d08410141b09008411210ab01000b2000c4103d0b1600103b410110d40141e88d08410110c501adc2103d0b1b00103b410110d401410041e88d08410110bd01ad42ff0183101d0b1500103b410110d401410041e88d0810c301ad103d0bf80101037f103b410110d401027f230041206b220024002000410c6a22024100108d014102210102400240200028020c200028021010c00145044002400240200241e88d08410110bf0141ff01710e020100040b4100210102402000410c6a41e88d08410110bf0141ff01710e020100040b410121010b200028020c200028021010c001450d010b20002d001c044041cce508410036020041d0e50841003a00000b200041206a240020010c020b41e88d08410141a58008410e10ab01000b41e88d08410141b38008410d10ab01000b220141ff0171410246044041014100101b0f0b1087012200410110da012000200110da0120001088010b1100103b10d601410010d501410010d3010bd60102047f017e230041106b22032400103b410110d4012003410b6a2102230041206b2200240020004100108d0141042101034020014109470440200041146a20016a200041a78c08410110bf013a0000200141016a21010c010b0b2000290218210402402000280200200028020410c001044020002d0010044041cce508410036020041d0e50841003a00000b20022004a722013b0000200220044218883d0003200241026a20014110763a0000200041206a24000c010b41a78c08410141a58008410e10ab01000b20024105101b200341106a24000b800101037f230041106b22002400103b10d601410010d5012000410036020c2000410c6a210110af0121020340200128020041d4e5082802004804402002200141e88b08410110ae0110b4010c010b0b200028020c10d301200210d801210120002002360208200020013602042001ad101d200041086a10ab03200041106a24000bd20202047f017e230041406a22002400103b10d601410010d50120004100360234200041346a220341e88b08410110b5012101200028023410d30110af0121022003200110d701024002400340200028023c2000280238490440200041346a220141979008410810b9014172102a1a200041106a417210a3022000290310a74101470d02200029031822044280808080087d42ffffffff6f580d03200141979008410810b701210310af01210120004200370328200041086a20044101200041286a10b10320012000280208200028020c101f1a2002200110b4012002200310f9010c010b0b2000200236022820002002100c36023c200041003602382000200041286a3602340340200041206a200041346a10de0120002802200440200028022410071a0c010b0b200041406b24000f0b41979008410841e78508411510ab01000b41979008410841b09008411210ab01000b3001027f230041106b22002400103b410110d401200041046a220141f58f08410210cc01200110e501200041106a24000b4401017f103b410110d401024041001016450d00410041f58f08410210bd01220041ff01714103490d0041f58f08410241b38008410d10ab01000b2000ad42ff0183101d0b0d00103b410010d4014201101d0b3101017f103b410110d401410041f78f08410210bc01220045044041f78f08410241b38008410d10ab01000b2000ad101d0b9c0101057f230041106b22002400103b10d601410110d50110cd012000410136020c02402000410c6a2204220128020041d4e5082802004e0440410121020c010b200141f98f08410310b10141f98f08410310b30121010b20002001360204200020023602002000280204210120002802002102200441d4e508280200360200200028020c10d301ac103d20024504402001ac103d0b200041106a24000bf70201077f230041106b22022400103b410110d401230041406a22002400200041003602282000412c6a4100108d012000411c6a21044101210102400340200028022c22032000280230220610c0010d01200041003602082000412c6a200041086a410441f38f08410210c8012001410447044020042000280208220341187420034180fe03714108747220034108764180fe037120034118767272360200200441046a210420002001360228200141016a21010c010b0b41f38f084102419f9008411110ab01000b02402003200610c0010440200041106a2201200041246a2902003703002000200029021c37030820002d003c044041cce508410036020041d0e50841003a00000b20022000290308370200200241086a2001290300370200200041406b24000c010b41f38f08410241a58008410e10ab01000b200228020c41027421011087012100034020012005470440200220056a280200200010db01200541046a21050c010b0b2000108801200241106a24000b1000103b410110d401410010aa01101c0b1000103b410110d401410010ca01103c0b1100103b410110d4014100108e0110071a0b1700103b410110d401410041e68b08410210cb0110071a0bcb0201077f230041106b22042400103b410110d401230041206b220024004100108e01210610af0121032006100c2101200041003a001820002001360214200020063602102000200136020c20004100360208037f2005200110c101047f2000200041086a10c401220141187420014180fe03714108747220014108764180fe03712001411876727236021c20032000411c6a410410141a200028020c2101200028020821050c010520002d0018044041cce508410036020041d0e50841003a00000b200041206a240020030b0b210510870121012003100c210302400340200241046a22002002490d01200020034d04402004410036020c200520022004410c6a410410a7011a200428020c220241187420024180fe03714108747220024108764180fe0371200241187672722001109001200021020c010b0b2001108801200441106a24000f0b1075000bbb0101057f230041106b22012400103b410110d401200141086a2102230041206b220024002000410c6a22034100108d01200310c4012104200341e58b08410110c20121030240200028020c200028021010c001044020002d001c044041cce508410036020041d0e50841003a00000b2002200336020420022004360200200041206a24000c010b41e58b08410141a58008410e10ab01000b200128020c2001280208108701220010900120001092012000108801200141106a24000b890201067f230041106b22022400103b410110d401200241086a2103230041206b220024002000410c6a22054100108d0102400240200028020c200028021010c001450440024002400240200541e58b08410110bf0141ff017122010e020201000b41e58b08410141b38008410d10ab01000b2000410c6a10c4012104410121010b200028020c200028021010c001450d010b20002d001c044041cce508410036020041d0e50841003a00000b2003200436020420032001360200200041206a24000c010b41e58b08410141a58008410e10ab01000b0240200228020845044041014100101b0c010b200228020c1087012200410110da01200010900120001088010b200241106a24000b900201077f230041206b22012400103b410210d401410041d99408410410cb012104230041206b220024004101108e01210610af0121032006100c2102200041003a001c2000200236021820002006360214200020023602102000410036020c2001037f2005200210c101047f20032000410c6a41e98b08410310c20110b40120002802102102200028020c21050c010520002d001c044041cce508410036020041d0e50841003a00000b200041206a240020030b0b3602102001200436020c200410071a108701210020012003100c36021c200141003602182001200141106a36021403402001200141146a10de0120012802000440200128020420001092010c010b0b2000108801200141206a24000b9b0401097f230041106b22052400103b410110d401230041206b220024004100108e01210410af0121062004100c2101200041003a001820002001360214200020043602102000200136020c20004100360208037f2003200110c101047f200041086a41ed8b08410210c901210310af0121010340200304402000200041086a41ed8b08410210c901220441187420044180fe03714108747220044108764180fe03712004411876727236021c20012000411c6a410410141a200341016b21030c010b0b2000200141187420014180fe03714108747220014108764180fe03712001411876727236021c20062000411c6a410410141a200028020c2101200028020821030c010520002d0018044041cce508410036020041d0e50841003a00000b200041206a240020060b0b210410870121012004100c210702400340200241046a22032002490d01200320074d0440410021002005410036020820042002200541086a410410a7011a2005280208220241187420024180fe03714108747220024108764180fe0371200241187672722206100c410276200110d5022006100c21080340200041046a22022000490d03200220084b0440200321020c03052005410036020c200620002005410c6a410410a7011a200528020c220041187420004180fe03714108747220004108764180fe037120004118767272200110d502200221000c010b000b000b0b2001108801200541106a24000f0b1075000bd10201077f230041106b22042400103b410110d401230041206b220024004100108e01210610af0121032006100c2101200041003a001820002001360214200020063602102000200136020c20004100360208037f2005200110c101047f2000200041086a41ed8b08410210c201220141187420014180fe03714108747220014108764180fe03712001411876727236021c20032000411c6a410410141a200028020c2101200028020821050c010520002d0018044041cce508410036020041d0e50841003a00000b200041206a240020030b0b210510870121012003100c210302400340200241046a22002002490d01200020034d04402004410036020c200520022004410c6a410410a7011a200428020c220241187420024180fe03714108747220024108764180fe0371200241187672722001109201200021020c010b0b2001108801200441106a24000f0b1075000b4d01017f230041106b22002400103b10d601410010d50120004100360200200041046a200041ec8b08410110ad01200028020010d30120002802040440200028020c1000000b200041106a24000bd80101057f230041206b22002400103b10d601410010d50120004100360214200041146a220341e88b08410110b5012102200028021410d30110af0121012003200210d70102400340200028021c20002802184f0d01200041146a10bf032202200041146a10bf0322036a220420024f04402002200110870220032001108702200420011087020c010b0b1075000b2000200136021020002001100c36021c200041003602182000200041106a3602140340200041086a200041146a10de0120002802080440200028020c10071a0c010b0b200041206a24000b910101067f230041206b22002400103b410110d40120004100418d8e08410d10bb01108c020240200028020045044010a102210110a102210210a102210310a102210410a10221052000410036021c2000200536021820002004360214200020033602102000200236020c200020013602080c010b200041086a2000280204108b020b200041086a10df01200041206a24000b3101027f230041206b22002400103b410110d401200041086a22014100108e01105a108b02200110df01200041206a24000b4501027f230041106b22002400103b410110d401200041086a4100418d8e08410d10bb012201108c022000280208047f200028020c10260520010bad101d200041106a24000b4301017f230041106b22002400103b410110d401200041086a4100418d8e08410d10bb01108c022000280208047e200028020c105bad0542000b101d200041106a24000b8c0101087f230041106b22002400103b410510d4014100418d8e08410d10bb012101410110aa012103410210aa012104410310aa012105410410aa012106200041086a2001108c020240200028020845044010a102210110a10221020c010b200028020c210742001024220142001024220220072003200420052006105c0b2001200210dc01200041106a24000b7a01067f230041106b22002400103b410310d4014100418d8e08410d10bb012101410110aa012103410210aa012104200041086a2001108c020240200028020845044010a102210110a10221020c010b200028020c2105420010242201420010242202200520032004105d0b2001200210dc01200041106a24000b5c01047f230041106b22002400103b410310d4014100418d8e08410d10bb012101410110aa012102410210aa012103200041086a2001108c022000280208047e200028020c20022003105e41004aad0542000b103d200041106a24000b840101077f230041106b22002400103b410410d4014100418d8e08410d10bb012101410110aa012103410210aa0121044103108e012105200041086a2001108c020240200028020845044010a102210110a10221020c010b200028020c21064200102422014200102422022006200320042005105f1a0b2001200210dc01200041106a24000b7201057f230041106b22002400103b410210d4014100418d8e08410d10bb0121014101108e012103200041086a2001108c020240200028020845044010a102210110a10221020c010b200028020c21044200102422014200102422022004200310601a0b2001200210dc01200041106a24000b6801047f230041106b22002400103b410310d4014100418d8e08410d10bb012101410110aa012102410210aa012103200041086a2001108c020240200028020845044010af0121010c010b20022003200028020c1071220110611a0b200110071a200041106a24000b6801047f230041106b22002400103b410310d4014100418d8e08410d10bb012101410110aa012102410210aa012103200041086a2001108c020240200028020845044010af0121010c010b20022003200028020c1071220110621a0b200110071a200041106a24000b7201057f230041106b22002400103b410210d4014100418d8e08410d10bb0121014101108e012103200041086a2001108c020240200028020845044010a102210110a10221020c010b200028020c21044200102422014200102422022004200310631a0b2001200210dc01200041106a24000b7201057f230041106b22002400103b410210d4014100418d8e08410d10bb0121014101108e012103200041086a2001108c020240200028020845044010a102210110a10221020c010b200028020c21044200102422014200102422022004200310641a0b2001200210dc01200041106a24000b7401047f230041106b22002400103b410110d401200041086a4100418d8e08410d10bb01108c020240200028020845044010a102210210a102210310af0121010c010b200028020c210142001024220242001024220320011071220110651a0b2002101c2003101c200110071a200041106a24000b1700103b410110d401410041f48b08410410bb0110ba030b3201027f103b410110d401410041fc8b08410810bb01210103402000200146450440200010ba03200041016a21000c010b0b0bc90101057f230041206b22002400103b10d601410210d501410010aa012101410141f88b08410410cb01210420004102360214200041146a41f48b08410410b5012103200028021410d30141d79008410710a303210210af011a20022001108a0110b40110af011a20022004107710b4012000200336021010af011077210120002003100c36021c200041003602182000200041106a3602140340200041086a200041146a10de0120002802080440200028020c20011092010c010b0b20022001103a200041206a24000b1e00103b10a301109f0110784504404183940841241003000b410010d4010b1e00103b4167100a416710b703044041a79408412c1003000b410010d4010b2d00103b410210d401410041ec8b08410110bb01410141848c08410110bb0147044041858c08410e109601000b0b1300103b410010d40141938c08410d109601000bd70201087f230041206b22012400103b410110d401230041e0006b22002400200041046a4100108d01034020024120470440200041386a20026a200041046a41c28e08410510bf013a0000200241016a21020c010b0b200041306a2202200041d0006a2203290200370300200041286a2204200041c8006a2205290200370300200041206a2206200041406b22072902003703002000200029023837031802402000280204200028020810c00104402003200229030037030020052004290300370300200720062903003703002000200029031837033820002d0014044041cce508410036020041d0e50841003a00000b20012000290338370000200141186a200041d0006a290300370000200141106a200041c8006a290300370000200141086a200041406b290300370000200041e0006a24000c010b41c28e08410541a58008410e10ab01000b200110fe0110071a200141206a24000b2901017f103b410110d4014100108e012200100c4120470440418790084110109601000b200010071a0b0f00103b410010d40110af0110071a0b1f01017f103b410210d4014100108e0122004101108e0110051a200010071a0b4e01017f230041106b22002400103b410310d401200041086a4100108e01410141a98e08411110bb01410241a08e08410910bb0110830220002802080440200028020c10071a0b200041106a24000b2601027f103b410110d401410041ba8e08410810bb01210010712201200010661a200110071a0b1800103b410210d4014100108e014101108e011078ad103d0b1300103b410010d40141b8810810fe0110071a0b2400103b410210d4014100419d8e08410310cb014101419a8e08410310cb011078ad103d0b0f00103b410010d40110af0110e2010b2501017f103b410210d401410041ed8b08410210cf012200410110aa0110b401200010e2010bfa0102067f017e230041106b22012400103b410210d401420121060240410041d28d08410310cf012203410141cf8d08410310cf01220410780d0002402003100c22052004100c470d000340200220054f0d022001410036020820032002200141086a410410a7011a200128020821002001410036020c200420022001410c6a410410a7011a200041187420004180fe03714108747220004108764180fe037120004118767272200128020c220041187420004180fe03714108747220004108764180fe037120004118767272109502450d012002200241046a22004d0440200021020c010b0b1075000b420021060b2006103d200141106a24000bb40201077f230041106b22042400103b410210d401230041206b220024004100108e01210610af0121032006100c2101200041003a001c2000200136021820002006360214200020013602102000410036020c037f2005200110c101047f20032000410c6a412041ed8b08410210d00110b40120002802102101200028020c21050c010520002d001c044041cce508410036020041d0e50841003a00000b200041206a240020030b0b22054101418a8d08410410cb0110b40110870121012003100c210302400340200241046a22002002490d01200020034d04402004410036020c200520022004410c6a410410a7011a2001200428020c220241187420024180fe03714108747220024108764180fe03712002411876727210051a200021020c010b0b2001108801200441106a24000f0b1075000b960101047f230041106b22012400103b410310d401410041ed8b08410210cf012102410141b98d08410510bb012103410210aa012100024020034180808080044904402001200041187420004180fe03714108747220004108764180fe03712000411876727236020c2002200341027441042001410c6a10670d01200210e201200141106a24000f0b1075000b41d58d084113109601000ba10101057f230041106b22002400103b410210d401410041ed8b08410210cf012102410141b98d08410510bb01210120012002100c41027622044904400240027f200145044010af010c010b200041086a2002410020011096022000280208450d01200028020c0b210320002002200141016a20041096022000280200450d002003200028020410051a200310e201200041106a24000f0b0b41c88608411d1003000b6001037f230041106b22002400103b410210d401200041086a410041ed8b08410210cf01410110aa011094020240200028020845044041014100101b0c010b200028020c1087012201410110da01200110d50220011088010b200041106a24000b3e01017f230041106b22002400103b410210d401200041086a410041ed8b08410210cf01410110aa011094022000280208410047ad103d200041106a24000b930101037f230041106b22012400103b410210d401410041ed8b08410210cf0121000240410141b98d08410510bb0122024180808080044904402001410036020c200020024102742001410c6a410410a7010d01200128020c220041187420004180fe03714108747220004108764180fe0371200041187672721070101c200141106a24000f0b1075000b41c88608411d1003000b1400103b410110d4014100108e0110940110071a0b1600103b410210d4014100108e014101108e0110b1020b2400103b410210d401410041be8d08410710cb014101108e01416710364167107710071a0b1700103b410010d40141d19108410d106f10940110071a0b1600103b410010d40141ef91084108106f10a402101c0b1600103b410010d40141e891084107106f10a502103c0b1600103b410010d401418592084103106f10a602101d0b1700103b410010d40141e391084105106f10a902ad101d0b5301027f230041106b22002400103b410010d401418292084103106f22011094014172102a1a2000417210a3022000290300a74101470440200141e785084115108002000b2000290308103d200041106a24000b1700103b410010d401418892084104106f10ab02ad103d0b1700103b410010d40141d994084104106f10aa0210071a0bbd0101057f230041206b22002400103b410010d4012000410c6a220341e98d084108106f22011093010240200028020c200028021010c0014504400240024002402003200110b20341ff017122020e020201000b200141b38008410d108002000b410121022000410c6a4120200110840221040b200028020c200028021010c001450d010b20002d001c044041cce508410036020041d0e50841003a00000b20020440200410071a0b200041206a24000f0b200141a58008410e108002000b1800103b410010d40141e98d084108106f10ac0245ad103d0b1700103b410010d40141f79108410b106f10a902ad101d0b1400103b410010d40141f79108410b106f10b6020b810202037f017e230041206b22002400103b410010d4010240024041de91084105106f220110ac02450d002000410c6a22022001109301024002400240024002402002200110b20341ff017122020e0404010203000b200141b38008410d108002000b2000410c6a200110e102ad2103410121020c020b2000410c6a200110e102ad2000410c6a200110e102ad422086842103410221020c010b2000410c6a200110e102ad2103410321020b200028020c200028021010c001450d0120002d001c450d0041cce508410036020041d0e50841003a00000b200020033702102000200236020c2000410c6a10e501200041206a24000f0b200141a58008410e108002000b2e01027f103b410110d401410041d99408410410cb012100418c92084104106f2201200010051a200110a402101c0b4201037f103b410210d401410041ca8d08410510cb012101410141c58d08410510cb012102419092084104106f2200200110051a2000200210051a200010a402101c0b2b01017f103b410110d401410041e58b08410110bb01419492084104106f220010d502200010ab02ad103d0b2601017f103b410210d401410041be8d08410710cb014101108e01107122001036200010071a0b1f01017f103b410110d4014100108e01210041d19108410d106f200010b1020b1900103b410110d401410010aa0141ef91084108106f1089010b1f01017f103b410110d401410010ca01210041e891084107106f200010b3020b2601017f103b410110d401410041e88d08410110bb01210041e391084105106f2000ad10ae020b1e01017f103b410110d40110cd01210041c892084103106f2000ac10f8020b1e01017e103b410110d401410010172100418592084103106f200010ae020b1e01017e103b410110d401410010182100418292084103106f200010f8020b2401017f103b410110d401410041e88d0810c3012100418892084104106f2000ad10f8020b2501017f103b410110d401410041b18c08410310cb01210041d994084104106f200010b1020bb20101047f230041106b22002400103b10d601410010d5012000410036020c02402000410c6a220228020041d4e5082802004e0440410121010c010b200241e98d08410810b10141e98d08410810b20121020b20002002360204200020013602002000280204210220002802002101200028020c10d30141e98d084108106f210302402001044020034101410010b0020c010b1087012201410110da012001200210051a2003200110b2020b200041106a24000bb80101037f230041106b22012400103b410110d401200141046a41b18c08410310cc0141de91084105106f210202400240024002400240200128020441016b0e03010203000b2002420010ae020c030b1087012200410110da012001280208200010db012002200010b2020c020b1087012200410210da012001280208200010db01200128020c200010db012002200010b2020c010b1087012200410310da012001280208200010db012002200010b2020b200141106a24000b3101037f103b410210d401410041d99408410410cb012100410110aa01418c92084104106f2202200010051a20021089010b4501047f103b410310d401410041ca8d08410510cb012101410141c58d08410510cb012102410210aa01419092084104106f2200200110051a2000200210051a20001089010b3601027f103b410210d401410041e58b08410110bb01410141848c0810c3012101419492084104106f220010d50220002001ad10f8020b1e01017e103b410110d40141001018210041a492084109106f200010f8020b1900103b410110d401410010aa0141bb9208410d106f1089010b1f01017f103b410110d4014100108e01210041ad9208410e106f200010b1020b2201017f103b410110d401410041be8d08410710cb01210010c4032000108103101d0b3502017f017e103b410110d401410041be8d08410710cb01210010c4032000108103220150044041e39408410f1003000b2001101d0b3d02017f017e230041106b22002400103b410110d401410010172101200041086a10c40320011080032000280208200028020c10e601200041106a24000b2201017e103b410110d40141001017210010c403200010fd0210ac02410047ad103d0b3901027f103b410110d401410041be8d08410710cb01210010c403220120001081035045044041a78808411a1003000b2001200010fe02101d0b3902027f017e103b410110d401410041be8d08410710cb01210010c4032201200010fc0210a602220250047e2001200010fe020520020b101d0b5402037f017e230041106b22002400103b410110d401410010172103200041086a10c40322022003108003200028020c21012000280208047f20022003200110fb0241010541000b200110e601200041106a24000b3802027f017e103b410110d401410041be8d08410710cb01210010c4032201200010810322025045044020012002200010fb020b2002101d0b5701027f230041306b22002400103b410010d401200010c2032201360200200041046a200110f1022000200036021803402000411c6a200041046a108b01200028021c04402000350220101d0c010b0b200041306a24000bbe0101077f230041206b22002400103b410110d4014100418a8d08410410bb012104200010c203220210d902200010b2052101024020002802002205450440200020013602040c010b200041106a220620022000280208220310ec022000200136021820022003200610ed020b2000200336021c20004100360218200020013602142000200436021020022001200041106a10ed0220002001360208200541016a22014504401075000b200020013602002002200010db02200041206a24000b1e01017f200028020c41016a220104402000200136020c20010f0b1075000bbe0101077f230041206b22002400103b410110d4014100418a8d08410410bb012104200010c203220210d902200010b2052101024020002802002205450440200020013602080c010b200041106a220620022000280204220310ec022000200136021c20022003200610ed020b2000410036021c20002003360218200020013602142000200436021020022001200041106a10ed0220002001360204200541016a22014504401075000b200020013602002002200010db02200041206a24000b4701027f230041306b22002400103b410010d401200041206a10c203220110d9022000410c6a2001200028022410f002200028020c410173200028021010e401200041306a24000b4701027f230041306b22002400103b410010d401200041206a10c203220110d9022000410c6a2001200028022810f002200028020c410173200028021010e401200041306a24000b3601017f230041206b22002400103b410010d4012000410c6a10c20310f102200028020c410173200028021010e401200041206a24000b4701027f230041306b22002400103b410010d401200041206a10c203220110d9022000410c6a20012000280228108c01200028020c410173200028021010e401200041306a24000bf20201087f230041e0006b22002400103b410210d40141012104410041e98e08410710bb012101410141f08e08410710bb0121062000410c6a10c2032001108c010240200028020c0440200041286a200041186a2902003703002000200029021037032010c20322012000280224220510eb022204450440200041406b2202200110d902200210b2052102200028022821032000200236022820012005200041206a10ed02024020030440200041d0006a22072001200310ec022000200236025c20012003200710ed020c010b200020023602480b2000200536025c20002003360258200020023602542000200636025020012002200041d0006a10ed02200028024041016a2202450d02200020023602402001200041406b10db02200041386a200041d8006a290200370300200020002902503703300b200041106a22012000290330370200200141086a200041386a290300370200200028021021010b2004200110e401200041e0006a24000f0b1075000bf20201087f230041e0006b22002400103b410210d40141012104410041e98e08410710bb012101410141f08e08410710bb0121062000410c6a10c2032001108c010240200028020c0440200041286a200041186a2902003703002000200029021037032010c20322012000280224220510eb022204450440200041406b2202200110d902200210b2052102200028022c21032000200236022c20012005200041206a10ed02024020030440200041d0006a22072001200310ec022000200236025820012003200710ed020c010b200020023602440b2000200336025c20002005360258200020023602542000200636025020012002200041d0006a10ed02200028024041016a2202450d02200020023602402001200041406b10db02200041386a200041d8006a290200370300200020002902503703300b200041106a22012000290330370200200141086a200041386a290300370200200028021021010b2004200110e401200041e0006a24000f0b1075000b4801027f230041206b22002400103b410110d401410041e98e08410710bb0121012000410c6a10c2032001108c01200028020c044010c203200041106a10ea020b200041206a24000b4501027f230041206b22002400103b410110d401410041e98e08410710bb0121012000410c6a10c203200110f002200028020c410173200028021010e401200041206a24000b7601037f230041306b22002400103b410210d401410041e98e08410710bb012101410141e08e08410910bb0121022000411c6a10c2032001108c01200028021c450440108601000b200041106a200041286a2902003703002000200029022037030810c203200041086a200210ef02200041306a24000b7201047f230041306b22002400103b410210d401410041e98e08410710bb012101410141e08e08410910bb0121022000410c6a10c20322032001108c01200028020c0440200041286a200041186a290200370300200020002902103703202003200041206a200210ef020b200041306a24000b7401037f230041206b22002400103b410110d401410041e98e08410710bb01210110af0121022000410c6a10c2032001108c010340200028020c044020002802182101200220002802101086022000410c6a10c2032001108c010c010b0b20002002360208200041086a10dd01200041206a24000b800101047f230041406a22002400103b410110d401410041e98e08410710bb01210210af012101200010c2032203360228200041106a20032002108c012000200041286a36022403402000412c6a200041106a108b01200028022c0440200120002802301086020c010b0b2000200136020c2000410c6a10dd01200041406b24000b3a01017f230041106b22002400103b410010d401200010c00336020c20002000410c6a10df022000280200200028020410af03200041106a24000b2101017f103b410110d4014100418a8d08410410bb01210010c003200010c7021a0b4401027f230041206b22002400103b410010d401200041106a10c003220110d902200041086a2001200028021410ca022000280208200028020c10d901200041206a24000b4201017f230041106b22002400103b410010d401200041086a10c00310e0022000280208410147044041f18d08410c109601000b200035020c101d200041106a24000b6a02027f017e230041306b22002400103b410010d4012000410c6a220110bb032000200041106a10df0220002000290300370218200020013602200340200041246a200041186a10840120002802240440200035022c2000350228101d101d0c010b0b200041306a24000b7101027f230041306b22002400103b410010d40110af0121012000411c6a10bb03200041106a200041206a10df02200020002903103702280340200041086a200041286a107f200028020804402001200028020c10b4010c010b0b20002001360218200041186a10ab03200041306a24000bae0101037f230041406a22002400103b410010d40110af012102200041286a220110bb03200041186a2000412c6a10df02200020002903183702342000200136023c024003400240200041106a200041346a107f20002802104101470d00200041086a200028023c2201280200200141086a28020020002802141085012000280208450d022002200028020c10b4010c010b0b20002002360224200041246a10ab03200041406b24000f0b108601000b5a01047f230041206b22002400103b410210d4014100418a8d08410410bb0121014101418e8d08410510bb012102200041146a220310bb03200041086a20032001200210bb022000280208200028020c10d901200041206a24000b3d01027f230041106b22002400103b410110d4014100418a8d08410410bb012101200041046a10bb032000280204200110be02ad103d200041106a24000b5101027f230041206b22002400103b410110d4014100418a8d08410410bb012101200041146a10bb03200041086a2000280214200028021c20011085012000280208200028020c10d901200041206a24000b6101047f230041106b22002400103b410110d4014100418a8d08410410bb012102200041046a10bb0320002802042000280208200210c802047f200028020c2201200210bd0221032001200210b90241010541000b200310d901200041106a24000b870101057f230041306b22002400103b410210d4014100418a8d08410410bb0121024101419c8d08410910bb01200041246a220310bb03200041186a22042003200210c102200041106a200410c302200028021022032000280214220410c20222026a220120024904401075000b200041086a20032004200110bb022001ad101d200041306a24000b850101047f230041206b22002400103b410210d4014100418a8d08410410bb012101410141a58d08410710bb012103200041086a220210bb03200041146a2002200110c102200028021c2101200028021821022000280214450440200020022001200310c40220002802002102200028020421010b2002200110c202ad101d200041206a24000bc10101057f230041306b22002400103b410310d4014100418a8d08410410bb0121014101419c8d08410910bb012103410241938d08410910bb012104200041246a220210bb03200041186a2002200110c10220002802202101200028021c2102024002402000280218044020032002200110c20222036a22042003490d02200041106a20022001200410bb020c010b200041086a20022001200410c402200028020c2101200028020821020b2002200110c202ad101d200041306a24000f0b1075000b980101047f230041206b22002400103b410210d4014100418a8d08410410bb012101410141ac8d08410d10bb012103200041146a220210bb03200041086a2002200110c10220002802102101200028020c210202402000280208450440200120036a22032001490d01200020022001200310c40220002802002102200028020421010b2002200110c202ad101d200041206a24000f0b1075000bb50201077f230041e0006b22002400103b410010d40110af012102200041206a220110c303200041186a200041246a10df022000200029031837022c200020013602342000413c6a2104200041d4006a2103024003400240200041106a2000412c6a107f20002802104101470d00200041d0006a20002802342201280200200141086a2802002000280214220110f3022000280250450d02200041406b200341086a28020036020020002003290200370338200041086a200410df02200020002903083702442000200041386a36024c0340200041d0006a200041c4006a1084012000280250450d0220002802582105200028025421062002200110860220022006108602200220051086020c000b000b0b20002002360250200041d0006a10dd01200041e0006a24000f0b41948108410b109601000b4201027f230041106b22002400103b410110d4014100418a8d08410410bb012101200041046a10c30320002802042000280208200110bc02ad103d200041106a24000b3d01027f230041106b22002400103b410110d4014100418a8d08410410bb012101200041046a10c3032000280204200110be02ad103d200041106a24000bda0101037f230041d0006b22002400103b410110d4014100418a8d08410410bb0121012000410c6a10c303200041186a200028020c2000280214200110f30220002802180440200041306a200041246a2802003602002000200029021c37032810af0121012000200041286a220241047210df0220002000290300370238200020023602400340200041c4006a200041386a10840120002802440440200028024c210220012000280248108602200120021086020c010b0b20002001360208200041086a10dd01200041d0006a24000f0b41fc8e08410b109601000b8f0101047f230041306b22002400103b410310d4014100418a8d08410410bb012101410141a48c08410310bb0121024102418e8d08410510bb012103200041146a10c303200041206a2000280214200028021c200110f302200028022045044041fc8e08410b109601000b200041086a200041246a2002200310bb022000280208200028020c10d901200041306a24000b850101037f230041306b22002400103b410210d4014100418a8d08410410bb012101410141a48c08410310bb012102200041146a10c303200041206a2000280214200028021c200110f302200028022045044041fc8e08410b109601000b200041086a2000280224200028022c20021085012000280208200028020c10d901200041306a24000b5f01047f230041206b22002400103b410110d4014100418a8d08410410bb012101200041086a10c3032000280208200028020c200110c80222020440200041146a22032000280210200110f402200310a7030b2002ad103d200041206a24000bc40101037f230041d0006b22002400103b410010d401200041186a220110c303200041106a2000411c6a10df02200020002903103702242000200136022c200041c4006a2101024003400240200041086a200041246a107f20002802084101470d00200041406b200028022c2202280200200241086a280200200028020c10f3022000280240450d02200041386a200141086a28020036020020002001290200370330200041306a10a7030c010b0b200041186a10a403200041d0006a24000f0b108601000bb30101067f230041306b22002400103b410310d4014100418a8d08410410bb012103410141a48c08410310bb0121044102419c8d08410910bb01200041246a220110c303200041186a22052001200310c102200041106a200510f60220052000280210200028021410f20220012005200410c102200041086a200110c30220002802082201200028020c220310c20222046a220220044904401075000b200020012003200210bb022002ad101d200041306a24000bef0101077f230041406a22002400103b410410d4014100418a8d08410410bb012102410141a48c08410310bb0121044102418e8d08410510bb012105410341f78e08410510bb012106200041286a220310c3032000411c6a2003200210c1022000280224210220002802202103200028021c0440200041346a22012003200210f202200041106a20012004200510bb02410121010b2000200236023c2000200336023820002001360234200041086a200041346a220110f60220012000280208200028020c10f20220002000280234200028023c20041085012000280204200620002802001bad101d200041406b24000b8e0101067f230041306b22002400103b410310d4014100418a8d08410410bb012102410141a48c08410310bb0121034102418e8d08410510bb012104200041186a220510c303200041246a22012005200210c102200041106a200110f60220012000280210200028021410f202200041086a20012003200410bb022000280208200028020c10d901200041306a24000b4701017f230041206b22002400103b410010d401200041106a10bc0320002000290310370218200041086a2000411c6a10df022000280208200028020c10af03200041206a24000b4201027f230041106b22002400103b410110d4014100418a8d08410410bb012101200041086a10bc032000280208200028020c200110bc02ad103d200041106a24000b3d01027f230041106b22002400103b410110d4014100418a8d08410410bb012101200041086a10bc032000280208200110be02ad103d200041106a24000b4201027f230041106b22002400103b410110d4014100418a8d08410410bb012101200041086a10bc032000280208200028020c200110c802ad103d200041106a24000b3d01017f230041106b22002400103b410010d401200041086a10bc032000200028020c10e0022000280204410020002802001bad101d200041106a24000b4e01027f230041206b22002400103b410010d401200041086a10bc03200041106a200028020c220110d90220002001200028021810de022000280204410020002802001bad101d200041206a24000b7801047f230041206b22002400103b410110d4014100418a8d08410410bb012101200041186a10bc03200028021c210302402000280218200110c9022201450d00200041106a20032001108001200041086a2003200028021410de022000280208450d00200028020c21020b2002ad101d200041206a24000b7801047f230041206b22002400103b410110d4014100418a8d08410410bb012101200041186a10bc03200028021c210302402000280218200110c9022201450d00200041106a20032001108001200041086a2003200028021010de022000280208450d00200028020c21020b2002ad101d200041206a24000b8c0101047f230041206b22002400103b410110d4014100418a8d08410410bb012102200041086a10bc032000200028020c36021420002000280208220336021020002003200210c90236021c2000200041146a360218024003402000200041186a107f2000280200450d012001417f470440200141016a21010c010b0b1075000b2001ad101d200041206a24000b1100103b410010d40110c10310a502103c0b2401027f103b410110d401410010ca01210010c1032201200110a5022000108e0210f9020b2801037f103b410110d401410010ca01210010c103220110a502220220001090022001200210f9020b4301037f103b410110d401410010ca01210010c103220210a5022201200010890241ff017141024f044041fd8d084110109601000b200120001091022002200110f9020b2401027f103b410110d401410010ca01210010c103220110fa0204402001200010b3020b0b0f00103b410010d40110c10310b6020b1200103b410010d40110c10310fa02ad103d0b2300103b410110d401410041be8d08410710cb0141cb92084116106f10e70245ad103d0b1200103b410010d40110c10310ac02ad101d0b3101027f103b410210d401410041a48c08410310bb014101108e01210141e19208411c106f220010d5022000200110b1020b5901027f230041206b22002400103b410010d401200010bd032000200028020422013602102000200028020036020c2000200110a90236021c2000410136021820002000410c6a360214200041146a10b003200041206a24000b3f01027f230041106b22002400103b410110d4014100418a8d08410410bb012101200041086a10bd032000280208200028020c200110d002200041106a24000b4201027f230041106b22002400103b410110d401410041b98d08410510bb012101200041086a10bd032000280208200028020c200110d202ad101d200041106a24000b4b01047f230041106b22002400103b410210d401410041be8d08410710cb012101410141b98d08410510bb012102200041046a2203200110be032003200210d302ad101d200041106a24000b2e01017f230041106b22002400103b410010d401200041086a10bd03200028020c10a902ad101d200041106a24000b3e01017f230041106b22002400103b410110d401200041046a410041be8d08410710cb0110be032000280204200028020c10d402ad101d200041106a24000bbe0102047f027e230041106b22022400103b410310d4014100108e0121004101101721042002410210c60102400240106e22012000109203450440200110950310a802220341ff017141ff01460d0120012000109103200341016a2200ad42ff0183220510ae022001109503200510ae020c020b2001200010900321000c010b41ad8a0841d7001003000b2001200020041098034504402001200020042002109a032001200020022004109d03200241106a24000f0b41848b0841171003000b950102047f017e230041206b22022400103b410310d4014100108e0121004101101721042002410210c6010240106e22012000109203044020012001200010900322002004109803450d01200241106a2203200120002004109603200120002003109e032001200020042002109a032001200020022004109d03200241206a24000f0b41e4890841101003000b41f48908411e1003000b920102037f017e230041106b22012400103b410210d4014100108e0121024101101721030240106e22002002109203044020002000200210900322022003109803450d0120012000200220031096031087012100200128020820001095012001290300200010e1012001410c6a2000109b032000108801200141106a24000f0b41e4890841101003000b41f48908411e1003000b9c0102047f017e230041406a22002400103b410210d4014100108e012101200041306a410110c601200041106a200041386a290300370300200020002903302204370220200020043703080240106e2202200110920304402002200220011090032201200041086a2203109c0310ac02450d01200220012003109c0310a602101d200041406b24000f0b41e4890841101003000b41f48908411e1003000b6c02037f017e230041106b22022400103b410210d4014100108e0121004101101721030240106e22012000109203450d0020012001200010900322002003109803450d00200220012000200310960320012000200310930310b602200120002002109e030b200241106a24000b3a02027f017e103b410210d4014100108e012100410110172102106e22012000109203047e2001200120001090032002109903ad0542010b103d0b1d01017f103b410110d4014100108e01210010cb03200010e80210f7020b1d01017f103b410110d4014100108e01210010cb03200010e80210b6020b1d01017f103b410110d4014100108e01210010cb03200010e902ad103d0b4b01037f230041106b22002400103b410210d401410041be8d08410710cb0121014101108e012102200041086a200110cc032000280208200028020c200210e602ad103d200041106a24000b2701017f103b410110d4014100108e01210010cb03200010e9024504404184950841141003000b0b5501037f230041106b22002400103b410210d401410041be8d08410710cb0121014101108e012102200041086a200110cc032000280208200028020c200210e6024504404184950841141003000b200041106a24000b5401057f230041206b2200240010ac01410210d4014100108e012102410110aa01210310a401200041086a10cd031070210110af0121042000410036021420002802102001200420022003200041146a108f03000b7c01077f230041206b2200240010ac01410210d4014100108e012104410110aa01210210a4012002108b03210310af012105200041086a10cd031070210110af0121062000200536021c2000411f411b20031b360218200041b48f0841998f0820031b36021420002802102001200620042002200041146a108f03000bd60101067f230041206b2201240010ac01410110d4014100108e01210410a401200141086a10cd031070210210af0121052001410036021420012802102103230041406a2200240020031087030240200141146a2201280200450440200041086a200310a102108a030c010b200041106a200141086a280200360200200020012902003703080b20034101200010b402200041346a200220052004410010f101200041206a200041106a280200360200200020002902343703282000200028023c36022420002000290308370318200041186a10fc01000bc803010a7f230041206b22002400103b410010d40120004181043b000610af012102200041086a220110cd032000200236021c20004112360218200041878f08360214200041066a2102200041146a2105108803230041206b22032400200128020810fa0204404198890841201003000b20011089032802002101200241026a2107230041106b22042400200441086a41e08408410e10980120042004280208200428020c2001109901200428020021082004280204220610f0010340200720022201470440200141016a210241b8950821000240024002400240024002400240024020012d000041016b0e080700010203040506090b41d4950821000c060b41f0950821000c050b4190960821000c040b41a8960821000c030b41c4960821000c020b41e8960821000c010b4180970821000b200028020421012000280200210010af01220920002001101f1a2006200910b4010c010b0b2003200836020020032006360204200441106a24002003411c6a200541086a2802003602002003200329030037020c200320052902003702142003410c6a220241086a22012802000440200110fd010b200228020021012002280204210241bc850810fe0110ea012001200210eb01000b4001027f230041206b22002400103b410110d401410010aa012101200041146a10cd032000200028021420002802182001108c03200010e001200041206a24000ba20101037f230041d0006b22002400103b410210d401410041d98f08410210cb012101410110aa012102200020013602182000411c6a10cd03200041286a200028021c20002802202002108c032000200041346a360244200042003703382000200041186a3602482000200041306a2201360240200041386a10fa01200041106a200129030037030020002000290328370308200041086a10e001200041d0006a24000b3b01037f230041106b22002400103b410110d401410010aa012101200041046a220210cd03200210890328020042002001109701200041106a24000b3701027f230041106b22002400103b410010d401200041046a220110cd031088032001108903280200420010a101101c200041106a24000b4b01027f230041206b22002400410010d401200041106a220110a5012000200028021836020c200110cd0320011089032000410c6a10b80304404183890841151003000b200041206a24000bd90102097f017e230041306b22002400410010d40110a60121022000410c6a220110cd03200041206a2103200110890321062002100c210741002101024002400340200141106a22042001490d02200420074b0d01200342003703002000420037031820022001200041186a2205411010a7011a2000410036022c20052000412c6a220810a80121012005200810a90121092000200041186a2000412c6a10a80136022420002001360220200020093703182006200310b803450440200421010c010b0b4183890841151003000b200041306a24000f0b1075000b4701017f230041106b22002400103b410010d401200041046a10cd03027f200028020c10fa0245044020002802042000280208108d030c010b10af010b10071a200041106a24000b880201087f230041206b2200240010ac01410110d4014100108e01210610a401200041086a10721070210210af0121072000410036021420002802102103200041146a2101230041306b22002400200020031073024002400240200028020041016b0e020001020b41c7880841181003000b41df880841141003000b027f20012802002205450440109f0110af01220410f0012004200310f90141b88908210541100c010b2001280208210420012802040b210120034101200010b402200041246a200220072006410310f10120002004360214200020013602102000200536020c200020002802283602202000200028022436021c2000200028022c3602182000410c6a10fc01000b6701027f230041106b22002400103b410110d4014100108e012101200041046a1072024020002802042000280208107b41024704402001109802450d01200028020c41022001107710b402200041106a24000f0b41df880841141003000b41f3880841101003000b5a01037f230041206b22002400103b410210d401410010aa0121012000410110be0122024110763a0012200020023b0110200041146a10722000200028021420002802182001200041106a109f03200010e001200041206a24000b9a0101047f230041406a22002400103b410310d401410041d98f08410210cb012101410110aa0121022000410210be0122034110763a0022200020033b01202000200136021c200041246a1072200041306a2201200028022420002802282002200041206a109f032000411c6a200110a103200041106a200041386a29030037030020002000290330370308200041086a10e001200041406b24000b4902027f017e230041206b22002400103b410210d401410010172102410110aa012101200041146a10722000200028021420002802182002200110a203200010e001200041206a24000b860102037f017e230041306b22002400103b410310d401410041d98f08410210cb012101410110172103410210aa01210220002001360210200041146a1072200041206a2201200028021420002802182003200210a203200041106a200110a103200041086a200041286a29030037030020002000290320370300200010e001200041306a24000b4202037f017e230041106b22002400103b410210d401410010172103410110aa012101200041046a22021072200210890328020020032001109701200041106a24000b3e02027f017e230041106b22002400103b410110d401410010172102200041046a220110721088032001108903280200200210a101101c200041106a24000bb402020b7f017e230041206b22002400103b410110d40141001017210b20001072108803200010890342001024210610042102100421071004210810042103100421014200102421091004210a280200200b2006200220072008200320012009200a10682001100c450440200141b881084120101f1a0b200041003b010c200241002000410c6a22042202410210a7011a200310772203100c2101200041003a001c2000200136021820002003360214200020013602102000410036020c200210ae032102200410ae0321032000410c6a10ae032104200028020c200028021010c001044020002d001c044041cce508410036020041d0e50841003a00000b1087012201200210da012001200310da012001200410da012001108801200041206a24000f0b41e58608412041a58008410e108301000b4501017f230041106b22002400103b410010d401200041046a1072027f200028020c10ac02044020002802042000280208108d030c010b10af010b10071a200041106a24000b4e01027f230041106b22002400103b410110d401410041f08f08410310bb012101200041046a10c503200028020810a902044041878808410f1003000b200028020c200110e302200041106a24000b4201027f230041106b22002400103b410110d401410041b98d08410510bb012101200041046a10c50320002802042000280208200110e502ad101d200041106a24000b990101077f230041106b22002400103b410110d401410041b98d08410510bb012103200041046a10c5032000280208220210a9022101200028020422042002200110e5022105024020012003460440200521060c010b20042002200310e5022106200420022003200510e4020b200420022001410010ce0220014504401075000b200028020c200141016b10e3022006ad101d200041106a24000b4e01037f230041106b22002400103b410210d401410041b98d08410510bb012101410141ee8f08410210bb012102200041046a10c503200028020420002802082001200210e402200041106a24000b6801057f230041106b22012400103b410010d401200141046a10c5032001280208220210a9022103200128020421044101210002400340200020034d04402000417f460d0220042002200010e502ad101d200041016a21000c010b0b200141106a24000f0b1075000b4801027f230041206b22002400103b410010d401200041086a220110ca032000200028020c10a90236021c2000410136021820002001360214200041146a10b003200041206a24000b3c01037f230041106b22002400103b410110d4014100418a8d08410410bb012101200041046a220210ca0320022001108203ad103d200041106a24000b3d01027f230041106b22002400103b410110d4014100418a8d08410410bb012101200041046a10ca03200028020c2001108303ad103d200041106a24000bdc0101087f230041106b22012400103b410110d4014100418a8d08410410bb012104200141046a10ca030240200128020c2205200410860322000440024020002001280208220310a90222024d044020002002460d01200128020422072003200210d2022106200310a9022000490d032007200010cf022006ad10ae020c010b0c020b200310a90220024904400c020b2001280204200210cf0210b6022003200241016b10ad02200020024704402005200620001084030b2005200410850310b6020b2000410047ad103d200141106a24000f0b41f2940841121003000b7802057f017e230041206b22002400103b410210d401200041086a410041fe8f0810ce01200041146a410141fc8f0810ce01200028021c21012000280218210220002802102103200028020c21042000280208200028021410950245200220044772047e420005200320011078ad0b103d200041206a24000b0d00103b410010d4014200101d0b0c00103b410010d4011075000b0d00103b410010d401427e103d0b1100103b410010d40141a987084104101b0b7101037f103b410110d401230041106b220124004100108e012200100c41044604402001410036020c200041002001410c6a2202410410a7011a41feffffff0720002002410441a98708410410d1011b21000b200141106a2400200041feffffff0747047e2000109802ad0542010b103d0b1400103b410110d4014100108e01109802ad103d0b970102037f027e230041206b22002400103b410110d401410041fc8c08410810bb01ad210410af0121010340200320045145044010af012202200342017c220310f8012001200210b4010c010b0b2000200136021020002001100c36021c200041003602182000200041106a3602140340200041086a200041146a10de0120002802080440200028020c10071a0c010b0b200041206a24000b2b01017f103b410110d401410041848d08410610bb01220045044041ee8c08410e109601000b2000ad101d0b110010ac01410010d40110a4011070101c0b2001017f103b410110d401410041be8d08410710cb01210010c603200010b1020b4101017f230041206b22002400103b410010d401200010c60310aa0210c803200041106a2000280200200028020410c002200028021045ad103d200041206a24000b4501027f230041106b22002400103b410110d4014100418a8d08410410bb012101200010c60310aa0210c8032000280208200028020c200110cd02ad103d200041106a24000b3f01017f230041206b22002400103b410010d401200010c60310aa0210c803200041106a2000280200200028020410c0022000350210101d200041206a24000b840101047f230041206b22002400103b410110d4014100418a8d08410410bb012101200041106a10c60310aa0210c80302402000280218200028021c200110cb0222010440200041086a20002802102202200028021422032001107d200020022003200028020c10dd0220002802000d010b108601000b2000350204101d200041206a24000b840101047f230041206b22002400103b410110d4014100418a8d08410410bb012101200041106a10c60310aa0210c80302402000280218200028021c200110cb0222010440200041086a20002802102202200028021422032001107d200020022003200028020810dd0220002802000d010b108601000b2000350204101d200041206a24000b6401037f230041306b22002400103b410010d401200041106a10c60310aa0210c803200041206a200028021022012000280214220210c002200041086a20012002200028022410dd022000280208450440108601000b200035020c101d200041306a24000b6401037f230041306b22002400103b410010d401200041106a10c60310aa0210c803200041206a200028021022012000280214220210c002200041086a20012002200028022810dd022000280208450440108601000b200035020c101d200041306a24000b7302027f017e230041306b22002400103b410010d401200041106a220110c60310aa0210c703200041086a200110bf022000290308210210af0121012000200237022803402000200041286a107c20002802004101474504402001200028020410b4010c010b0b200110071a200041306a24000bc60102057f017e230041406a22002400103b410010d4012000411c6a220110c60310aa0210c703200041106a200110bf022000290310210510af012102200020053702342000200136023c024003400240200041086a200041346a107c20002802084101470d00200028023c220141086a2802002001410c6a280200200028020c220410cd02450d0220012802141077220341dd8708410710141a2004200310db0120022001280210200310cc0210b4010c010b0b200210071a200041406b24000f0b108601000b5b01037f230041206b22002400103b410110d4014100418a8d08410410bb012000410c6a10c60310aa0210c90320002802101077220141c18808410610141a200110db01200028020c200110cc02410047ad103d200041206a24000b4301027f230041206b22002400103b410110d401410041b98d08410510bb0121012000410c6a10c60310aa0210c903200041146a200110d302ad101d200041206a24000b7b01027f230041206b22002400103b410110d4014100418e8d08410510bb012101200041003a001c20002001360218200041013602140340200041086a200041146a10b90320002802080440200028020c2101200041bd9108410a106f10a80320002802002000280204200110bc021a0c010b0b200041206a24000b910101047f230041306b22002400103b410110d4014100418e8d08410510bb012101200041003a00202000200136021c2000410136021802400340200041106a200041186a10b9032000280210450d01200028021422014190ce006a220220014f0440200041246a220341b39108410a106f10f502200041086a20032002200110bb020c010b0b1075000b200041306a24000b7501037f230041206b22002400103b410110d4014100418e8d08410510bb012101200041003a00102000200136020c2000410136020803402000200041086a10b9032000280200044020002802042101200041146a220241c593084114106f10aa03200220011082031a0c010b0b200041206a24000b3601027f103b410210d401410041be8d08410710cb01410141db8f08410910bb0141e19208411c106f220110d502200110b70210071a0b1e01017f103b410210d401410010aa012200410110aa011090022000101c0b1e01017f103b410210d401410010aa012200410110aa01109a022000101c0b1900103b410210d401410010aa01410110aa01109502ad103d0b1900103b410010d40142e4f40110794102109702109c02101c0b1300103b410010d40142b9e00010791070101c0b2f004299b796d8d30042acacc2ca0242a8c5a0c10a42c085f7bc05429ed69dd501429d98836541114185870810c3060b2f004286bcb3def800428094ebdc0342dba9e5940f42fb9b9df30742a7b9d0b30242ead28a5941134196870810c3060bbd0501057f230041e0006b220024000240024010f20122041094012202108d020d00200210772201100c2102200041003a004c2000200236024820002001360244200020023602402000410036023c2000413c6a220210a5032103200210a603210110af01210203402001044020022000413c6a10a50310b401200141016b21010c010b0b200028023c200028024010c001450d0120002d004c044041cce508410036020041d0e50841003a00000b200410b6022000200310f4012000280220450d002000413c6a2201200310f401200028025c450d00024002400240200141998f08411b10f301450440200141b48f08411f10f3010d01200141878f08411210f3010d02200041286a22042003200210b3032000280228450d04200028023021022001200028022c220310f401200028025c450d0420042003200210b3032000280228450d042001200028022c200028023010b303200028023c450d0441b88c0841361003000b10d601410010d50120004100360224200041286a2201200041246a10ba01200028022410d301200028022c210320002802282001200210d70110d601200028022c200028023010d2010d02200110cd032001200310ac030c030b10d601410010d50120004100360224200041286a2201200041246a41d38f08410610ad01200028022410d30120002802282001200210d70110d601200028022c200028023010d201450440200110a50120002802302102200110cd032001200210ac030c030b200041286a10cd032000280230108e030c020b10d601410010d50120004100360224200041286a2201200041246a41d38f08410610ad01200028022410d30120002802282001200210d70110d601200028022c200028023010d2010d0141fb93084108106f10f7020c010b200041286a10cd032000280230108e030b200041e0006a24000f0b419f8108411941a58008410e108301000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322067e22072006200342208822067e22082005200142208822097e7c22054220867c220a37030020002007200a56ad200620097e2005200854ad4220862005422088847c7c200120047e200220037e7c7c3703080b3801017f230041106b2203240020034200370308200320012002200341086a10b10320002003280200200328020410b002200341106a24000ba50101027f230041306b22062400027f2001500440200641106a2005410d109801200641086a20062802102006280214200010990120062802082107200628020c0c010b200641286a20042003109801200641206a2006280228200628022c2000109901200641186a200628022020062802242001109a0120062802182107200628021c0b21002006200720002002109b0120062802002006280204109c01200641306a24000b3401027f230041106b22032400200341086a20022001106f220410732000200329030837020020002004360208200341106a24000be20202057f037e230041e0006b22082400103b410110d401200841d8006a410010aa01220a10a002024020082802584101460440200828025c21094109109702210b420110792009109b02210c200841c8006a200a200b109d02200c10990210a2022008290348a70d0120072006109601000b41c78e08410e109601000b200841386a2008290350220e200e423f87220f2005427f10bf06024020082903402008290338220d423f87520d00200841286a200d428094ebdc037f20047c220d200d423f87200e200f10bf0620082903302008290328220d423f87520d00200841186a200d428094ebdc037f20037d220d200d423f87200e200f10bf0620082903202008290318220d423f87520d00200841086a200d428094ebdc037f20027c220d200d423f87200e200f10bf0620082903102008290308220e423f87520d002009ad20017e200e428094ebdc037f7c20007d1076103c200841e0006a24000f0b1075000b0ba4170500418080080bb801546f6b656e417474726962757465736e6f6e46756e6769626c65546f6b656e4d6170706572696e70757420746f6f206c6f6e67696e76616c69642076616c756564656c6962657261746520746f70206465636f6465206572726f7264656c6962657261746520746f7020656e636f6465206572726f7264656c69626572617465206e657374656420656e636f6465206572726f726d697373696e67206b657973657269616c697a6572206465636f6465206572726f723a200041d881080be403696e636f7272656374206e756d626572206f662045534454207472616e7366657273617267756d656e74206465636f6465206572726f722028293a2066756e6374696f6e20646f6573206e6f74206163636570742045534454207061796d656e74746f6f2066657720617267756d656e7473746f6f206d616e7920617267756d656e747377726f6e67206e756d626572206f6620617267756d656e7473656e64706f696e7420726573756c7420656e636f6465206572726f723a2063616e6e6f74207375627472616374206265636175736520726573756c7420776f756c64206265206e65676174697665455344544c6f63616c4275726e455344544e46544275726e455344544c6f63616c4d696e74455344544e46544164645175616e74697479455344544e465443726561746566616c73657472756563616e467265657a6563616e5769706563616e506175736563616e4d696e7463616e4275726e63616e4368616e67654f776e657263616e5570677261646563616e4164645370656369616c526f6c65737365745370656369616c526f6c65464e474e46545346544d4554417265676973746572416e64536574416c6c526f6c6573697373756543425f434c4f53555245636f6e74726163742063616c6c20656e636f6465206572726f723a200041c585080b01010041d985080bdc1102ffff73796e6320726573756c74617267756d656e74206f7574206f662072616e6765696e70757420746f6f2073686f72746361737420746f20693634206572726f72703232347032353670333834703532316661696c656420746f206c6f616420746f20627974652061727261794d616e6167656456656320696e646578206f7574206f662072616e67656572726f72206465636f64696e67204553445420617474726962757465733a206c6e20696e7465726e616c206572726f726c6f673220696e7465726e616c206572726f7245474c4473746f72616765206b657920656e636f6465206572726f723a2073746f7261676520656e636f6465206572726f723a202e6d61707065642e6e6f64655f69642e6974656d2e6e6f64655f6c696e6b732e76616c75652e696e666f6c656e20616c7265616479207365742e6c656e2e6e6f64652e73746f726167654164647265737320616c726561647920726567697374657265642e696e64657849737375652077617320616c72656164792063616c6c6564546f6b656e20494420616c726561647920736574496e76616c696420746f6b656e204944496e76616c6964207061796d656e7420746f6b656e4d757374206973737565206f722073657420746f6b656e20494420666972737464656661756c745f69737375655f636264656661756c745f69737375655f696e69745f737570706c795f6362556e6b6e6f776e20746f6b656e206964412076616c756520776173206e6f742070726576696f75736c79207365742e617474722e636f756e7465722e6d617070696e672e6e6f6e6365436f756e746572206f766572666c6f772e2054686973206d6f64756c652063616e20686f6c642065766964656e636520666f72206d6178696d756d2075383a3a4d415820646966666572656e7420746f6b656e20494473412076616c75652077617320616c7265616479207365746c6f67206461746120656e636f6465206572726f723a206c6f6720746f70696320656e636f6465206572726f723a2073746f72616765206465636f6465206572726f7220286b65793a20786d616d766563616d7664756d6d7964617461617267326e756d5f6c6f67736261206d75737420657175616c206273635f70616e696320746573747369676e6b657973686173685f74797065617267617267336e6f2063616c6c6261636b2066756e6374696f6e20776974682074686174206e616d652065786973747320696e20636f6e747261637477616e7473206e6f6e2d7a65726f686f775f6d616e796e756d6265726974656d76616c75656f7468657277697365696e6372656d656e7464656661756c746b65795f696e6372656d656e74696e64657861646472657373616464723261646472316d76326d7631696e646578206f7574206f6620626f756e6473696f70745f61646472517565756520656d707479216e6f7420656e6f7567682066756e647363757276655f62697473697a656d62326d6231736c6963655f6c656e7374617274696e675f706f736974696f6e6e725f6279746573617272617963616e6e6f74206265207a65726f73746f726167655f6b65796e65775f76616c75656e6f64655f6964656c656d656e746f746865724e6f2073746f72616765217365745f726f6c65735f63616c6c6261636b637573746f6d5f69737375655f7a65726f5f737570706c795f6362637573746f6d5f69737375655f6e6f6e5f7a65726f5f737570706c795f6362726573756c74746f65787472615f6b65796174747269627574657369646c656e617673656e7a6f70747332733170656e64696e67626164206172726179206c656e67746876617220617267736361706163697479206578636565646564696e707574206f7574206f662072616e6765696e697469616c5f63616c6c65726576656e745f616576656e745f626576656e745f6572725f646174616576656e745f6572725f746f7069636c6f61645f776974685f6b65795f6572726c6f61645f776974685f76616c75655f65727273746f72655f776974685f76616c75655f6572726d61705f6d61707065727365745f6d61707065727665635f6d617070657273746f726167655f62797465737365725f327573697a656269675f696e746269675f75696e746e725f746f5f636c656172693634753634626f6f6c6d6170316d6170326d61703371756575655f6d6170706572454c524f4e44693634454c524f4e447265736572766564454c524f4e4442696755696e746933326d795f73696e676c655f76616c75655f6d617070657273696e676c655f76616c75655f6d61707065725f776974685f6b65796c6973745f6d61707065726d61705f73746f726167655f6d6170706572616464726573735f696473756e697175655f69645f6d6170706572636f6e74726163745f61646472657373756e6f7264657265645f7365745f6d617070657277686974656c6973744d617070657266756e6769626c65546f6b656e4d6170706572726f6c6573536574456e64706f696e742063616e206f6e6c792062652063616c6c6564206279206f776e6572456e64706f696e742063616e206f6e6c792062652063616c6c65642062792075736572206163636f756e7473616464724964616464726c6173744964556e6b6e6f776e2061646472657373696e646578206f7574206f662072616e67654974656d206e6f742077686974656c6973746564454c524f4e4472657761726445534454526f6c654c6f63616c4d696e74000000a40a02001100000045534454526f6c654c6f63616c4275726e000000c00a02001100000045534454526f6c654e4654437265617465000000dc0a02001100000045534454526f6c654e46544164645175616e746974790000f80a02001600000045534454526f6c654e46544275726e00180b02000f00000045534454526f6c654e4654416464555249000000300b02001100000045534454526f6c654e465455706461746541747472696275746573004c0b02001b000000455344545472616e73666572526f6c65700b02001000000070616e6963206f6363757272656400006e020200710202007402020077020200030000000300000003000000040041b897080b0438ffffff", + "report": { + "imports": [ + "addEC", + "bigIntAbs", + "bigIntAdd", + "bigIntAnd", + "bigIntCmp", + "bigIntFinishSigned", + "bigIntFinishUnsigned", + "bigIntGetCallValue", + "bigIntGetESDTExternalBalance", + "bigIntGetInt64", + "bigIntGetSignedArgument", + "bigIntGetUnsignedArgument", + "bigIntIsInt64", + "bigIntLog2", + "bigIntMul", + "bigIntNeg", + "bigIntNew", + "bigIntOr", + "bigIntPow", + "bigIntSetInt64", + "bigIntShl", + "bigIntShr", + "bigIntSign", + "bigIntSqrt", + "bigIntSub", + "bigIntTDiv", + "bigIntTMod", + "bigIntXor", + "checkNoPayment", + "cleanReturnData", + "createEC", + "doubleEC", + "ellipticCurveGetValues", + "finish", + "getArgumentLength", + "getBlockEpoch", + "getBlockNonce", + "getBlockRound", + "getBlockTimestamp", + "getCurveLengthEC", + "getGasLeft", + "getNumArguments", + "getNumESDTTransfers", + "getPrevBlockEpoch", + "getPrevBlockNonce", + "getPrevBlockRound", + "getPrevBlockTimestamp", + "getPrivKeyByteLengthEC", + "getShardOfAddress", + "isOnCurveEC", + "isSmartContract", + "mBufferAppend", + "mBufferAppendBytes", + "mBufferCopyByteSlice", + "mBufferEq", + "mBufferFinish", + "mBufferFromBigIntSigned", + "mBufferFromBigIntUnsigned", + "mBufferGetArgument", + "mBufferGetByteSlice", + "mBufferGetBytes", + "mBufferGetLength", + "mBufferNew", + "mBufferSetByteSlice", + "mBufferSetBytes", + "mBufferSetRandom", + "mBufferStorageLoad", + "mBufferStorageLoadFromAddress", + "mBufferStorageStore", + "mBufferToBigIntSigned", + "mBufferToBigIntUnsigned", + "managedAsyncCall", + "managedCaller", + "managedCreateEC", + "managedEncodeSecp256k1DerSignature", + "managedExecuteOnDestContext", + "managedGenerateKeyEC", + "managedGetBlockRandomSeed", + "managedGetCodeMetadata", + "managedGetESDTTokenData", + "managedGetMultiESDTCallValue", + "managedGetOriginalTxHash", + "managedGetPrevBlockRandomSeed", + "managedGetStateRootHash", + "managedIsBuiltinFunction", + "managedKeccak256", + "managedMarshalCompressedEC", + "managedMarshalEC", + "managedMultiTransferESDTNFTExecute", + "managedOwnerAddress", + "managedRipemd160", + "managedSCAddress", + "managedScalarBaseMultEC", + "managedScalarMultEC", + "managedSha256", + "managedSignalError", + "managedTransferValueExecute", + "managedUnmarshalCompressedEC", + "managedUnmarshalEC", + "managedVerifyBLS", + "managedVerifyCustomSecp256k1", + "managedVerifyEd25519", + "managedVerifySecp256k1", + "managedWriteLog", + "signalError", + "smallIntFinishSigned", + "smallIntFinishUnsigned", + "smallIntGetSignedArgument", + "smallIntGetUnsignedArgument", + "validateTokenIdentifier" + ], + "isMemGrow": true, + "eiCheck": { + "eiVersion": "1.3", + "ok": true + }, + "codeReport": { + "path": "../output/basic-features.wasm", + "size": 64794, + "hasAllocator": false, + "hasPanic": "without message" + } + } } diff --git a/test/features/basic-features/scenarios/big_uint_log2.json b/test/features/basic-features/scenarios/big_uint_log2.json index 18fea6a2c..e4e6d5c97 100644 --- a/test/features/basic-features/scenarios/big_uint_log2.json +++ b/test/features/basic-features/scenarios/big_uint_log2.json @@ -42,6 +42,54 @@ "gas": "*", "refund": "*" } + }, + { + "step": "scCall", + "id": "log2 from 1", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "value": "0", + "function": "log2_big_uint", + "arguments": [ + "1" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "0" + ], + "status": "0", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "log2 from 0", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "value": "0", + "function": "log2_big_uint", + "arguments": [ + "0" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "0" + ], + "status": "0", + "logs": "*", + "gas": "*", + "refund": "*" + } } ] -} +} \ No newline at end of file diff --git a/test/features/basic-features/scenarios/codec_err.scen.json b/test/features/basic-features/scenarios/codec_err.scen.json index 4951776ea..025d91127 100644 --- a/test/features/basic-features/scenarios/codec_err.scen.json +++ b/test/features/basic-features/scenarios/codec_err.scen.json @@ -53,7 +53,7 @@ "expect": { "out": [], "status": "4", - "message": "str:storage decode error: deliberate top decode error" + "message": "str:storage decode error (key: load_with_value_err): deliberate top decode error" } }, { diff --git a/test/features/basic-features/scenarios/crypto_verify_bls.scen.json b/test/features/basic-features/scenarios/crypto_verify_bls.scen.json index ead18354d..99d683d28 100644 --- a/test/features/basic-features/scenarios/crypto_verify_bls.scen.json +++ b/test/features/basic-features/scenarios/crypto_verify_bls.scen.json @@ -19,7 +19,7 @@ }, { "step": "scCall", - "id": "3", + "id": "verify_bls_signature - Ok", "tx": { "from": "address:an_account", "to": "sc:basic-features", @@ -33,14 +33,36 @@ "gasPrice": "0" }, "expect": { - "out": [ - "0x01" - ], + "out": [], "status": "", "logs": "*", "gas": "*", "refund": "*" } + }, + { + "step": "scCall", + "id": "verify_bls_signature - Fail", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "verify_bls_signature", + "arguments": [ + "0xb5823f6e564251cc03ce7bad3da83e72576e92795d3500bba1acb30ec9a94dce87bb8aa794d67b2d61d15c33f28f6c0c23ba1dfcbf21e8f8b46286ff871afabac925303ddcaddce6254fcff6d3155797db40b3d3b5865e8fc0bd770b3d79b381", + "0x6d65737361676520746f206265207369676e6564", + "0x0032a2ddf341c08d1eb7232f05dc34e4454155e676b58c40fddf9a036562ac2c01533d2d557cb49d73aa9d7a89744696" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "10", + "message": "str:signature is invalid", + "logs": "*", + "gas": "*", + "refund": "*" + } } ] } diff --git a/test/features/basic-features/scenarios/crypto_verify_bls_aggregated_signature.scen.json b/test/features/basic-features/scenarios/crypto_verify_bls_aggregated_signature.scen.json new file mode 100644 index 000000000..490fb1de8 --- /dev/null +++ b/test/features/basic-features/scenarios/crypto_verify_bls_aggregated_signature.scen.json @@ -0,0 +1,80 @@ +{ + "name": "crypto", + "comment": "does not currently work with scenarios-rs, because verify_bls function is not yet mocked", + "gasSchedule": "v3", + "steps": [ + { + "step": "setState", + "accounts": { + "sc:basic-features-crypto": { + "nonce": "0", + "balance": "0", + "code": "mxsc:../output/basic-features-crypto.mxsc.json" + }, + "address:an_account": { + "nonce": "0", + "balance": "0" + } + } + }, + { + "step": "scCall", + "id": "bls multi - ok", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features-crypto", + "function": "verify_bls_aggregated_signature", + "arguments": [ + [ + "nested:0x95f1d96b582f35294eb7dd4589b158e108e1d94cd0dd71ef16140e9b37126ec52dac6f57397f1e041acd7bb77df1d214f9f894e3b7fbf7abeaabc9fab8ff5c2ef05f9841322f301fdb900ac59479c334ac76a2d4ff992cd49bc9b530c25ee293", + "nested:0x97aa2862418eb4ea74fddcb511eef9b771e07ff901e7e6abb35847a4bb81e58f189fc9bce4186c6129014fb43002300e959702ef4b9d0c32ebe4d795457095d65b5414efb36edbb8dc66d84a445a92472d4a31cedd4700d5ebb885eb11d3430b", + "nested:0x37b73265936a2aaafe652a4dd451a1851c2dbbb32208604787479b31033e2a354615562ea2a5488f9134843362477a139050a0e798dd5ce0f01b35b8d473454ae99633aadde9237f84c87eb366144cca4de3d2cc6acc35e522a3294bf1186800", + "nested:0xf46c10d114dcd3019dd4bcd4152fda678c56144eb177c67a6411213b86e206e4e56a9aad1eab0313b13031fda046d715ec4a02612b083dfae0d82a23b643e1a89756c0df3d65c27e87a9c1289628d1a8404f0668a3d87c7451ba1c78fc452693", + "nested:0xaa0a97917df9240c537c89e873d7baa5ce1796e8fedfb23cf682b80fa19b8baae35af3754f9b8149985cb2a1fbda0f02c2942d2c99d9af556c9a5e90b8170e6a96379a45dd69351abfb814a16b5665abb7ddb8b096ee9f273de81845cda9728a" + ], + "str:message0", + "0xae12858363e8caa5b398d3febdd7bc01bc2fae1fef8f486ff4d84a5f3342f2d38085904eb10b73c0879a45d23585ce8f" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "bls multi - fail", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features-crypto", + "function": "verify_bls_aggregated_signature", + "arguments": [ + [ + "nested:0x95f1d96b582f35294eb7dd4589b158e108e1d94cd0dd71ef16140e9b37126ec52dac6f57397f1e041acd7bb77df1d214f9f894e3b7fbf7abeaabc9fab8ff5c2ef05f9841322f301fdb900ac59479c334ac76a2d4ff992cd49bc9b530c25ee293", + "nested:0x97aa2862418eb4ea74fddcb511eef9b771e07ff901e7e6abb35847a4bb81e58f189fc9bce4186c6129014fb43002300e959702ef4b9d0c32ebe4d795457095d65b5414efb36edbb8dc66d84a445a92472d4a31cedd4700d5ebb885eb11d3430b", + "nested:0x37b73265936a2aaafe652a4dd451a1851c2dbbb32208604787479b31033e2a354615562ea2a5488f9134843362477a139050a0e798dd5ce0f01b35b8d473454ae99633aadde9237f84c87eb366144cca4de3d2cc6acc35e522a3294bf1186800", + "nested:0xf46c10d114dcd3019dd4bcd4152fda678c56144eb177c67a6411213b86e206e4e56a9aad1eab0313b13031fda046d715ec4a02612b083dfae0d82a23b643e1a89756c0df3d65c27e87a9c1289628d1a8404f0668a3d87c7451ba1c78fc452693", + "nested:0xaa0a97917df9240c537c89e873d7baa5ce1796e8fedfb23cf682b80fa19b8baae35af3754f9b8149985cb2a1fbda0f02c2942d2c99d9af556c9a5e90b8170e6a96379a45dd69351abfb814a16b5665abb7ddb8b096ee9f273de81845cda9728a" + ], + "str:message0", + "0x0012858363e8caa5b398d3febdd7bc01bc2fae1fef8f486ff4d84a5f3342f2d38085904eb10b73c0879a45d23585ce8f" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "10", + "message": "str:signature is invalid", + "logs": "*", + "gas": "*", + "refund": "*" + } + } + ] +} diff --git a/test/features/basic-features/scenarios/crypto_verify_bls_share.scen.json b/test/features/basic-features/scenarios/crypto_verify_bls_share.scen.json new file mode 100644 index 000000000..2fe8473f5 --- /dev/null +++ b/test/features/basic-features/scenarios/crypto_verify_bls_share.scen.json @@ -0,0 +1,68 @@ +{ + "name": "crypto", + "comment": "does not currently work with scenarios-rs, because function is not yet mocked", + "gasSchedule": "v3", + "steps": [ + { + "step": "setState", + "accounts": { + "sc:basic-features-crypto": { + "nonce": "0", + "balance": "0", + "code": "mxsc:../output/basic-features-crypto.mxsc.json" + }, + "address:an_account": { + "nonce": "0", + "balance": "0" + } + } + }, + { + "step": "scCall", + "id": "verify_bls_signature_share - Ok", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features-crypto", + "function": "verify_bls_signature_share", + "arguments": [ + "0x3e886a4c6e109a151f4105aee65a5192d150ef1fa68d3cd76964a0b086006dbe4324c989deb0e4416c6d6706db1b1910eb2732f08842fb4886067b9ed191109ac2188d76002d2e11da80a3f0ea89fee6b59c834cc478a6bd49cb8a193b1abb16", + "0xe96bd0f36b70c5ccc0c4396343bd7d8255b8a526c55fa1e218511fafe6539b8e", + "0x04725db195e37aa237cdbbda76270d4a229b6e7a3651104dc58c4349c0388e8546976fe54a04240530b99064e434c90f" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "verify_bls_signature_share - Fail", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features-crypto", + "function": "verify_bls_signature_share", + "arguments": [ + "0x3e886a4c6e109a151f4105aee65a5192d150ef1fa68d3cd76964a0b086006dbe4324c989deb0e4416c6d6706db1b1910eb2732f08842fb4886067b9ed191109ac2188d76002d2e11da80a3f0ea89fee6b59c834cc478a6bd49cb8a193b1abb16", + "0xe96bd0f36b70c5ccc0c4396343bd7d8255b8a526c55fa1e218511fafe6539b8e", + "0xff725db195e37aa237cdbbda76270d4a229b6e7a3651104dc58c4349c0388e8546976fe54a04240530b99064e434c90f" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "10", + "message": "str:signature is invalid", + "logs": "*", + "gas": "*", + "refund": "*" + } + } + ] +} diff --git a/test/features/basic-features/scenarios/crypto_verify_secp256r1.scen.json b/test/features/basic-features/scenarios/crypto_verify_secp256r1.scen.json new file mode 100644 index 000000000..5d22d63d9 --- /dev/null +++ b/test/features/basic-features/scenarios/crypto_verify_secp256r1.scen.json @@ -0,0 +1,67 @@ +{ + "name": "crypto", + "gasSchedule": "v3", + "steps": [ + { + "step": "setState", + "accounts": { + "sc:basic-features-crypto": { + "nonce": "0", + "balance": "0", + "code": "mxsc:../output/basic-features-crypto.mxsc.json" + }, + "address:an_account": { + "nonce": "0", + "balance": "0" + } + } + }, + { + "step": "scCall", + "id": "secp256r1 - ok", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features-crypto", + "function": "verify_secp256r1_signature", + "arguments": [ + "0x02bc52274edebbef8878eacc4d1e0ed4fb213e5b0737389701ae8d59c403325720", + "0xbf9facf48b2219db73b50c7ff59ceef2ada56632c71afc555d6bb4072d7634d1d9353acd53517ffb9a06935a89a6454fcaa40c69becf9f8029a271fd252ea55307d00d6e97a30719d48d6b7f993af24e9c54381cba02a113238eaee9d741cababeb21aaf", + "0xc7877497444274267a4ea6f42deefde23a12e44f1ec1b437018e5c0e2834ce376dec1b81ebeacf5fbc6882e69af7cafad47bbb96cfb09e8d77d12afff7543052" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "secp256r1 - fail", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features-crypto", + "function": "verify_secp256r1_signature", + "arguments": [ + "0x02bc52274edebbef8878eacc4d1e0ed4fb213e5b0737389701ae8d59c403325720", + "0xbf9facf48b2219db73b50c7ff59ceef2ada56632c71afc555d6bb4072d7634d1d9353acd53517ffb9a06935a89a6454fcaa40c69becf9f8029a271fd252ea55307d00d6e97a30719d48d6b7f993af24e9c54381cba02a113238eaee9d741cababeb21aaf", + "0x00877497444274267a4ea6f42deefde23a12e44f1ec1b437018e5c0e2834ce376dec1b81ebeacf5fbc6882e69af7cafad47bbb96cfb09e8d77d12afff7543052" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "10", + "message": "str:signature is invalid", + "logs": "*", + "gas": "*", + "refund": "*" + } + } + ] +} diff --git a/test/features/basic-features/scenarios/managed_decimal.scen.json b/test/features/basic-features/scenarios/managed_decimal.scen.json new file mode 100644 index 000000000..b723c07b6 --- /dev/null +++ b/test/features/basic-features/scenarios/managed_decimal.scen.json @@ -0,0 +1,146 @@ +{ + "steps": [ + { + "step": "setState", + "accounts": { + "sc:basic-features": { + "nonce": "0", + "balance": "0", + "code": "mxsc:../output/basic-features.mxsc.json" + }, + "address:an_account": { + "nonce": "0", + "balance": "0" + } + } + }, + { + "step": "scCall", + "id": "1", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "managed_decimal_addition", + "arguments": [ + "4", + "5" + ], + "gasLimit": "1,000,000,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "9" + ] + } + }, + { + "step": "scCall", + "id": "1", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "managed_decimal_subtraction", + "arguments": [ + "9", + "4" + ], + "gasLimit": "1,000,000,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "5" + ] + } + }, + { + "step": "scCall", + "id": "2", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "managed_decimal_subtraction", + "arguments": [ + "2", + "8" + ], + "gasLimit": "1,000,000,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "4", + "message": "str:cannot subtract because result would be negative", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "3", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "managed_decimal_eq", + "arguments": [ + "13", + "13" + ], + "gasLimit": "1,000,000,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "0x01" + ], + "status": "", + "message": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "4", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "managed_decimal_trunc", + "arguments": [], + "gasLimit": "1,000,000,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "313" + ], + "status": "", + "message": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "5", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "managed_decimal_into_raw_units", + "arguments": [], + "gasLimit": "1,000,000,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "12345" + ], + "status": "", + "message": "*", + "gas": "*", + "refund": "*" + } + } + ] +} diff --git a/test/features/basic-features/scenarios/managed_decimal_logarithm.scen.json b/test/features/basic-features/scenarios/managed_decimal_logarithm.scen.json new file mode 100644 index 000000000..193517275 --- /dev/null +++ b/test/features/basic-features/scenarios/managed_decimal_logarithm.scen.json @@ -0,0 +1,110 @@ +{ + "steps": [ + { + "step": "setState", + "accounts": { + "sc:basic-features": { + "nonce": "0", + "balance": "0", + "code": "mxsc:../output/basic-features.mxsc.json" + }, + "address:an_account": { + "nonce": "0", + "balance": "0" + } + } + }, + { + "step": "scCall", + "id": "managed_decimal_ln(23)", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "managed_decimal_ln", + "arguments": [ + "23,000000000" + ], + "gasLimit": "25,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "+3,135553845" + ], + "status": "", + "message": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "managed_decimal_ln(378,298)", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "managed_decimal_ln", + "arguments": [ + "378,298000000" + ], + "gasLimit": "1,000,000,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "0x0161cc16aa" + ], + "status": "", + "message": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "managed_decimal_log2(23)", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "managed_decimal_log2", + "arguments": [ + "23,000000000" + ], + "gasLimit": "1,000,000,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "4,523648008" + ], + "status": "", + "message": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "managed_decimal_log2(218,345)", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "managed_decimal_log2", + "arguments": [ + "218,345000000" + ], + "gasLimit": "1,000,000,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "7,770385327" + ], + "status": "", + "message": "*", + "gas": "*", + "refund": "*" + } + } + ] +} diff --git a/test/features/basic-features/scenarios/managed_vec_array_push.scen.json b/test/features/basic-features/scenarios/managed_vec_array_push.scen.json deleted file mode 100644 index 1412fd5e3..000000000 --- a/test/features/basic-features/scenarios/managed_vec_array_push.scen.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "steps": [ - { - "step": "setState", - "accounts": { - "sc:basic-features": { - "nonce": "0", - "balance": "0", - "code": "mxsc:../output/basic-features.mxsc.json" - }, - "address:an_account": { - "nonce": "0", - "balance": "0" - } - } - }, - { - "step": "scQuery", - "id": "1", - "tx": { - "to": "sc:basic-features", - "function": "managed_vec_array_push", - "arguments": [ - "", - "str:12345" - ] - }, - "expect": { - "out": [ - "str:12345" - ] - } - }, - { - "step": "scQuery", - "id": "1", - "tx": { - "to": "sc:basic-features", - "function": "managed_vec_array_push", - "arguments": [ - "str:12345", - "str:67890" - ] - }, - "expect": { - "out": [ - "str:1234567890" - ] - } - } - ] -} diff --git a/test/features/basic-features/scenarios/storage_i64_bad.scen.json b/test/features/basic-features/scenarios/storage_i64_bad.scen.json index 74ae9f7bf..6fb3ab0c5 100644 --- a/test/features/basic-features/scenarios/storage_i64_bad.scen.json +++ b/test/features/basic-features/scenarios/storage_i64_bad.scen.json @@ -33,7 +33,7 @@ "expect": { "out": [], "status": "*", - "message": "str:storage decode error: input too long", + "message": "str:storage decode error (key: i64): argument out of range", "logs": "*", "gas": "*", "refund": "*" diff --git a/test/features/basic-features/scenarios/storage_mapper_get_at_address.scen.json b/test/features/basic-features/scenarios/storage_mapper_get_at_address.scen.json index 7577d8d5b..2a0ff501a 100644 --- a/test/features/basic-features/scenarios/storage_mapper_get_at_address.scen.json +++ b/test/features/basic-features/scenarios/storage_mapper_get_at_address.scen.json @@ -152,6 +152,224 @@ "gas": "*", "refund": "*" } + }, + { + "step": "scCall", + "id": "next at address", + "tx": { + "from": "address:an_account", + "to": "sc:caller", + "function": "next_at_address", + "arguments": [ + "5" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "6" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "previous at address", + "tx": { + "from": "address:an_account", + "to": "sc:caller", + "function": "previous_at_address", + "arguments": [ + "5" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "4" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "front at address", + "tx": { + "from": "address:an_account", + "to": "sc:caller", + "function": "front_at_address", + "arguments": [], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "1" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "back at address", + "tx": { + "from": "address:an_account", + "to": "sc:caller", + "function": "back_at_address", + "arguments": [], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "10" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "fill map mapper", + "tx": { + "from": "address:an_account", + "to": "sc:to-be-called", + "function": "fill_map_mapper", + "arguments": [ + "5" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "keys at address", + "tx": { + "from": "address:an_account", + "to": "sc:caller", + "function": "keys_at_address", + "arguments": [], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "0x0000271100002712000027130000271400002715" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "values at address", + "tx": { + "from": "address:an_account", + "to": "sc:caller", + "function": "values_at_address", + "arguments": [], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "0x0000000100000002000000030000000400000005" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "fill unordered set mapper", + "tx": { + "from": "address:an_account", + "to": "sc:to-be-called", + "function": "fill_unordered_set_mapper", + "arguments": [ + "10" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "contains unordered at address", + "tx": { + "from": "address:an_account", + "to": "sc:caller", + "function": "contains_unordered_at_address", + "arguments": [ + "5" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "0x01" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "get by index at address", + "tx": { + "from": "address:an_account", + "to": "sc:caller", + "function": "get_by_index", + "arguments": [ + "5" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "5" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } } ] } diff --git a/test/features/basic-features/scenarios/storage_mapper_get_at_address_extra_key.scen.json b/test/features/basic-features/scenarios/storage_mapper_get_at_address_extra_key.scen.json new file mode 100644 index 000000000..d2802f41d --- /dev/null +++ b/test/features/basic-features/scenarios/storage_mapper_get_at_address_extra_key.scen.json @@ -0,0 +1,90 @@ +{ + "name": "storage mapper get at address", + "gasSchedule": "v3", + "steps": [ + { + "step": "setState", + "accounts": { + "sc:basic-features": { + "nonce": "0", + "balance": "0", + "code": "mxsc:../output/basic-features.mxsc.json" + }, + "sc:with-storage": { + "nonce": "0", + "balance": "0", + "code": "mxsc:../output/basic-features.mxsc.json" + }, + "address:an_account": { + "nonce": "0", + "balance": "0" + } + } + }, + { + "step": "scCall", + "id": "set single_value_with_keys", + "tx": { + "from": "address:an_account", + "to": "sc:with-storage", + "function": "set_single_value_mapper_with_key", + "arguments": [ + "5", + "str:to-read" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scQuery", + "id": "check single_value_with_keys", + "tx": { + "to": "sc:basic-features", + "function": "get_value_from_address_with_keys", + "arguments": [ + "sc:with-storage", + "5" + ] + }, + "expect": { + "out": [ + "str:to-read" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "checkState", + "accounts": { + "sc:basic-features": { + "nonce": "0", + "balance": "0", + "code": "mxsc:../output/basic-features.mxsc.json" + }, + "sc:with-storage": { + "nonce": "0", + "balance": "0", + "storage": { + "str:single_value_mapper_with_key|0x00000005": "str:to-read" + }, + "code": "mxsc:../output/basic-features.mxsc.json" + }, + "address:an_account": { + "nonce": "*", + "balance": "0" + } + } + } + ] +} diff --git a/test/features/basic-features/scenarios/storage_mapper_set.scen.json b/test/features/basic-features/scenarios/storage_mapper_set.scen.json index 0bdd15381..3e5b59ed9 100644 --- a/test/features/basic-features/scenarios/storage_mapper_set.scen.json +++ b/test/features/basic-features/scenarios/storage_mapper_set.scen.json @@ -298,6 +298,209 @@ "gas": "*", "refund": "*" } + }, + { + "step": "scCall", + "id": "first-insert", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "set_mapper_insert", + "arguments": [ + "111" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "true" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "second-insert", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "set_mapper_insert", + "arguments": [ + "222" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "true" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "third-insert", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "set_mapper_insert", + "arguments": [ + "333" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "true" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "check-front", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "set_mapper_front", + "arguments": [], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "111" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "check-back", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "set_mapper_back", + "arguments": [], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "333" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "check-next", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "set_mapper_next", + "arguments": [ + "222" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "333" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "check-next-out-of-bounds", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "set_mapper_next", + "arguments": [ + "333" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "0" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "check-previous", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "set_mapper_previous", + "arguments": [ + "222" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "111" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "check-iter-from", + "tx": { + "from": "address:an_account", + "to": "sc:basic-features", + "function": "set_mapper_iter_from_and_count", + "arguments": [ + "222" + ], + "gasLimit": "50,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [ + "2" + ], + "status": "", + "logs": "*", + "gas": "*", + "refund": "*" + } } ] } diff --git a/test/features/basic-features/scenarios/storage_opt_managed_addr.scen.json b/test/features/basic-features/scenarios/storage_opt_managed_addr.scen.json index 352c818b2..81f66436e 100644 --- a/test/features/basic-features/scenarios/storage_opt_managed_addr.scen.json +++ b/test/features/basic-features/scenarios/storage_opt_managed_addr.scen.json @@ -36,7 +36,7 @@ "expect": { "out": [], "status": "4", - "message": "str:storage decode error: input too long", + "message": "str:storage decode error (key: opt_addr): input too long", "logs": "*", "gas": "*", "refund": "*" diff --git a/test/features/basic-features/scenarios/storage_u64_bad.scen.json b/test/features/basic-features/scenarios/storage_u64_bad.scen.json index 4bceff73d..c7597fd01 100644 --- a/test/features/basic-features/scenarios/storage_u64_bad.scen.json +++ b/test/features/basic-features/scenarios/storage_u64_bad.scen.json @@ -33,7 +33,7 @@ "expect": { "out": [], "status": "4", - "message": "str:storage decode error: input too long", + "message": "str:storage decode error (key: u64): input too long", "logs": "*", "gas": "*", "refund": "*" diff --git a/test/features/basic-features/scenarios/storage_usize_bad.scen.json b/test/features/basic-features/scenarios/storage_usize_bad.scen.json index 677f74a60..e74cc2ca9 100644 --- a/test/features/basic-features/scenarios/storage_usize_bad.scen.json +++ b/test/features/basic-features/scenarios/storage_usize_bad.scen.json @@ -33,7 +33,7 @@ "expect": { "out": [], "status": "4", - "message": "str:storage decode error: input too long", + "message": "str:storage decode error (key: usize): input too long", "logs": "*", "gas": "*", "refund": "*" diff --git a/testcommon/testCallGraph.go b/testcommon/testCallGraph.go index 46241d0d0..c8fe92bae 100644 --- a/testcommon/testCallGraph.go +++ b/testcommon/testCallGraph.go @@ -342,9 +342,10 @@ type TestCallGraph struct { // CreateTestCallGraph is the initial build metohd for the call graph func CreateTestCallGraph() *TestCallGraph { + cryptoVM, _ := factory.NewVMCrypto() return &TestCallGraph{ Nodes: make([]*TestCallNode, 0), - Crypto: factory.NewVMCrypto(), + Crypto: cryptoVM, } } diff --git a/testcommon/testHostBuilder.go b/testcommon/testHostBuilder.go index 1762c8813..d4fb8f901 100644 --- a/testcommon/testHostBuilder.go +++ b/testcommon/testHostBuilder.go @@ -32,17 +32,18 @@ func NewTestHostBuilder(tb testing.TB) *TestHostBuilder { return &TestHostBuilder{ tb: tb, vmHostParameters: &vmhost.VMHostParameters{ - VMType: DefaultVMType, - BlockGasLimit: uint64(1000), - GasSchedule: nil, - BuiltInFuncContainer: nil, - ProtectedKeyPrefix: []byte("E" + "L" + "R" + "O" + "N" + "D"), - ESDTTransferParser: esdtTransferParser, - EpochNotifier: &mock.EpochNotifierStub{}, - EnableEpochsHandler: worldmock.EnableEpochsHandlerStubAllFlags(), - OverrideVMExecutor: nil, - WasmerSIGSEGVPassthrough: false, - Hasher: defaultHasher, + VMType: DefaultVMType, + BlockGasLimit: uint64(1000), + GasSchedule: nil, + BuiltInFuncContainer: nil, + ProtectedKeyPrefix: []byte("E" + "L" + "R" + "O" + "N" + "D"), + ESDTTransferParser: esdtTransferParser, + EpochNotifier: &mock.EpochNotifierStub{}, + EnableEpochsHandler: worldmock.EnableEpochsHandlerStubAllFlags(), + OverrideVMExecutor: nil, + WasmerSIGSEGVPassthrough: false, + Hasher: defaultHasher, + MapOpcodeAddressIsAllowed: map[string]map[string]struct{}{}, }, } } diff --git a/vmhost/common.go b/vmhost/common.go index 0e511cae3..e38c7bd02 100644 --- a/vmhost/common.go +++ b/vmhost/common.go @@ -209,6 +209,7 @@ type VMHostParameters struct { EnableEpochsHandler EnableEpochsHandler Hasher HashComputer TimeOutForSCExecutionInMilliseconds uint32 + MapOpcodeAddressIsAllowed map[string]map[string]struct{} } // AsyncCallInfo contains the information required to handle the asynchronous call of another SmartContract @@ -297,10 +298,12 @@ func (ac *AsyncGeneratedCall) IsInterfaceNil() bool { // ESDTTransfersArgs defines the structure for ESDTTransferArgs, used in TransferAndExecute type ESDTTransfersArgs struct { - Destination []byte - OriginalCaller []byte - Sender []byte - Transfers []*vmcommon.ESDTTransfer - Function string - Arguments [][]byte + Destination []byte + OriginalCaller []byte + Sender []byte + Transfers []*vmcommon.ESDTTransfer + Function string + Arguments [][]byte + SenderForExec []byte + ReturnAfterError bool } diff --git a/vmhost/contexts/async_test.go b/vmhost/contexts/async_test.go index f1a239331..31a148bf5 100644 --- a/vmhost/contexts/async_test.go +++ b/vmhost/contexts/async_test.go @@ -60,7 +60,9 @@ func initializeVMAndWasmerAsyncContextWithBuiltIn(tb testing.TB, isBuiltinFunc b require.Nil(tb, err) wasmer.SetOpcodeCosts(gasCostConfig.WASMOpcodeCost) - host := &contextmock.VMHostMock{} + host := &contextmock.VMHostMock{ + EnableEpochsHandlerField: &worldmock.EnableEpochsHandlerStub{}, + } mockMetering := &contextmock.MeteringContextMock{GasLeftMock: 10000} mockMetering.SetGasSchedule(gasSchedule) @@ -94,7 +96,7 @@ func initializeVMAndWasmerAsyncContextWithBuiltIn(tb testing.TB, isBuiltinFunc b host.StorageContext = storageCtx host.OutputContext, _ = NewOutputContext(host) - host.CryptoHook = factory.NewVMCrypto() + host.CryptoHook, _ = factory.NewVMCrypto() host.StorageContext, _ = NewStorageContext(host, world, reservedTestPrefix) host.EnableEpochsHandlerField = worldmock.EnableEpochsHandlerStubNoFlags() host.IsBuiltinFunc = isBuiltinFunc diff --git a/vmhost/contexts/output.go b/vmhost/contexts/output.go index 1cf8ddad6..fb77b9141 100644 --- a/vmhost/contexts/output.go +++ b/vmhost/contexts/output.go @@ -497,6 +497,7 @@ func (context *outputContext) TransferESDT( esdtOutTransfer := outputAcc.OutputTransfers[0] esdtOutTransfer.GasLimit = gasRemaining esdtOutTransfer.CallType = callType + esdtOutTransfer.SenderAddress = transfersArgs.SenderForExec if sameShard { esdtOutTransfer.GasLimit = 0 } @@ -815,6 +816,7 @@ func mergeStorageUpdates( if leftAccount.StorageUpdates == nil { leftAccount.StorageUpdates = make(map[string]*vmcommon.StorageUpdate) } + for key, update := range rightAccount.StorageUpdates { leftAccount.StorageUpdates[key] = update } diff --git a/vmhost/contexts/reservedFunctions.go b/vmhost/contexts/reservedFunctions.go index 25771e64b..be9152127 100644 --- a/vmhost/contexts/reservedFunctions.go +++ b/vmhost/contexts/reservedFunctions.go @@ -11,7 +11,10 @@ type reservedFunctions struct { } // NewReservedFunctions creates a new reservedFunctions -func NewReservedFunctions(scAPINames vmcommon.FunctionNames, builtInFuncContainer vmcommon.BuiltInFunctionContainer) *reservedFunctions { +func NewReservedFunctions( + scAPINames vmcommon.FunctionNames, + builtInFuncContainer vmcommon.BuiltInFunctionContainer, +) *reservedFunctions { result := &reservedFunctions{ functionNames: make(vmcommon.FunctionNames), } diff --git a/vmhost/contexts/runtime.go b/vmhost/contexts/runtime.go index 96c5379d4..22238a5e5 100644 --- a/vmhost/contexts/runtime.go +++ b/vmhost/contexts/runtime.go @@ -17,6 +17,15 @@ var logRuntime = logger.GetOrCreate("vm/runtime") var _ vmhost.RuntimeContext = (*runtimeContext)(nil) +var mapNewCryptoAPI = map[string]struct{}{ + "managedVerifyBLSSignatureShare": {}, + "managedVerifyBLSAggregatedSignature": {}, + "managedVerifySecp256r1": {}, + "managedGetOriginalCallerAddr": {}, + "managedGetRelayerAddr": {}, + "managedMultiTransferESDTNFTExecuteByUser": {}, +} + const warmCacheSize = 100 // WarmInstancesEnabled controls the usage of warm instances @@ -496,6 +505,10 @@ func (context *runtimeContext) SetVMInput(vmInput *vmcommon.ContractCallInput) { context.vmInput.OriginalCallerAddr = make([]byte, len(vmInput.OriginalCallerAddr)) copy(context.vmInput.OriginalCallerAddr, vmInput.OriginalCallerAddr) } + if len(vmInput.RelayerAddr) > 0 { + context.vmInput.RelayerAddr = make([]byte, len(vmInput.RelayerAddr)) + copy(context.vmInput.RelayerAddr, vmInput.RelayerAddr) + } context.vmInput.ESDTTransfers = make([]*vmcommon.ESDTTransfer, len(vmInput.ESDTTransfers)) @@ -667,8 +680,8 @@ func (context *runtimeContext) VerifyContractCode() error { } enableEpochsHandler := context.host.EnableEpochsHandler() - if enableEpochsHandler.IsFlagEnabled(vmhost.ManagedCryptoAPIsFlag) { - err = context.validator.verifyProtectedFunctions(context.iTracker.Instance()) + if !enableEpochsHandler.IsFlagEnabled(vmhost.CryptoOpcodesV2Flag) { + err = context.checkIfContainsNewCryptoApi() if err != nil { logRuntime.Trace("verify contract code", "error", err) return err @@ -680,6 +693,15 @@ func (context *runtimeContext) VerifyContractCode() error { return nil } +func (context *runtimeContext) checkIfContainsNewCryptoApi() error { + for funcName := range mapNewCryptoAPI { + if context.iTracker.Instance().IsFunctionImported(funcName) { + return vmhost.ErrContractInvalid + } + } + return nil +} + // BaseOpsErrorShouldFailExecution returns true func (context *runtimeContext) BaseOpsErrorShouldFailExecution() bool { return true @@ -891,6 +913,11 @@ func (context *runtimeContext) ValidateCallbackName(callbackName string) error { return nil } +// IsReservedFunctionName checks if the function name is reserved +func (context *runtimeContext) IsReservedFunctionName(functionName string) bool { + return context.validator.reserved.IsReserved(functionName) +} + // HasFunction checks if loaded contract has a function (endpoint) with given name. func (context *runtimeContext) HasFunction(functionName string) bool { return context.iTracker.Instance().HasFunction(functionName) diff --git a/vmhost/contexts/runtime_test.go b/vmhost/contexts/runtime_test.go index c93ab1c4d..96cb131fb 100644 --- a/vmhost/contexts/runtime_test.go +++ b/vmhost/contexts/runtime_test.go @@ -41,7 +41,7 @@ func InitializeVMAndWasmer() *contextmock.VMHostMock { host.MeteringContext = mockMetering host.BlockchainContext, _ = NewBlockchainContext(host, worldmock.NewMockWorld()) host.OutputContext, _ = NewOutputContext(host) - host.CryptoHook = factory.NewVMCrypto() + host.CryptoHook, _ = factory.NewVMCrypto() return host } diff --git a/vmhost/contexts/storage.go b/vmhost/contexts/storage.go index e078fa9c2..b6e877865 100644 --- a/vmhost/contexts/storage.go +++ b/vmhost/contexts/storage.go @@ -3,6 +3,7 @@ package contexts import ( "bytes" "fmt" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" logger "github.com/multiversx/mx-chain-logger-go" @@ -136,9 +137,7 @@ func (context *storageContext) GetStorage(key []byte) ([]byte, uint32, bool, err func (context *storageContext) useGasForValueIfNeeded(value []byte, usedCache bool) error { metering := context.host.Metering() - enableEpochsHandler := context.host.EnableEpochsHandler() - gasFlagSet := enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) - if !usedCache || !gasFlagSet { + if !usedCache { costPerByte := metering.GasSchedule().BaseOperationCost.DataCopyPerByte gasToUse := math.MulUint64(costPerByte, uint64(len(value))) return metering.UseGasBounded(gasToUse) @@ -154,9 +153,7 @@ func (context *storageContext) useExtraGasForKeyIfNeeded(key []byte, usedCache b return nil } - enableEpochsHandler := context.host.EnableEpochsHandler() - gasFlagSet := enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) - if !gasFlagSet || !usedCache { + if !usedCache { gasToUse := math.MulUint64(metering.GasSchedule().BaseOperationCost.DataCopyPerByte, uint64(extraBytes)) return metering.UseGasBounded(gasToUse) } @@ -176,14 +173,13 @@ func (context *storageContext) GetStorageFromAddress(address []byte, key []byte) return nil, 0, false, nil } + isReadFromUserAddress := context.host.EnableEpochsHandler().IsFlagEnabled(vmhost.CryptoOpcodesV2Flag) && + !core.IsSmartContractAddress(address) + metadata := vmcommon.CodeMetadataFromBytes(userAcc.GetCodeMetadata()) - if !metadata.Readable { + if !metadata.Readable && !isReadFromUserAddress { errGas := context.useExtraGasForKeyIfNeeded(key, false) - if errGas != nil { - return nil, 0, false, errGas - } - - return nil, 0, false, nil + return nil, 0, false, errGas } } @@ -220,8 +216,7 @@ func (context *storageContext) getStorageFromAddressUnmetered(address []byte, ke var err error var trieDepth uint32 - enableEpochsHandler := context.host.EnableEpochsHandler() - if context.isProtocolProtectedKey(key) && enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) { + if context.isProtocolProtectedKey(key) && !context.isVMProtectedKey(key) { value, trieDepth, err = context.readFromBlockchain(address, key) return value, trieDepth, false, err } @@ -321,7 +316,7 @@ func (context *storageContext) setStorageToAddress(address []byte, key []byte, v } if bytes.Equal(oldValue, value) { - return context.storageUnchanged(length, usedCache) + return context.storageUnchanged(length, usedCache, key) } deltaBytes := len(value) - len(oldValue) @@ -447,22 +442,21 @@ func (context *storageContext) storageDeleted(lengthOldValue int, key []byte) (v return vmhost.StorageDeleted, nil } -func (context *storageContext) storageUnchanged(length int, usedCache bool) (vmhost.StorageStatus, error) { +func (context *storageContext) storageUnchanged(length int, usedCache bool, key []byte) (vmhost.StorageStatus, error) { useGas := context.computeGasForUnchangedValue(length, usedCache) err := context.host.Metering().UseGasBounded(useGas) if err != nil { return vmhost.StorageUnchanged, err } - logStorage.Trace("storage set to identical value") + logStorage.Trace("storage set to identical value", "key", key) return vmhost.StorageUnchanged, nil } func (context *storageContext) computeGasForUnchangedValue(length int, usedCache bool) uint64 { metering := context.host.Metering() useGas := uint64(0) - enableEpochsHandler := context.host.EnableEpochsHandler() - if !usedCache || !enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) { + if !usedCache { useGas = math.MulUint64(metering.GasSchedule().BaseOperationCost.DataCopyPerByte, uint64(length)) } return useGas @@ -495,9 +489,7 @@ func (context *storageContext) computeGasForKey(key []byte, usedCache bool) uint metering := context.host.Metering() extraBytes := len(key) - vmhost.AddressLen extraKeyLenGas := uint64(0) - enableEpochsHandler := context.host.EnableEpochsHandler() - if extraBytes > 0 && - (!usedCache || !enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag)) { + if extraBytes > 0 && !usedCache { extraKeyLenGas = math.MulUint64(metering.GasSchedule().BaseOperationCost.DataCopyPerByte, uint64(extraBytes)) } return extraKeyLenGas @@ -514,20 +506,13 @@ func (context *storageContext) UseGasForStorageLoad(tracedFunctionName string, t } func (context *storageContext) getBlockchainLoadCost(trieDepth int64, staticGasCost uint64, usedCache bool) (uint64, error) { - enableEpochsHandler := context.host.EnableEpochsHandler() - if enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) && usedCache { + if usedCache { return context.host.Metering().GasSchedule().BaseOpsAPICost.CachedStorageLoad, nil } return context.GetStorageLoadCost(trieDepth, staticGasCost) } -// IsUseDifferentGasCostFlagSet - getter for flag -func (context *storageContext) IsUseDifferentGasCostFlagSet() bool { - enableEpochsHandler := context.host.EnableEpochsHandler() - return enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) -} - // IsInterfaceNil returns true if there is no value under the interface func (context *storageContext) IsInterfaceNil() bool { return context == nil @@ -540,15 +525,11 @@ func (context *storageContext) GetVmProtectedPrefix(prefix string) []byte { // GetStorageLoadCost returns the gas cost for the storage load operation func (context *storageContext) GetStorageLoadCost(trieDepth int64, staticGasCost uint64) (uint64, error) { - if context.host.EnableEpochsHandler().IsFlagEnabled(vmhost.DynamicGasCostForDataTrieStorageLoadFlag) { - return computeGasForStorageLoadBasedOnTrieDepth( - trieDepth, - context.host.Metering().GasSchedule().DynamicStorageLoad, - staticGasCost, - ) - } - - return staticGasCost, nil + return computeGasForStorageLoadBasedOnTrieDepth( + trieDepth, + context.host.Metering().GasSchedule().DynamicStorageLoad, + staticGasCost, + ) } func computeGasForStorageLoadBasedOnTrieDepth(trieDepth int64, coefficients config.DynamicStorageLoadCostCoefficients, staticGasCost uint64) (uint64, error) { diff --git a/vmhost/contexts/storage_test.go b/vmhost/contexts/storage_test.go index 01480e167..ef7dff1f5 100644 --- a/vmhost/contexts/storage_test.go +++ b/vmhost/contexts/storage_test.go @@ -3,10 +3,10 @@ package contexts import ( "bytes" "errors" + "github.com/multiversx/mx-chain-core-go/core" "math/big" "testing" - "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-scenario-go/worldmock" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -52,11 +52,7 @@ func TestNewStorageContext(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.StorageAPICostOptimizationFlag - }, - } + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} host := &contextmock.VMHostMock{ EnableEpochsHandlerField: enableEpochsHandler, } @@ -103,11 +99,7 @@ func TestStorageContext_SetAddress(t *testing.T) { mockMetering.SetGasSchedule(config.MakeGasMapForTests()) mockMetering.BlockGasLimitMock = uint64(15000) mockMetering.GasLeftMock = 20000 - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.StorageAPICostOptimizationFlag - }, - } + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} host := &contextmock.VMHostMock{ OutputContext: stubOutput, @@ -165,11 +157,7 @@ func TestStorageContext_GetStorageUpdates(t *testing.T) { Data: []byte("some data"), } - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.StorageAPICostOptimizationFlag - }, - } + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} host := &contextmock.VMHostMock{ OutputContext: mockOutput, @@ -200,12 +188,7 @@ func TestStorageContext_SetStorage(t *testing.T) { mockMetering.BlockGasLimitMock = uint64(15000) mockMetering.GasLeftMock = 20000 - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.StorageAPICostOptimizationFlag - }, - } - + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} host := &contextmock.VMHostMock{ OutputContext: mockOutput, MeteringContext: mockMetering, @@ -353,11 +336,7 @@ func TestStorageContext_SetStorage_GasUsage(t *testing.T) { mockMetering.SetGasSchedule(gasMap) mockMetering.BlockGasLimitMock = uint64(15000) - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.StorageAPICostOptimizationFlag - }, - } + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} host := &contextmock.VMHostMock{ OutputContext: mockOutput, MeteringContext: mockMetering, @@ -423,12 +402,7 @@ func TestStorageContext_StorageProtection(t *testing.T) { mockMetering.BlockGasLimitMock = uint64(15000) mockMetering.GasLeftMock = 20000 - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.StorageAPICostOptimizationFlag - }, - } - + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} host := &contextmock.VMHostMock{ OutputContext: mockOutput, MeteringContext: mockMetering, @@ -471,13 +445,18 @@ func TestStorageContext_StorageProtection(t *testing.T) { func TestStorageContext_GetStorageFromAddress(t *testing.T) { t.Parallel() - scAddress := []byte("account") - readable := []byte("readable") - nonreadable := []byte("nonreadable") + scAddress := bytes.Repeat([]byte{0}, 32) + readable := bytes.Repeat([]byte{0}, 32) + readable[31] = 1 + nonreadable := bytes.Repeat([]byte{0}, 32) + nonreadable[31] = 2 + + userAddress := bytes.Repeat([]byte{1}, 32) + isEnabled := false enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.StorageAPICostOptimizationFlag + IsFlagEnabledCalled: func(_ core.EnableEpochFlag) bool { + return isEnabled }, } @@ -502,9 +481,7 @@ func TestStorageContext_GetStorageFromAddress(t *testing.T) { t.Run("blockchain hook errors", func(t *testing.T) { errTooManyRequests := errors.New("too many requests") bcHook := makeBcHookStub( - scAddress, readable, - nonreadable, nil, errTooManyRequests) @@ -523,14 +500,22 @@ func TestStorageContext_GetStorageFromAddress(t *testing.T) { data, _, _, _ = storageCtx.GetStorageFromAddress(nonreadable, key) require.Nil(t, data) require.Equal(t, errTooManyRequests, err) + + isEnabled = false + data, _, _, _ = storageCtx.GetStorageFromAddress(userAddress, key) + require.Nil(t, data) + require.Equal(t, errTooManyRequests, err) + + isEnabled = true + data, _, _, _ = storageCtx.GetStorageFromAddress(userAddress, key) + require.Nil(t, data) + require.Equal(t, errTooManyRequests, err) }) t.Run("should work when blockchain hook does not error", func(t *testing.T) { internalData := []byte("internalData") bcHook := makeBcHookStub( - scAddress, readable, - nonreadable, internalData, nil) @@ -549,13 +534,21 @@ func TestStorageContext_GetStorageFromAddress(t *testing.T) { data, _, _, err = storageCtx.GetStorageFromAddress(nonreadable, key) require.Nil(t, err) require.Nil(t, data) + + isEnabled = false + data, _, _, err = storageCtx.GetStorageFromAddress(userAddress, key) + require.Nil(t, err) + require.Nil(t, data) + + isEnabled = true + data, _, _, err = storageCtx.GetStorageFromAddress(userAddress, key) + require.Nil(t, err) + require.Equal(t, data, internalData) }) } func makeBcHookStub( - scAddress []byte, readable []byte, - nonreadable []byte, internalData []byte, getStorageErr error, ) *contextmock.BlockchainHookStub { @@ -564,10 +557,7 @@ func makeBcHookStub( if bytes.Equal(readable, address) { return &worldmock.Account{CodeMetadata: []byte{4, 0}}, nil } - if bytes.Equal(nonreadable, address) || bytes.Equal(scAddress, address) { - return &worldmock.Account{CodeMetadata: []byte{0, 0}}, nil - } - return nil, nil + return &worldmock.Account{CodeMetadata: []byte{0, 0}}, nil }, GetStorageDataCalled: func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { return internalData, 0, getStorageErr @@ -585,11 +575,7 @@ func TestStorageContext_StoreGasPerKey(t *testing.T) { func TestStorageContext_PopSetActiveStateIfStackIsEmptyShouldNotPanic(t *testing.T) { t.Parallel() - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.StorageAPICostOptimizationFlag - }, - } + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} host := &contextmock.VMHostMock{ EnableEpochsHandlerField: enableEpochsHandler, @@ -603,11 +589,7 @@ func TestStorageContext_PopSetActiveStateIfStackIsEmptyShouldNotPanic(t *testing func TestStorageContext_PopDiscardIfStackIsEmptyShouldNotPanic(t *testing.T) { t.Parallel() - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.StorageAPICostOptimizationFlag - }, - } + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} host := &contextmock.VMHostMock{ EnableEpochsHandlerField: enableEpochsHandler, @@ -622,31 +604,10 @@ func TestStorageContext_PopDiscardIfStackIsEmptyShouldNotPanic(t *testing.T) { func TestStorageContext_GetStorageLoadCost(t *testing.T) { t.Parallel() - t.Run("disabled DynamicGasCostForDataTrieStorageLoad returns static cost", func(t *testing.T) { - t.Parallel() - - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} - host := &contextmock.VMHostMock{ - EnableEpochsHandlerField: enableEpochsHandler, - } - - storageContext, _ := NewStorageContext(host, &contextmock.BlockchainHookStub{}, reservedTestPrefix) - trieDepth := int64(7) - staticCost := uint64(40000) - - cost, err := storageContext.GetStorageLoadCost(trieDepth, staticCost) - require.Nil(t, err) - require.Equal(t, staticCost, cost) - }) - t.Run("trie depth 0", func(t *testing.T) { t.Parallel() - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.DynamicGasCostForDataTrieStorageLoadFlag - }, - } + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} mockMetering := &contextmock.MeteringContextMock{ GasCost: &config.GasCost{ DynamicStorageLoad: config.DynamicStorageLoadCostCoefficients{ @@ -674,11 +635,7 @@ func TestStorageContext_GetStorageLoadCost(t *testing.T) { t.Run("fx < 0", func(t *testing.T) { t.Parallel() - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.DynamicGasCostForDataTrieStorageLoadFlag - }, - } + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} mockMetering := &contextmock.MeteringContextMock{ GasCost: &config.GasCost{ DynamicStorageLoad: config.DynamicStorageLoadCostCoefficients{ @@ -706,11 +663,7 @@ func TestStorageContext_GetStorageLoadCost(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.DynamicGasCostForDataTrieStorageLoadFlag - }, - } + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} mockMetering := &contextmock.MeteringContextMock{ GasCost: &config.GasCost{ DynamicStorageLoad: config.DynamicStorageLoadCostCoefficients{ @@ -738,11 +691,7 @@ func TestStorageContext_GetStorageLoadCost(t *testing.T) { t.Run("less than minimum gas cost returns static gas cost", func(t *testing.T) { t.Parallel() - enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{ - IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { - return flag == vmhost.DynamicGasCostForDataTrieStorageLoadFlag - }, - } + enableEpochsHandler := &worldmock.EnableEpochsHandlerStub{} mockMetering := &contextmock.MeteringContextMock{ GasCost: &config.GasCost{ DynamicStorageLoad: config.DynamicStorageLoadCostCoefficients{ diff --git a/vmhost/contexts/validator.go b/vmhost/contexts/validator.go index 33114c775..c204772b4 100644 --- a/vmhost/contexts/validator.go +++ b/vmhost/contexts/validator.go @@ -17,7 +17,10 @@ type wasmValidator struct { } // newWASMValidator creates a new WASMValidator -func newWASMValidator(scAPINames vmcommon.FunctionNames, builtInFuncContainer vmcommon.BuiltInFunctionContainer) *wasmValidator { +func newWASMValidator( + scAPINames vmcommon.FunctionNames, + builtInFuncContainer vmcommon.BuiltInFunctionContainer, +) *wasmValidator { return &wasmValidator{ reserved: NewReservedFunctions(scAPINames, builtInFuncContainer), } diff --git a/vmhost/errors.go b/vmhost/errors.go index 75ad7beae..f5a3faa55 100644 --- a/vmhost/errors.go +++ b/vmhost/errors.go @@ -295,3 +295,12 @@ var ErrEmptyProtectedKeyPrefix = errors.New("protectedKeyPrefix is empty or nil" // ErrInvalidGasProvided signals that an unacceptable GasProvided value was specified var ErrInvalidGasProvided = errors.New("invalid gas provided") + +// ErrNilMapOpcodeAddress signals that nil map of opcodes and addresses was provided +var ErrNilMapOpcodeAddress = errors.New("nil map opcode address") + +// ErrOpcodeIsNotAllowed signals that opcode is not allowed for the address +var ErrOpcodeIsNotAllowed = errors.New("opcode is not allowed") + +// ErrInvalidSignature signals that a signature verification failed +var ErrInvalidSignature = errors.New("signature is invalid") diff --git a/vmhost/flags.go b/vmhost/flags.go index 1d9a32410..8d4891cb3 100644 --- a/vmhost/flags.go +++ b/vmhost/flags.go @@ -3,32 +3,12 @@ package vmhost import "github.com/multiversx/mx-chain-core-go/core" const ( - // MultiESDTTransferFixOnCallBackFlag defines the flag that activates the multi esdt transfer fix on callback - MultiESDTTransferFixOnCallBackFlag core.EnableEpochFlag = "MultiESDTTransferFixOnCallBackFlag" - // RemoveNonUpdatedStorageFlag defines the flag that activates the remove non updated storage fix - RemoveNonUpdatedStorageFlag core.EnableEpochFlag = "RemoveNonUpdatedStorageFlag" - // CreateNFTThroughExecByCallerFlag defines the flag that activates the create nft through exec by caller fix - CreateNFTThroughExecByCallerFlag core.EnableEpochFlag = "CreateNFTThroughExecByCallerFlag" - // StorageAPICostOptimizationFlag defines the flag that activates the storage api cost optimization - StorageAPICostOptimizationFlag core.EnableEpochFlag = "StorageAPICostOptimizationFlag" - // CheckExecuteOnReadOnlyFlag defines the flag that activates the check execute on read only - CheckExecuteOnReadOnlyFlag core.EnableEpochFlag = "CheckExecuteOnReadOnlyFlag" - // FailExecutionOnEveryAPIErrorFlag defines the flag that activates the fail execution on every api error - FailExecutionOnEveryAPIErrorFlag core.EnableEpochFlag = "FailExecutionOnEveryAPIErrorFlag" - // ManagedCryptoAPIsFlag defines the flag that activates the manage crypto apis - ManagedCryptoAPIsFlag core.EnableEpochFlag = "ManagedCryptoAPIsFlag" - // DisableExecByCallerFlag defines the flag that activates disable exec by caller - DisableExecByCallerFlag core.EnableEpochFlag = "DisableExecByCallerFlag" - // RefactorContextFlag defines the flag that activates the refactor context - RefactorContextFlag core.EnableEpochFlag = "RefactorContextFlag" - // RuntimeMemStoreLimitFlag defines the flag that activates the runtime mem store limit - RuntimeMemStoreLimitFlag core.EnableEpochFlag = "RuntimeMemStoreLimitFlag" - // RuntimeCodeSizeFixFlag defines the flag that activates the runtime code size fix - RuntimeCodeSizeFixFlag core.EnableEpochFlag = "RuntimeCodeSizeFixFlag" - // FixOOGReturnCodeFlag defines the flag that activates the fix oog return code - FixOOGReturnCodeFlag core.EnableEpochFlag = "FixOOGReturnCodeFlag" - // DynamicGasCostForDataTrieStorageLoadFlag defines the flag that activates the dynamic gas cost for data trie storage load - DynamicGasCostForDataTrieStorageLoadFlag core.EnableEpochFlag = "DynamicGasCostForDataTrieStorageLoadFlag" + // CryptoOpcodesV2Flag defines the flag that activates the new crypto APIs for RC1.7 + CryptoOpcodesV2Flag core.EnableEpochFlag = "CryptoOpcodesV2Flag" + + // MultiESDTNFTTransferAndExecuteByUserFlag defines the flag that activates the enshrined sovereign functions + MultiESDTNFTTransferAndExecuteByUserFlag core.EnableEpochFlag = "MultiESDTNFTTransferAndExecuteByUserFlag" + // UseGasBoundedShouldFailExecutionFlag defines the flag that activates failing of execution if gas bounded check fails UseGasBoundedShouldFailExecutionFlag core.EnableEpochFlag = "UseGasBoundedShouldFailExecutionFlag" ) diff --git a/vmhost/helpers.go b/vmhost/helpers.go index 39e8146b0..98502ae67 100644 --- a/vmhost/helpers.go +++ b/vmhost/helpers.go @@ -6,7 +6,6 @@ import ( "os" "path/filepath" - logger "github.com/multiversx/mx-chain-logger-go" "github.com/multiversx/mx-chain-vm-go/math" ) @@ -93,23 +92,6 @@ func GetTestSCCode(scName string, prefixToTestSCs string) []byte { return GetSCCode(pathToSC) } -// SetLoggingForTests configures the logger package with *:TRACE and enabled logger names -func SetLoggingForTests() { - SetLoggingForTestsWithLogger("*") -} - -// SetLoggingForTestsWithLogger configures the logger package with a certain logger -func SetLoggingForTestsWithLogger(loggerName string) { - _ = logger.SetLogLevel(fmt.Sprintf("*:NONE,%s:TRACE", loggerName)) - logger.ToggleCorrelation(false) - logger.ToggleLoggerName(true) -} - -// DisableLoggingForTests sets log level to *:NONE -func DisableLoggingForTests() { - _ = logger.SetLogLevel("*:NONE") -} - // U64ToLEB128 encodes an uint64 using LEB128 (Little Endian Base 128), used in WASM bytecode // See https://en.wikipedia.org/wiki/LEB128 // Copied from https://github.com/filecoin-project/go-leb128/blob/master/leb128.go diff --git a/vmhost/hostCore/execution.go b/vmhost/hostCore/execution.go index c478790ee..0cf57db5a 100644 --- a/vmhost/hostCore/execution.go +++ b/vmhost/hostCore/execution.go @@ -101,9 +101,7 @@ func (host *vmHost) performCodeDeployment(input vmhost.CodeDeployInput, initFunc } output.DeployCode(input) - if host.enableEpochsHandler.IsFlagEnabled(vmhost.RemoveNonUpdatedStorageFlag) { - output.RemoveNonUpdatedStorage() - } + output.RemoveNonUpdatedStorage() vmOutput := output.GetVMOutput() return vmOutput, nil @@ -258,9 +256,7 @@ func (host *vmHost) doRunSmartContractCall(input *vmcommon.ContractCallInput) *v return vmOutput } - if host.enableEpochsHandler.IsFlagEnabled(vmhost.RemoveNonUpdatedStorageFlag) { - output.RemoveNonUpdatedStorage() - } + output.RemoveNonUpdatedStorage() vmOutput = output.GetVMOutput() host.CompleteLogEntriesWithCallType(vmOutput, vmhost.DirectCallString) @@ -300,19 +296,6 @@ func (host *vmHost) ExecuteOnDestContext(input *vmcommon.ContractCallInput) (vmO blockchain.PushState() - if host.IsOutOfVMFunctionExecution(input) { - vmOutput, err = host.handleFunctionCallOnOtherVM(input) - if err != nil { - blockchain.PopSetActiveState() - host.Runtime().AddError(err, input.Function) - vmOutput = host.Output().CreateVMOutputInCaseOfError(err) - isChildComplete = true - } else { - blockchain.PopDiscard() - } - return - } - if host.IsBuiltinFunctionName(input.Function) { scExecutionInput, vmOutput, err = host.handleBuiltinFunctionCall(input) if err != nil { @@ -445,6 +428,16 @@ func (host *vmHost) handleBuiltinFunctionCall(input *vmcommon.ContractCallInput) } func (host *vmHost) executeOnDestContextNoBuiltinFunction(input *vmcommon.ContractCallInput) (vmOutput *vmcommon.VMOutput, isChildComplete bool, err error) { + if host.IsOutOfVMFunctionExecution(input) { + vmOutput, err = host.handleFunctionCallOnOtherVM(input) + if err != nil { + host.Runtime().AddError(err, input.Function) + vmOutput = host.Output().CreateVMOutputInCaseOfError(err) + } + + return vmOutput, true, err + } + managedTypes, _, metering, output, runtime, async, storage := host.GetContexts() managedTypes.PushState() managedTypes.InitState() @@ -589,10 +582,7 @@ func (host *vmHost) ExecuteOnSameContext(input *vmcommon.ContractCallInput) erro librarySCAddress := make([]byte, len(input.RecipientAddr)) copy(librarySCAddress, input.RecipientAddr) - if host.enableEpochsHandler.IsFlagEnabled(vmhost.RefactorContextFlag) { - input.RecipientAddr = input.CallerAddr - } - + input.RecipientAddr = input.CallerAddr copyTxHashesFromContext(runtime, input) runtime.PushState() runtime.InitStateFromContractCallInput(input) @@ -943,14 +933,15 @@ func (host *vmHost) ExecuteESDTTransfer(transfersArgs *vmhost.ESDTTransfersArgs, esdtTransferInput := &vmcommon.ContractCallInput{ VMInput: vmcommon.VMInput{ - OriginalCallerAddr: transfersArgs.OriginalCaller, - CallerAddr: transfersArgs.Sender, - Arguments: make([][]byte, 0), - CallValue: big.NewInt(0), - CallType: callType, - GasPrice: runtime.GetVMInput().GasPrice, - GasProvided: metering.GasLeft(), - GasLocked: 0, + OriginalCallerAddr: transfersArgs.OriginalCaller, + CallerAddr: transfersArgs.Sender, + Arguments: make([][]byte, 0), + CallValue: big.NewInt(0), + CallType: callType, + GasPrice: runtime.GetVMInput().GasPrice, + GasProvided: metering.GasLeft(), + GasLocked: 0, + ReturnCallAfterError: transfersArgs.ReturnAfterError, }, RecipientAddr: transfersArgs.Destination, Function: core.BuiltInFunctionESDTTransfer, @@ -1392,6 +1383,7 @@ func (host *vmHost) isSCExecutionAfterBuiltInFunc( OriginalTxHash: vmInput.OriginalTxHash, CurrentTxHash: vmInput.CurrentTxHash, PrevTxHash: vmInput.PrevTxHash, + RelayerAddr: vmInput.RelayerAddr, }, RecipientAddr: parsedTransfer.RcvAddr, Function: function, diff --git a/vmhost/hostCore/host.go b/vmhost/hostCore/host.go index 43197baa9..89becd3ba 100644 --- a/vmhost/hostCore/host.go +++ b/vmhost/hostCore/host.go @@ -39,19 +39,8 @@ const internalVMErrors = "internalVMErrors" // allFlags must have all flags used by mx-chain-vm-go in the current version var allFlags = []core.EnableEpochFlag{ - vmhost.MultiESDTTransferFixOnCallBackFlag, - vmhost.RemoveNonUpdatedStorageFlag, - vmhost.CreateNFTThroughExecByCallerFlag, - vmhost.StorageAPICostOptimizationFlag, - vmhost.CheckExecuteOnReadOnlyFlag, - vmhost.FailExecutionOnEveryAPIErrorFlag, - vmhost.ManagedCryptoAPIsFlag, - vmhost.DisableExecByCallerFlag, - vmhost.RefactorContextFlag, - vmhost.RuntimeMemStoreLimitFlag, - vmhost.RuntimeCodeSizeFixFlag, - vmhost.FixOOGReturnCodeFlag, - vmhost.DynamicGasCostForDataTrieStorageLoadFlag, + vmhost.CryptoOpcodesV2Flag, + vmhost.MultiESDTNFTTransferAndExecuteByUserFlag, vmhost.UseGasBoundedShouldFailExecutionFlag, } @@ -79,7 +68,8 @@ type vmHost struct { enableEpochsHandler vmhost.EnableEpochsHandler activationEpochMap map[uint32]struct{} - transferLogIdentifiers map[string]bool + transferLogIdentifiers map[string]bool + mapOpcodeAddressIsAllowed map[string]map[string]struct{} } // NewVMHost creates a new VM vmHost @@ -115,22 +105,30 @@ func NewVMHost( if hostParameters.VMType == nil { return nil, vmhost.ErrNilVMType } + if hostParameters.MapOpcodeAddressIsAllowed == nil { + return nil, vmhost.ErrNilMapOpcodeAddress + } + + cryptoHook, err := factory.NewVMCrypto() + if err != nil { + return nil, err + } - cryptoHook := factory.NewVMCrypto() host := &vmHost{ - cryptoHook: cryptoHook, - meteringContext: nil, - runtimeContext: nil, - asyncContext: nil, - blockchainContext: nil, - storageContext: nil, - managedTypesContext: nil, - gasSchedule: hostParameters.GasSchedule, - builtInFuncContainer: hostParameters.BuiltInFuncContainer, - esdtTransferParser: hostParameters.ESDTTransferParser, - callArgsParser: parsers.NewCallArgsParser(), - executionTimeout: minExecutionTimeout, - enableEpochsHandler: hostParameters.EnableEpochsHandler, + cryptoHook: cryptoHook, + meteringContext: nil, + runtimeContext: nil, + asyncContext: nil, + blockchainContext: nil, + storageContext: nil, + managedTypesContext: nil, + gasSchedule: hostParameters.GasSchedule, + builtInFuncContainer: hostParameters.BuiltInFuncContainer, + esdtTransferParser: hostParameters.ESDTTransferParser, + callArgsParser: parsers.NewCallArgsParser(), + executionTimeout: minExecutionTimeout, + enableEpochsHandler: hostParameters.EnableEpochsHandler, + mapOpcodeAddressIsAllowed: hostParameters.MapOpcodeAddressIsAllowed, } newExecutionTimeout := time.Duration(hostParameters.TimeOutForSCExecutionInMilliseconds) * time.Millisecond if newExecutionTimeout > minExecutionTimeout { @@ -546,6 +544,21 @@ func (host *vmHost) AreInSameShard(leftAddress []byte, rightAddress []byte) bool return leftShard == rightShard } +// IsAllowedToExecute returns true if the special opcode is allowed to be run by the address +func (host *vmHost) IsAllowedToExecute(opcode string) bool { + if !host.enableEpochsHandler.IsFlagEnabled(vmhost.MultiESDTNFTTransferAndExecuteByUserFlag) { + return false + } + + mapAddresses, ok := host.mapOpcodeAddressIsAllowed[opcode] + if !ok { + return false + } + + _, ok = mapAddresses[string(host.Runtime().GetContextAddress())] + return ok +} + // IsInterfaceNil returns true if there is no value under the interface func (host *vmHost) IsInterfaceNil() bool { return host == nil @@ -581,31 +594,6 @@ func (host *vmHost) EpochConfirmed(epoch uint32, _ uint64) { } } -// FixOOGReturnCodeEnabled returns true if the corresponding flag is set -func (host *vmHost) FixOOGReturnCodeEnabled() bool { - return host.enableEpochsHandler.IsFlagEnabled(vmhost.FixOOGReturnCodeFlag) -} - -// FixFailExecutionEnabled returns true if the corresponding flag is set -func (host *vmHost) FixFailExecutionEnabled() bool { - return host.enableEpochsHandler.IsFlagEnabled(vmhost.FailExecutionOnEveryAPIErrorFlag) -} - -// CreateNFTOnExecByCallerEnabled returns true if the corresponding flag is set -func (host *vmHost) CreateNFTOnExecByCallerEnabled() bool { - return host.enableEpochsHandler.IsFlagEnabled(vmhost.CreateNFTThroughExecByCallerFlag) -} - -// DisableExecByCaller returns true if the corresponding flag is set -func (host *vmHost) DisableExecByCaller() bool { - return host.enableEpochsHandler.IsFlagEnabled(vmhost.DisableExecByCallerFlag) -} - -// CheckExecuteReadOnly returns true if the corresponding flag is set -func (host *vmHost) CheckExecuteReadOnly() bool { - return host.enableEpochsHandler.IsFlagEnabled(vmhost.CheckExecuteOnReadOnlyFlag) -} - func validateVMInput(vmInput *vmcommon.VMInput) error { if vmInput.GasProvided > math.MaxInt64 { return vmhost.ErrInvalidGasProvided diff --git a/vmhost/hostCore/host_test.go b/vmhost/hostCore/host_test.go index bcd79ec3d..21e9f4804 100644 --- a/vmhost/hostCore/host_test.go +++ b/vmhost/hostCore/host_test.go @@ -4,8 +4,8 @@ import ( "math" "testing" - "github.com/multiversx/mx-chain-scenario-go/worldmock" "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-scenario-go/worldmock" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-vm-common-go/builtInFunctions" "github.com/multiversx/mx-chain-vm-common-go/parsers" @@ -25,12 +25,13 @@ func TestNewVMHost(t *testing.T) { makeHostParameters := func() *vmhost.VMHostParameters { return &vmhost.VMHostParameters{ - VMType: vmType, - ESDTTransferParser: esdtTransferParser, - BuiltInFuncContainer: bfc, - EpochNotifier: epochNotifier, - EnableEpochsHandler: epochsHandler, - Hasher: worldmock.DefaultHasher, + VMType: vmType, + ESDTTransferParser: esdtTransferParser, + BuiltInFuncContainer: bfc, + EpochNotifier: epochNotifier, + EnableEpochsHandler: epochsHandler, + Hasher: worldmock.DefaultHasher, + MapOpcodeAddressIsAllowed: map[string]map[string]struct{}{}, } } diff --git a/vmhost/hosttest/execution_benchmark_test.go b/vmhost/hosttest/execution_benchmark_test.go index 792fdb49c..8b01602bb 100644 --- a/vmhost/hosttest/execution_benchmark_test.go +++ b/vmhost/hosttest/execution_benchmark_test.go @@ -251,16 +251,17 @@ func prepare(tb testing.TB, ownerAddress []byte) (*worldmock.MockWorld, *worldmo host, err := hostCore.NewVMHost( mockWorld, &vmhost.VMHostParameters{ - VMType: testcommon.DefaultVMType, - BlockGasLimit: uint64(1000), - GasSchedule: gasMap, - BuiltInFuncContainer: mockWorld.BuiltinFuncs.Container, - ProtectedKeyPrefix: []byte("E" + "L" + "R" + "O" + "N" + "D"), - ESDTTransferParser: esdtTransferParser, - EpochNotifier: &mock.EpochNotifierStub{}, - EnableEpochsHandler: worldmock.EnableEpochsHandlerStubNoFlags(), - WasmerSIGSEGVPassthrough: false, - Hasher: worldmock.DefaultHasher, + VMType: testcommon.DefaultVMType, + BlockGasLimit: uint64(1000), + GasSchedule: gasMap, + BuiltInFuncContainer: mockWorld.BuiltinFuncs.Container, + ProtectedKeyPrefix: []byte("E" + "L" + "R" + "O" + "N" + "D"), + ESDTTransferParser: esdtTransferParser, + EpochNotifier: &mock.EpochNotifierStub{}, + EnableEpochsHandler: worldmock.EnableEpochsHandlerStubNoFlags(), + WasmerSIGSEGVPassthrough: false, + Hasher: worldmock.DefaultHasher, + MapOpcodeAddressIsAllowed: map[string]map[string]struct{}{}, }) require.Nil(tb, err) return mockWorld, ownerAccount, host, err diff --git a/vmhost/hosttest/managedei_test.go b/vmhost/hosttest/managedei_test.go index 291bb9d2e..c9f0844e6 100644 --- a/vmhost/hosttest/managedei_test.go +++ b/vmhost/hosttest/managedei_test.go @@ -11,7 +11,7 @@ import ( "testing" "github.com/multiversx/mx-chain-vm-go/crypto/hashing" - "github.com/multiversx/mx-chain-vm-go/crypto/signing/secp256k1" + "github.com/multiversx/mx-chain-vm-go/crypto/signing/secp256" mock "github.com/multiversx/mx-chain-vm-go/mock/context" "github.com/multiversx/mx-chain-vm-go/mock/contracts" "github.com/multiversx/mx-chain-vm-go/testcommon" @@ -425,6 +425,23 @@ func Test_ManagedRipemd160(t *testing.T) { } const blsCheckOK = "3e886a4c6e109a151f4105aee65a5192d150ef1fa68d3cd76964a0b086006dbe4324c989deb0e4416c6d6706db1b1910eb2732f08842fb4886067b9ed191109ac2188d76002d2e11da80a3f0ea89fee6b59c834cc478a6bd49cb8a193b1abb16@e96bd0f36b70c5ccc0c4396343bd7d8255b8a526c55fa1e218511fafe6539b8e@04725db195e37aa237cdbbda76270d4a229b6e7a3651104dc58c4349c0388e8546976fe54a04240530b99064e434c90f" +const blsMultiSigOk = "9723bb054e8c79ef18dc24d329f84c7e6dbd43ee1a1064f1f7ecaf98be5695b1a62c78b530cfecb69304f07cefb76b02cdaed63cb2f62214971174f603704212d690f5ef76f1718ec1e920b00ac0792949d9f7371bbc5c9e054f040775ee9d06@6402df92cad7c9f0fb06381f66940266193c865ba6e90f08adbccc504913d4b8005b74b3210e38ba644f41b8e0af1519c9013791aaa798dd19536e3ddef1f9c49a83bab0521503f9aedf105cf32af421cf41f77ea7d26db4650a87ad0178f387@a7bd70d9eeb4ec0baff870335c6da592cb77aa1efd4a0b140e5f263a7ba346474aa2b5db2c407b47354febfc8bc1ab18157ce8d9a55aadf37e1c4ae4c4d7b1ae8e0498c520aebd2efac32ca82267c24ff3132006d14ae514282512935bf81a06@408ee8ebc5269599c9ecafcce6d7876f5fc7bbe3e86cf0bfa11d34df91c67451df7275ae8e399d34dd42d7172fb8f41605e16880497e1238e2e0d0855c331f5b42347984b6da36c8819f13fec7a6a3a0b6a55a5b269f19b80586381fcedff297@e13f11461d0e11f78dedd6cabfb4114516338f037e1cf8121bc842e74d434a1b728855a15267f5dbab7e31a1e903ee0959567817ab743f5bac57b782e184c98a554d092659fb7236bf1f5113a424aa42625608ce5646cae067e1a76576e72a01@message0@81c611c8ea8ba6c5f90207f9002e436e9cb97e927482fa755b46749dcf8d351c29756e34417e024687629c1cf0b4ec99" + +func blsMultiSigSplitString(t testing.TB, str string) ([][]byte, []byte, []byte) { + split := strings.Split(str, "@") + + numKeys := len(split) - 2 + msg := []byte(split[len(split)-2]) + aggSig, err := hex.DecodeString(split[len(split)-1]) + require.Nil(t, err) + + keys := make([][]byte, numKeys) + for i := 0; i < numKeys; i++ { + keys[i], err = hex.DecodeString(split[i]) + require.Nil(t, err) + } + return keys, msg, aggSig +} func blsSplitString(t testing.TB, str string) ([]byte, []byte, []byte) { split := strings.Split(str, "@") @@ -462,7 +479,8 @@ func Test_ManagedVerifyBLS(t *testing.T) { host, keyHandle, messageHandle, - sigHandle) + sigHandle, + "verifyBLS") if result != 0 { host.Runtime().SignalUserError("assert failed") @@ -543,7 +561,7 @@ func Test_VerifySecp256k1(t *testing.T) { r, _ := hex.DecodeString("fef45d2892953aa5bbcdb057b5e98b208f1617a7498af7eb765574e29b5d9c2c") s, _ := hex.DecodeString("d47563f52aac6b04b55de236b7c515eb9311757db01e02cff079c3ca6efb063f") - verifier := secp256k1.NewSecp256k1() + verifier, _ := secp256.NewSecp256() sig := verifier.EncodeSecp256k1DERSignature(r, s) _, err := test.BuildMockInstanceCallTest(t). @@ -595,7 +613,7 @@ func Test_VerifyCustomSecp256k1(t *testing.T) { r, _ := hex.DecodeString("fef45d2892953aa5bbcdb057b5e98b208f1617a7498af7eb765574e29b5d9c2c") s, _ := hex.DecodeString("d47563f52aac6b04b55de236b7c515eb9311757db01e02cff079c3ca6efb063f") - verifier := secp256k1.NewSecp256k1() + verifier, _ := secp256.NewSecp256() sig := verifier.EncodeSecp256k1DERSignature(r, s) _, err := test.BuildMockInstanceCallTest(t). @@ -617,7 +635,58 @@ func Test_VerifyCustomSecp256k1(t *testing.T) { keyHandle, messageHandle, sigHandle, - int32(secp256k1.ECDSADoubleSha256)) + int32(secp256.ECDSADoubleSha256), + "verifyCustomSecp256k1") + + if result != 0 { + host.Runtime().SignalUserError("assert failed") + return parentInstance + } + + return parentInstance + }) + }), + ). + WithInput(test.CreateTestContractCallInputBuilder(). + WithRecipientAddr(test.ParentAddress). + WithGasProvided(testConfig.GasProvided). + WithFunction("testFunction"). + Build()). + AndAssertResults(func(world *worldmock.MockWorld, verify *test.VMOutputVerifier) { + verify. + Ok() + }) + assert.Nil(t, err) +} + +func Test_VerifySecp256r1(t *testing.T) { + testConfig := baseTestConfig + + key, _ := hex.DecodeString("0303c3cff6a91831cef05550b89bc766713541337a66cf4e98636756e2ded55c10") + msg, _ := hex.DecodeString("f6bb0453930e24e0c19c25d9d732c45cfad0036cbf3057189a34df83141ec0d1f2de8d71eeb10e758d08f4a0c276d881bcd97f577d042fce0d98167d85697d51121fa7605a559f68b202cbdb7ba2419ab3f8ea9f0163a11831308e129a73c1a766fd36f5") + sig, _ := hex.DecodeString("e2c865aafdf4cd18a4c63279c078e3ebc7b948972cab329f036ba7fc1631c6a7683f8d1008395ec053c43d685b8fbe159da9e489270c66236c5682514281989a") + + _, err := test.BuildMockInstanceCallTest(t). + WithContracts( + test.CreateMockContract(test.ParentAddress). + WithBalance(testConfig.ParentBalance). + WithConfig(testConfig). + WithMethods(func(parentInstance *mock.InstanceMock, config interface{}) { + parentInstance.AddMockMethod("testFunction", func() *mock.InstanceMock { + host := parentInstance.Host + + managedTypes := host.ManagedTypes() + keyHandle := managedTypes.NewManagedBufferFromBytes(key) + messageHandle := managedTypes.NewManagedBufferFromBytes(msg) + sigHandle := managedTypes.NewManagedBufferFromBytes(sig) + + result := vmhooks.ManagedVerifyCustomSecp256k1WithHost( + host, + keyHandle, + messageHandle, + sigHandle, + 0, + "verifySecp256R1Signature") if result != 0 { host.Runtime().SignalUserError("assert failed") @@ -646,7 +715,7 @@ func Test_ManagedEncodeSecp256k1DerSignature(t *testing.T) { r, _ := hex.DecodeString("fef45d2892953aa5bbcdb057b5e98b208f1617a7498af7eb765574e29b5d9c2c") s, _ := hex.DecodeString("d47563f52aac6b04b55de236b7c515eb9311757db01e02cff079c3ca6efb063f") - verifier := secp256k1.NewSecp256k1() + verifier, _ := secp256.NewSecp256() sig := verifier.EncodeSecp256k1DERSignature(r, s) _, err := test.BuildMockInstanceCallTest(t). @@ -691,6 +760,101 @@ func Test_ManagedEncodeSecp256k1DerSignature(t *testing.T) { assert.Nil(t, err) } +func Test_ManagedVerifyBLSSignatureShare(t *testing.T) { + testConfig := baseTestConfig + + _, err := test.BuildMockInstanceCallTest(t). + WithContracts( + test.CreateMockContract(test.ParentAddress). + WithBalance(testConfig.ParentBalance). + WithConfig(testConfig). + WithMethods(func(parentInstance *mock.InstanceMock, config interface{}) { + parentInstance.AddMockMethod("testFunction", func() *mock.InstanceMock { + host := parentInstance.Host + + key, message, sig := blsSplitString(t, blsCheckOK) + managedTypes := host.ManagedTypes() + keyHandle := managedTypes.NewManagedBufferFromBytes(key) + messageHandle := managedTypes.NewManagedBufferFromBytes(message) + sigHandle := managedTypes.NewManagedBufferFromBytes(sig) + + result := vmhooks.ManagedVerifyBLSWithHost( + host, + keyHandle, + messageHandle, + sigHandle, + "verifyBLSSignatureShare") + + if result != 0 { + host.Runtime().SignalUserError("assert failed") + return parentInstance + } + + return parentInstance + }) + }), + ). + WithInput(test.CreateTestContractCallInputBuilder(). + WithRecipientAddr(test.ParentAddress). + WithGasProvided(testConfig.GasProvided). + WithFunction("testFunction"). + Build()). + AndAssertResults(func(world *worldmock.MockWorld, verify *test.VMOutputVerifier) { + verify. + Ok() + }) + assert.Nil(t, err) +} + +func Test_ManagedVerifyBLSMultiSig(t *testing.T) { + testConfig := baseTestConfig + + _, err := test.BuildMockInstanceCallTest(t). + WithContracts( + test.CreateMockContract(test.ParentAddress). + WithBalance(testConfig.ParentBalance). + WithConfig(testConfig). + WithMethods(func(parentInstance *mock.InstanceMock, config interface{}) { + parentInstance.AddMockMethod("testFunction", func() *mock.InstanceMock { + host := parentInstance.Host + + keys, message, sig := blsMultiSigSplitString(t, blsMultiSigOk) + managedTypes := host.ManagedTypes() + + keysHandle := managedTypes.NewManagedBuffer() + _ = managedTypes.WriteManagedVecOfManagedBuffers(keys, keysHandle) + + messageHandle := managedTypes.NewManagedBufferFromBytes(message) + sigHandle := managedTypes.NewManagedBufferFromBytes(sig) + + result := vmhooks.ManagedVerifyBLSWithHost( + host, + keysHandle, + messageHandle, + sigHandle, + "verifyBLSAggregatedSignature") + + if result != 0 { + host.Runtime().SignalUserError("assert failed") + return parentInstance + } + + return parentInstance + }) + }), + ). + WithInput(test.CreateTestContractCallInputBuilder(). + WithRecipientAddr(test.ParentAddress). + WithGasProvided(testConfig.GasProvided + 1000). + WithFunction("testFunction"). + Build()). + AndAssertResults(func(world *worldmock.MockWorld, verify *test.VMOutputVerifier) { + verify. + Ok() + }) + assert.Nil(t, err) +} + func Test_ManagedScalarBaseMultEC(t *testing.T) { testConfig := baseTestConfig @@ -1540,3 +1704,220 @@ func Test_Async_ManagedGetBackTransfers(t *testing.T) { }) assert.Nil(t, err) } + +func assertTestESDTTokenBalance(t *testing.T, world *worldmock.MockWorld, address []byte, balance int64) { + account := world.AcctMap.GetAccount(address) + accountESDTBalance, err := account.GetTokenBalance(test.ESDTTestTokenName, 0) + assert.Nil(t, err) + assert.Equal(t, big.NewInt(balance), accountESDTBalance) +} + +func Test_ManagedMultiTransferESDTNFTExecuteByUser_JustTransfer(t *testing.T) { + testConfig := baseTestConfig + + initialESDTTokenBalance := uint64(100) + transferESDTTokenValue := big.NewInt(5) + + _, err := test.BuildMockInstanceCallTest(t). + WithContracts( + test.CreateMockContract(test.ChildAddress). + WithBalance(testConfig.ChildBalance). + WithConfig(testConfig). + WithCodeMetadata([]byte{0, (1 << vmcommon.MetadataPayableBySC) | (1 << vmcommon.MetadataPayable)}). + WithMethods(func(parentInstance *mock.InstanceMock, config interface{}) {}), + test.CreateMockContract(test.ParentAddress). + WithBalance(testConfig.ParentBalance). + WithConfig(testConfig). + WithMethods(func(parentInstance *mock.InstanceMock, config interface{}) { + parentInstance.AddMockMethod("testFunction", func() *mock.InstanceMock { + host := parentInstance.Host + + transfer := &vmcommon.ESDTTransfer{ + ESDTValue: transferESDTTokenValue, + ESDTTokenName: test.ESDTTestTokenName, + ESDTTokenType: 0, + ESDTTokenNonce: 0, + } + + ret := vmhooks.TransferESDTNFTExecuteByUserWithTypedArgs( + host, + test.UserAddress, + test.ChildAddress, + []*vmcommon.ESDTTransfer{transfer}, + int64(testConfig.GasProvided), + []byte{}, [][]byte{}) + + if ret != 0 { + host.Runtime().FailExecution(fmt.Errorf("transfer ESDT failed")) + } + + output := host.Output().GetVMOutput() + outTransfer := output.OutputAccounts[string(test.ChildAddress)].OutputTransfers[0] + assert.NotNil(t, outTransfer) + assert.Equal(t, outTransfer.SenderAddress, test.UserAddress) + + return parentInstance + }) + }), + ). + WithSetup(func(host vmhost.VMHost, world *worldmock.MockWorld) { + createMockBuiltinFunctions(t, host, world) + + parentAccount := world.AcctMap.GetAccount(test.ParentAddress) + _ = parentAccount.SetTokenBalanceUint64(test.ESDTTestTokenName, 0, initialESDTTokenBalance) + }). + WithInput(test.CreateTestContractCallInputBuilder(). + WithRecipientAddr(test.ParentAddress). + WithGasProvided(testConfig.GasProvided). + WithFunction("testFunction"). + Build()). + AndAssertResults(func(world *worldmock.MockWorld, verify *test.VMOutputVerifier) { + assertTestESDTTokenBalance(t, world, test.ParentAddress, 95) + assertTestESDTTokenBalance(t, world, test.ChildAddress, 5) + + verify. + Ok() + }) + assert.Nil(t, err) +} + +func Test_ManagedMultiTransferESDTNFTExecuteByUser(t *testing.T) { + testConfig := baseTestConfig + + initialESDTTokenBalance := uint64(100) + transferESDTTokenValue := big.NewInt(5) + + _, err := test.BuildMockInstanceCallTest(t). + WithContracts( + test.CreateMockContract(test.ChildAddress). + WithBalance(testConfig.ChildBalance). + WithConfig(testConfig). + WithMethods(func(parentInstance *mock.InstanceMock, config interface{}) { + parentInstance.AddMockMethod("childFunction", func() *mock.InstanceMock { + + return parentInstance + }) + }), + test.CreateMockContract(test.ParentAddress). + WithBalance(testConfig.ParentBalance). + WithConfig(testConfig). + WithMethods(func(parentInstance *mock.InstanceMock, config interface{}) { + parentInstance.AddMockMethod("testFunction", func() *mock.InstanceMock { + host := parentInstance.Host + + transfer := &vmcommon.ESDTTransfer{ + ESDTValue: transferESDTTokenValue, + ESDTTokenName: test.ESDTTestTokenName, + ESDTTokenType: 0, + ESDTTokenNonce: 0, + } + + ret := vmhooks.TransferESDTNFTExecuteByUserWithTypedArgs( + host, + test.UserAddress, + test.ChildAddress, + []*vmcommon.ESDTTransfer{transfer}, + int64(testConfig.GasProvided), + []byte("childFunction"), [][]byte{}) + + if ret != 0 { + host.Runtime().FailExecution(fmt.Errorf("transfer ESDT failed")) + } + + return parentInstance + }) + }), + ). + WithSetup(func(host vmhost.VMHost, world *worldmock.MockWorld) { + createMockBuiltinFunctions(t, host, world) + + parentAccount := world.AcctMap.GetAccount(test.ParentAddress) + _ = parentAccount.SetTokenBalanceUint64(test.ESDTTestTokenName, 0, initialESDTTokenBalance) + }). + WithInput(test.CreateTestContractCallInputBuilder(). + WithRecipientAddr(test.ParentAddress). + WithGasProvided(testConfig.GasProvided). + WithFunction("testFunction"). + Build()). + AndAssertResults(func(world *worldmock.MockWorld, verify *test.VMOutputVerifier) { + assertTestESDTTokenBalance(t, world, test.ParentAddress, 95) + assertTestESDTTokenBalance(t, world, test.ChildAddress, 5) + + verify. + Ok() + }) + assert.Nil(t, err) +} + +func Test_ManagedMultiTransferESDTNFTExecuteByUser_ReturnOnFail(t *testing.T) { + testConfig := baseTestConfig + + initialESDTTokenBalance := uint64(100) + transferESDTTokenValue := big.NewInt(5) + + _, err := test.BuildMockInstanceCallTest(t). + WithContracts( + test.CreateMockContract(test.ChildAddress). + WithBalance(testConfig.ChildBalance). + WithConfig(testConfig). + WithMethods(func(parentInstance *mock.InstanceMock, config interface{}) { + parentInstance.AddMockMethod("childFunction", func() *mock.InstanceMock { + host := parentInstance.Host + + host.Runtime().SignalUserError("triggered erorr") + + return parentInstance + }) + }), + test.CreateMockContract(test.ParentAddress). + WithBalance(testConfig.ParentBalance). + WithConfig(testConfig). + WithMethods(func(parentInstance *mock.InstanceMock, config interface{}) { + parentInstance.AddMockMethod("testFunction", func() *mock.InstanceMock { + host := parentInstance.Host + + transfer := &vmcommon.ESDTTransfer{ + ESDTValue: transferESDTTokenValue, + ESDTTokenName: test.ESDTTestTokenName, + ESDTTokenType: 0, + ESDTTokenNonce: 0, + } + + ret := vmhooks.TransferESDTNFTExecuteByUserWithTypedArgs( + host, + test.UserAddress, + test.ChildAddress, + []*vmcommon.ESDTTransfer{transfer}, + int64(testConfig.GasProvided), + []byte("childFunction"), [][]byte{}) + + if ret != 0 { + host.Runtime().FailExecution(fmt.Errorf("transfer ESDT failed")) + } + + return parentInstance + }) + }), + ). + WithSetup(func(host vmhost.VMHost, world *worldmock.MockWorld) { + createMockBuiltinFunctions(t, host, world) + setZeroCodeCosts(host) + + parentAccount := world.AcctMap.GetAccount(test.ParentAddress) + _ = parentAccount.SetTokenBalanceUint64(test.ESDTTestTokenName, 0, initialESDTTokenBalance) + }). + WithInput(test.CreateTestContractCallInputBuilder(). + WithRecipientAddr(test.ParentAddress). + WithGasProvided(testConfig.GasProvided). + WithFunction("testFunction"). + Build()). + AndAssertResults(func(world *worldmock.MockWorld, verify *test.VMOutputVerifier) { + assertTestESDTTokenBalance(t, world, test.ParentAddress, 95) + assertTestESDTTokenBalance(t, world, test.ChildAddress, 0) + assertTestESDTTokenBalance(t, world, test.UserAddress, 5) + + verify. + ExecutionFailed() + }) + assert.Nil(t, err) +} diff --git a/vmhost/hosttest/mex_benchmark_test.go b/vmhost/hosttest/mex_benchmark_test.go index cb24797d2..689c254e0 100644 --- a/vmhost/hosttest/mex_benchmark_test.go +++ b/vmhost/hosttest/mex_benchmark_test.go @@ -8,7 +8,6 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/vm" - logger "github.com/multiversx/mx-chain-logger-go" "github.com/multiversx/mx-chain-scenario-go/worldmock" vmcommon "github.com/multiversx/mx-chain-vm-common-go" test "github.com/multiversx/mx-chain-vm-go/testcommon" @@ -21,7 +20,7 @@ func Test_RunDEXPairBenchmark(t *testing.T) { if testing.Short() { t.Skip("not a short test") } - _ = logger.SetLogLevel("vm/benchmark:TRACE") + owner := vmhost.MakeTestSCAddress("owner") user := vmhost.MakeTestSCAddress("user") diff --git a/vmhost/interface.go b/vmhost/interface.go index 40e6aebdf..ae122cea0 100644 --- a/vmhost/interface.go +++ b/vmhost/interface.go @@ -49,6 +49,7 @@ type VMHost interface { IsBuiltinFunctionName(functionName string) bool IsBuiltinFunctionCall(data []byte) bool AreInSameShard(leftAddress []byte, rightAddress []byte) bool + IsAllowedToExecute(opcode string) bool GetGasScheduleMap() config.GasScheduleMap GetContexts() (ManagedTypesContext, BlockchainContext, MeteringContext, OutputContext, RuntimeContext, AsyncContext, StorageContext) @@ -161,6 +162,9 @@ type RuntimeContext interface { GetAllErrors() error ValidateCallbackName(callbackName string) error + + IsReservedFunctionName(functionName string) bool + HasFunction(functionName string) bool GetPrevTxHash() []byte EndExecution() @@ -332,7 +336,6 @@ type StorageContext interface { SetProtectedStorageToAddress(address []byte, key []byte, value []byte) (StorageStatus, error) SetProtectedStorageToAddressUnmetered(address []byte, key []byte, value []byte) (StorageStatus, error) UseGasForStorageLoad(tracedFunctionName string, trieDepth int64, blockchainLoadCost uint64, usedCache bool) error - IsUseDifferentGasCostFlagSet() bool GetVmProtectedPrefix(prefix string) []byte } diff --git a/vmhost/vmhooks/baseOps.go b/vmhost/vmhooks/baseOps.go index 38dfb7789..ba9efeb39 100644 --- a/vmhost/vmhooks/baseOps.go +++ b/vmhost/vmhooks/baseOps.go @@ -533,7 +533,8 @@ func (context *VMHooksImpl) GetESDTLocalRoles(tokenIdHandle int32) int64 { return -1 } - return getESDTRoles(data) + enableEpochsHandler := context.host.EnableEpochsHandler() + return getESDTRoles(data, enableEpochsHandler.IsFlagEnabled(vmhost.CryptoOpcodesV2Flag)) } // ValidateTokenIdentifier VMHooks implementation. @@ -1116,6 +1117,7 @@ func TransferESDTNFTExecuteWithTypedArgs( OriginalCaller: originalCaller, Sender: sender, Transfers: transfers, + SenderForExec: sender, } gasLimitForExec, executeErr := output.TransferESDT(transfersArgs, contractCallInput) if WithFaultAndHost(host, executeErr, runtime.BaseOpsErrorShouldFailExecution()) { @@ -1124,6 +1126,7 @@ func TransferESDTNFTExecuteWithTypedArgs( if host.AreInSameShard(sender, dest) && contractCallInput != nil && host.Blockchain().IsSmartContract(dest) { contractCallInput.GasProvided = gasLimitForExec + contractCallInput.CallerAddr = sender logEEI.Trace("ESDT post-transfer execution begin") _, executeErr := executeOnDestContextFromAPI(host, contractCallInput) if executeErr != nil { @@ -1136,6 +1139,96 @@ func TransferESDTNFTExecuteWithTypedArgs( return 0 } + return 0 + +} + +// TransferESDTNFTExecuteByUserWithTypedArgs defines the actual transfer ESDT execute logic and execution +func TransferESDTNFTExecuteByUserWithTypedArgs( + host vmhost.VMHost, + callerForExecution []byte, + dest []byte, + transfers []*vmcommon.ESDTTransfer, + gasLimit int64, + function []byte, + data [][]byte, +) int32 { + var executeErr error + + runtime := host.Runtime() + metering := host.Metering() + + output := host.Output() + + gasToUse := metering.GasSchedule().BaseOpsAPICost.TransferValue * uint64(len(transfers)) + err := metering.UseGasBounded(gasToUse) + if WithFaultAndHost(host, err, runtime.SyncExecAPIErrorShouldFailExecution()) { + return 1 + } + + sender := runtime.GetContextAddress() + + var contractCallInput *vmcommon.ContractCallInput + if len(function) > 0 { + contractCallInput, executeErr = prepareIndirectContractCallInput( + host, + sender, + big.NewInt(0), + gasLimit, + dest, + function, + data, + gasToUse, + false, + ) + if WithFaultAndHost(host, executeErr, runtime.SyncExecAPIErrorShouldFailExecution()) { + return 1 + } + + contractCallInput.ESDTTransfers = transfers + } + + originalCaller := host.Runtime().GetOriginalCallerAddress() + transfersArgs := &vmhost.ESDTTransfersArgs{ + Destination: dest, + OriginalCaller: originalCaller, + Sender: sender, + Transfers: transfers, + SenderForExec: callerForExecution, + } + gasLimitForExec, executeErr := output.TransferESDT(transfersArgs, contractCallInput) + if WithFaultAndHost(host, executeErr, runtime.BaseOpsErrorShouldFailExecution()) { + return 1 + } + + if host.AreInSameShard(sender, dest) && contractCallInput != nil && host.Blockchain().IsSmartContract(dest) { + contractCallInput.GasProvided = gasLimitForExec + contractCallInput.CallerAddr = callerForExecution + logEEI.Trace("ESDT post-transfer execution begin") + _, executeErr = executeOnDestContextFromAPI(host, contractCallInput) + if executeErr != nil { + logEEI.Trace("ESDT post-transfer execution failed, started transfer to user", "error", executeErr) + + // in case of failed execution, the funds have to be moved to the user + returnTransferArgs := &vmhost.ESDTTransfersArgs{ + Destination: callerForExecution, + OriginalCaller: originalCaller, + Sender: dest, + Transfers: transfers, + SenderForExec: dest, + ReturnAfterError: true, + } + _, executeErr = output.TransferESDT(returnTransferArgs, nil) + if WithFaultAndHost(host, executeErr, runtime.BaseOpsErrorShouldFailExecution()) { + return 1 + } + + return 1 + } + + return 0 + } + return 0 } @@ -2382,6 +2475,32 @@ func (context *VMHooksImpl) GetCallValueTokenNameByIndex( return int32(len(tokenName)) } +// IsReservedFunctionName VMHooks implementation. +// @autogenerate(VMHooks) +func (context *VMHooksImpl) IsReservedFunctionName(nameHandle int32) int32 { + host := context.host + managedTypes := context.GetManagedTypesContext() + runtime := host.Runtime() + metering := host.Metering() + + gasToUse := metering.GasSchedule().BaseOpsAPICost.IsReservedFunctionName + err := metering.UseGasBounded(gasToUse) + if context.WithFault(err, runtime.BaseOpsErrorShouldFailExecution()) { + return -1 + } + + name, err := managedTypes.GetBytes(nameHandle) + if context.WithFault(err, runtime.BaseOpsErrorShouldFailExecution()) { + return -1 + } + + if runtime.IsReservedFunctionName(string(name)) { + return 1 + } + + return 0 +} + // WriteLog VMHooks implementation. // @autogenerate(VMHooks) func (context *VMHooksImpl) WriteLog( @@ -3204,6 +3323,12 @@ func createContract( ContractCodeMetadata: codeMetadata, } + currentVMInput := host.Runtime().GetVMInput() + if len(currentVMInput.RelayerAddr) > 0 { + contractCreate.RelayerAddr = make([]byte, len(currentVMInput.RelayerAddr)) + copy(contractCreate.RelayerAddr, currentVMInput.RelayerAddr) + } + return host.CreateNewContract(contractCreate, int(createContractCallType)) } @@ -3408,6 +3533,12 @@ func prepareIndirectContractCallInput( Function: string(function), } + currentVMInput := runtime.GetVMInput() + if len(currentVMInput.RelayerAddr) > 0 { + contractCallInput.RelayerAddr = make([]byte, len(currentVMInput.RelayerAddr)) + copy(contractCallInput.RelayerAddr, currentVMInput.RelayerAddr) + } + return contractCallInput, nil } diff --git a/vmhost/vmhooks/cryptoei.go b/vmhost/vmhooks/cryptoei.go index 4de67a9c4..6b3d6096e 100644 --- a/vmhost/vmhooks/cryptoei.go +++ b/vmhost/vmhooks/cryptoei.go @@ -3,7 +3,7 @@ package vmhooks import ( "crypto/elliptic" - "github.com/multiversx/mx-chain-vm-go/crypto/signing/secp256k1" + "github.com/multiversx/mx-chain-vm-go/crypto/signing/secp256" "github.com/multiversx/mx-chain-vm-go/executor" "github.com/multiversx/mx-chain-vm-go/math" "github.com/multiversx/mx-chain-vm-go/vmhost" @@ -39,6 +39,9 @@ const ( getCurveLengthECName = "getCurveLengthEC" getPrivKeyByteLengthECName = "getPrivKeyByteLengthEC" ellipticCurveGetValuesName = "ellipticCurveGetValues" + verifyBLSSignatureShare = "verifyBLSSignatureShare" + verifyBLSAggregatedSignature = "verifyBLSAggregatedSignature" + verifySecp256R1Signature = "verifySecp256R1Signature" ) // Sha256 VMHooks implementation. @@ -309,7 +312,30 @@ func (context *VMHooksImpl) ManagedVerifyBLS( sigHandle int32, ) int32 { host := context.GetVMHost() - return ManagedVerifyBLSWithHost(host, keyHandle, messageHandle, sigHandle) + return ManagedVerifyBLSWithHost(host, keyHandle, messageHandle, sigHandle, verifyBLSName) +} + +func useGasForCryptoVerify( + metering vmhost.MeteringContext, + sigVerificationType string, +) error { + metering.StartGasTracing(sigVerificationType) + + gasToUse := metering.GasSchedule().CryptoAPICost.VerifyBLS + switch sigVerificationType { + case verifyCustomSecp256k1Name: + gasToUse = metering.GasSchedule().CryptoAPICost.VerifySecp256k1 + case verifySecp256R1Signature: + gasToUse = metering.GasSchedule().CryptoAPICost.VerifySecp256r1 + case verifyBLSName: + gasToUse = metering.GasSchedule().CryptoAPICost.VerifyBLS + case verifyBLSSignatureShare: + gasToUse = metering.GasSchedule().CryptoAPICost.VerifyBLSSignatureShare + case verifyBLSAggregatedSignature: + gasToUse = metering.GasSchedule().CryptoAPICost.VerifyBLSMultiSig + } + + return metering.UseGasBounded(gasToUse) } // ManagedVerifyBLSWithHost VMHooks implementation. @@ -318,16 +344,14 @@ func ManagedVerifyBLSWithHost( keyHandle int32, messageHandle int32, sigHandle int32, + sigVerificationType string, ) int32 { runtime := host.Runtime() metering := host.Metering() managedType := host.ManagedTypes() crypto := host.Crypto() - metering.StartGasTracing(verifyBLSName) - - gasToUse := metering.GasSchedule().CryptoAPICost.VerifyBLS - err := metering.UseGasBounded(gasToUse) - if WithFaultAndHost(host, err, runtime.CryptoAPIErrorShouldFailExecution()) { + err := useGasForCryptoVerify(metering, sigVerificationType) + if WithFaultAndHost(host, err, runtime.UseGasBoundedShouldFailExecution()) { return 1 } @@ -361,9 +385,24 @@ func ManagedVerifyBLSWithHost( return 1 } - invalidSigErr := crypto.VerifyBLS(keyBytes, msgBytes, sigBytes) + invalidSigErr := vmhost.ErrInvalidArgument + switch sigVerificationType { + case verifyBLSName: + invalidSigErr = crypto.VerifyBLS(keyBytes, msgBytes, sigBytes) + case verifyBLSSignatureShare: + invalidSigErr = crypto.VerifySignatureShare(keyBytes, msgBytes, sigBytes) + case verifyBLSAggregatedSignature: + var pubKeyBytes [][]byte + pubKeyBytes, _, invalidSigErr = managedType.ReadManagedVecOfManagedBuffers(keyHandle) + if invalidSigErr != nil { + break + } + + invalidSigErr = crypto.VerifyAggregatedSig(pubKeyBytes, msgBytes, sigBytes) + } + if invalidSigErr != nil { - WithFaultAndHost(host, invalidSigErr, runtime.CryptoAPIErrorShouldFailExecution()) + WithFaultAndHost(host, vmhost.ErrInvalidSignature, runtime.CryptoAPIErrorShouldFailExecution()) return -1 } @@ -561,7 +600,8 @@ func (context *VMHooksImpl) ManagedVerifyCustomSecp256k1( keyHandle, messageHandle, sigHandle, - hashType) + hashType, + verifyCustomSecp256k1Name) } // ManagedVerifyCustomSecp256k1WithHost VMHooks implementation. @@ -569,16 +609,15 @@ func ManagedVerifyCustomSecp256k1WithHost( host vmhost.VMHost, keyHandle, messageHandle, sigHandle int32, hashType int32, + verifyCryptoFunc string, ) int32 { runtime := host.Runtime() metering := host.Metering() managedType := host.ManagedTypes() crypto := host.Crypto() - metering.StartGasTracing(verifyCustomSecp256k1Name) - gasToUse := metering.GasSchedule().CryptoAPICost.VerifySecp256k1 - err := metering.UseGasBounded(gasToUse) - if WithFaultAndHost(host, err, runtime.CryptoAPIErrorShouldFailExecution()) { + err := useGasForCryptoVerify(metering, verifyCryptoFunc) + if WithFaultAndHost(host, err, runtime.UseGasBoundedShouldFailExecution()) { return 1 } @@ -612,9 +651,16 @@ func ManagedVerifyCustomSecp256k1WithHost( return 1 } - invalidSigErr := crypto.VerifySecp256k1(keyBytes, msgBytes, sigBytes, uint8(hashType)) + invalidSigErr := vmhost.ErrInvalidArgument + switch verifyCryptoFunc { + case verifyCustomSecp256k1Name: + invalidSigErr = crypto.VerifySecp256k1(keyBytes, msgBytes, sigBytes, uint8(hashType)) + case verifySecp256R1Signature: + invalidSigErr = crypto.VerifySecp256r1(keyBytes, msgBytes, sigBytes) + } + if invalidSigErr != nil { - WithFaultAndHost(host, invalidSigErr, runtime.CryptoAPIErrorShouldFailExecution()) + WithFaultAndHost(host, vmhost.ErrInvalidSignature, runtime.CryptoAPIErrorShouldFailExecution()) return -1 } @@ -636,7 +682,7 @@ func (context *VMHooksImpl) VerifySecp256k1( messageOffset, messageLength, sigOffset, - int32(secp256k1.ECDSADoubleSha256), + int32(secp256.ECDSADoubleSha256), ) } @@ -659,7 +705,8 @@ func ManagedVerifySecp256k1WithHost( keyHandle, messageHandle, sigHandle, - int32(secp256k1.ECDSADoubleSha256), + int32(secp256.ECDSADoubleSha256), + verifyCustomSecp256k1Name, ) } @@ -1904,3 +1951,40 @@ func (context *VMHooksImpl) EllipticCurveGetValues(ecHandle int32, fieldOrderHan yBasePoint.Set(ec.Gy) return ecHandle } + +// ManagedVerifySecp256r1 VMHooks implementation. +// @autogenerate(VMHooks) +func (context *VMHooksImpl) ManagedVerifySecp256r1( + keyHandle, messageHandle, sigHandle int32, +) int32 { + host := context.GetVMHost() + return ManagedVerifyCustomSecp256k1WithHost( + host, + keyHandle, + messageHandle, + sigHandle, + 0, + verifySecp256R1Signature) +} + +// ManagedVerifyBLSSignatureShare VMHooks implementation. +// @autogenerate(VMHooks) +func (context *VMHooksImpl) ManagedVerifyBLSSignatureShare( + keyHandle int32, + messageHandle int32, + sigHandle int32, +) int32 { + host := context.GetVMHost() + return ManagedVerifyBLSWithHost(host, keyHandle, messageHandle, sigHandle, verifyBLSSignatureShare) +} + +// ManagedVerifyBLSAggregatedSignature VMHooks implementation. +// @autogenerate(VMHooks) +func (context *VMHooksImpl) ManagedVerifyBLSAggregatedSignature( + keyHandle int32, + messageHandle int32, + sigHandle int32, +) int32 { + host := context.GetVMHost() + return ManagedVerifyBLSWithHost(host, keyHandle, messageHandle, sigHandle, verifyBLSAggregatedSignature) +} diff --git a/vmhost/vmhooks/eei_helpers.go b/vmhost/vmhooks/eei_helpers.go index 681b61cb7..3f5fb2cf8 100644 --- a/vmhost/vmhooks/eei_helpers.go +++ b/vmhost/vmhooks/eei_helpers.go @@ -5,6 +5,12 @@ const esdtRoleLocalBurn = "ESDTRoleLocalBurn" const esdtRoleNFTCreate = "ESDTRoleNFTCreate" const esdtRoleNFTAddQuantity = "ESDTRoleNFTAddQuantity" const esdtRoleNFTBurn = "ESDTRoleNFTBurn" +const esdtRoleNFTUpdateAttributes = "ESDTRoleNFTUpdateAttributes" +const esdtRoleNFTAddURI = "ESDTRoleNFTAddURI" +const esdtRoleNFTRecreate = "ESDTRoleNFTRecreate" +const esdtRoleModifyCreator = "ESDTRoleModifyCreator" +const esdtRoleModifyRoyalties = "ESDTRoleModifyRoyalties" +const esdtRoleSetNewURI = "ESDTRoleSetNewURI" const tickerMinLength = 3 const tickerMaxLength = 10 @@ -19,6 +25,12 @@ const ( RoleNFTCreate RoleNFTAddQuantity RoleNFTBurn + RoleNFTUpdateAttributes + RoleNFTAddURI + RoleNFTRecreate + RoleModifyCreator + RoleModifyRoyalties + RoleSetNewURI ) func roleFromByteArray(bytes []byte) int64 { @@ -39,7 +51,37 @@ func roleFromByteArray(bytes []byte) int64 { } } -func getESDTRoles(dataBuffer []byte) int64 { +func roleFromByteArrayV2(bytes []byte) int64 { + stringValue := string(bytes) + switch stringValue { + case esdtRoleLocalMint: + return RoleMint + case esdtRoleLocalBurn: + return RoleBurn + case esdtRoleNFTCreate: + return RoleNFTCreate + case esdtRoleNFTAddQuantity: + return RoleNFTAddQuantity + case esdtRoleNFTBurn: + return RoleNFTBurn + case esdtRoleNFTUpdateAttributes: + return RoleNFTUpdateAttributes + case esdtRoleNFTAddURI: + return RoleNFTAddURI + case esdtRoleNFTRecreate: + return RoleNFTRecreate + case esdtRoleModifyCreator: + return RoleModifyCreator + case esdtRoleModifyRoyalties: + return RoleModifyRoyalties + case esdtRoleSetNewURI: + return RoleSetNewURI + default: + return 0 + } +} + +func getESDTRoles(dataBuffer []byte, cryptoOpcodesV2Enabled bool) int64 { result := int64(0) currentIndex := 0 valueLen := len(dataBuffer) @@ -57,7 +99,11 @@ func getESDTRoles(dataBuffer []byte) int64 { roleName := dataBuffer[currentIndex:endIndex] currentIndex = endIndex - result |= roleFromByteArray(roleName) + if cryptoOpcodesV2Enabled { + result |= roleFromByteArrayV2(roleName) + } else { + result |= roleFromByteArray(roleName) + } } return result } diff --git a/vmhost/vmhooks/generate/cmd/README.md b/vmhost/vmhooks/generate/cmd/README.md new file mode 100644 index 000000000..00a5711a8 --- /dev/null +++ b/vmhost/vmhooks/generate/cmd/README.md @@ -0,0 +1,7 @@ +# VM Hooks Code generator + +The code generator generates boilerplate code for both this Go VM, and for [the executor repository](https://github.com/multiversx/mx-vm-executor-rs) + +For it to automatically copy files there, create a file called `wasm-vm-executor-rs-path.txt` here, in the `cmd` folder, contianing your local path to that repository, on your disk. + +Finally, simply run `go generate` in `vmhost/vmhooks`. diff --git a/vmhost/vmhooks/generate/eiGenWriteCgo.go b/vmhost/vmhooks/generate/eiGenWriteCgo.go index 8a554e30e..6e98d1775 100644 --- a/vmhost/vmhooks/generate/eiGenWriteCgo.go +++ b/vmhost/vmhooks/generate/eiGenWriteCgo.go @@ -174,9 +174,18 @@ func (writer *cgoWriter) writePopulateFuncPointers(out *eiGenWriter, eiMetadata func populateCgoFunctionPointers() *cWasmerVmHookPointers { return &cWasmerVmHookPointers{`) + maxNameLength := longestFuncNameLengthSnake(eiMetadata) for _, funcMetadata := range eiMetadata.AllFunctions { - out.WriteString(fmt.Sprintf("\n\t\t%s: funcPointer(C.%s),", + out.WriteString(fmt.Sprintf("\n\t\t%s:", cgoFuncPointerFieldName(funcMetadata), + )) + + numSpaces := maxNameLength - len(snakeCase(funcMetadata.Name)) + 1 + for i := 0; i < numSpaces; i++ { + out.WriteString(" ") + } + + out.WriteString(fmt.Sprintf("funcPointer(C.%s),", writer.cgoFuncName(funcMetadata), )) } diff --git a/vmhost/vmhooks/generate/eiGenWriteGoNames.go b/vmhost/vmhooks/generate/eiGenWriteGoNames.go index f50900336..05d662620 100644 --- a/vmhost/vmhooks/generate/eiGenWriteGoNames.go +++ b/vmhost/vmhooks/generate/eiGenWriteGoNames.go @@ -15,8 +15,14 @@ var empty struct{} var functionNames = map[string]struct{}{`) + maxNameLength := longestFuncNameLengthCamel(eiMetadata) for _, funcMetadata := range eiMetadata.AllFunctions { - out.WriteString(fmt.Sprintf("\n\t\"%s\": empty,", lowerInitial(funcMetadata.Name))) + out.WriteString(fmt.Sprintf("\n\t\"%s\":", lowerInitial(funcMetadata.Name))) + numSpaces := maxNameLength - len(funcMetadata.Name) + 1 + for i := 0; i < numSpaces; i++ { + out.WriteString(" ") + } + out.WriteString("empty,") } out.WriteString(` diff --git a/vmhost/vmhooks/generate/stringUtil.go b/vmhost/vmhooks/generate/stringUtil.go index 4ebc282f4..7f680ca12 100644 --- a/vmhost/vmhooks/generate/stringUtil.go +++ b/vmhost/vmhooks/generate/stringUtil.go @@ -40,3 +40,27 @@ func snakeCase(camelCase string) string { } return sb.String() } + +// Helps align code to the right. +func longestFuncNameLengthCamel(eiMetadata *EIMetadata) int { + maxNameLength := 0 + for _, funcMetadata := range eiMetadata.AllFunctions { + l := len(funcMetadata.Name) + if l > maxNameLength { + maxNameLength = l + } + } + return maxNameLength +} + +// Helps align code to the right. +func longestFuncNameLengthSnake(eiMetadata *EIMetadata) int { + maxNameLength := 0 + for _, funcMetadata := range eiMetadata.AllFunctions { + l := len(snakeCase(funcMetadata.Name)) + if l > maxNameLength { + maxNameLength = l + } + } + return maxNameLength +} diff --git a/vmhost/vmhooks/managedei.go b/vmhost/vmhooks/managedei.go index b7bf6f0a3..5543bd876 100644 --- a/vmhost/vmhooks/managedei.go +++ b/vmhost/vmhooks/managedei.go @@ -13,38 +13,39 @@ import ( ) const ( - managedSCAddressName = "managedSCAddress" - managedOwnerAddressName = "managedOwnerAddress" - managedCallerName = "managedCaller" - managedSignalErrorName = "managedSignalError" - managedWriteLogName = "managedWriteLog" - managedMultiTransferESDTNFTExecuteName = "managedMultiTransferESDTNFTExecute" - managedTransferValueExecuteName = "managedTransferValueExecute" - managedExecuteOnDestContextName = "managedExecuteOnDestContext" - managedExecuteOnDestContextByCallerName = "managedExecuteOnDestContextByCaller" - managedExecuteOnSameContextName = "managedExecuteOnSameContext" - managedExecuteReadOnlyName = "managedExecuteReadOnly" - managedCreateContractName = "managedCreateContract" - managedDeployFromSourceContractName = "managedDeployFromSourceContract" - managedUpgradeContractName = "managedUpgradeContract" - managedUpgradeFromSourceContractName = "managedUpgradeFromSourceContract" - managedAsyncCallName = "managedAsyncCall" - managedCreateAsyncCallName = "managedCreateAsyncCall" - managedGetCallbackClosure = "managedGetCallbackClosure" - managedGetMultiESDTCallValueName = "managedGetMultiESDTCallValue" - managedGetESDTBalanceName = "managedGetESDTBalance" - managedGetESDTTokenDataName = "managedGetESDTTokenData" - managedGetReturnDataName = "managedGetReturnData" - managedGetPrevBlockRandomSeedName = "managedGetPrevBlockRandomSeed" - managedGetBlockRandomSeedName = "managedGetBlockRandomSeed" - managedGetStateRootHashName = "managedGetStateRootHash" - managedGetOriginalTxHashName = "managedGetOriginalTxHash" - managedIsESDTFrozenName = "managedIsESDTFrozen" - managedIsESDTLimitedTransferName = "managedIsESDTLimitedTransfer" - managedIsESDTPausedName = "managedIsESDTPaused" - managedBufferToHexName = "managedBufferToHex" - managedGetCodeMetadataName = "managedGetCodeMetadata" - managedIsBuiltinFunction = "managedIsBuiltinFunction" + managedSCAddressName = "managedSCAddress" + managedOwnerAddressName = "managedOwnerAddress" + managedCallerName = "managedCaller" + managedSignalErrorName = "managedSignalError" + managedWriteLogName = "managedWriteLog" + managedMultiTransferESDTNFTExecuteName = "managedMultiTransferESDTNFTExecute" + managedTransferValueExecuteName = "managedTransferValueExecute" + managedExecuteOnDestContextName = "managedExecuteOnDestContext" + managedExecuteOnDestContextByCallerName = "managedExecuteOnDestContextByCaller" + managedExecuteOnSameContextName = "managedExecuteOnSameContext" + managedExecuteReadOnlyName = "managedExecuteReadOnly" + managedCreateContractName = "managedCreateContract" + managedDeployFromSourceContractName = "managedDeployFromSourceContract" + managedUpgradeContractName = "managedUpgradeContract" + managedUpgradeFromSourceContractName = "managedUpgradeFromSourceContract" + managedAsyncCallName = "managedAsyncCall" + managedCreateAsyncCallName = "managedCreateAsyncCall" + managedGetCallbackClosure = "managedGetCallbackClosure" + managedGetMultiESDTCallValueName = "managedGetMultiESDTCallValue" + managedGetESDTBalanceName = "managedGetESDTBalance" + managedGetESDTTokenDataName = "managedGetESDTTokenData" + managedGetReturnDataName = "managedGetReturnData" + managedGetPrevBlockRandomSeedName = "managedGetPrevBlockRandomSeed" + managedGetBlockRandomSeedName = "managedGetBlockRandomSeed" + managedGetStateRootHashName = "managedGetStateRootHash" + managedGetOriginalTxHashName = "managedGetOriginalTxHash" + managedIsESDTFrozenName = "managedIsESDTFrozen" + managedIsESDTLimitedTransferName = "managedIsESDTLimitedTransfer" + managedIsESDTPausedName = "managedIsESDTPaused" + managedBufferToHexName = "managedBufferToHex" + managedGetCodeMetadataName = "managedGetCodeMetadata" + managedIsBuiltinFunction = "managedIsBuiltinFunction" + managedMultiTransferESDTNFTExecuteByUser = "managedMultiTransferESDTNFTExecuteByUser" ) // ManagedSCAddress VMHooks implementation. @@ -104,6 +105,40 @@ func (context *VMHooksImpl) ManagedCaller(destinationHandle int32) { managedType.SetBytes(destinationHandle, caller) } +// ManagedGetOriginalCallerAddr VMHooks implementation. +// @autogenerate(VMHooks) +func (context *VMHooksImpl) ManagedGetOriginalCallerAddr(destinationHandle int32) { + managedType := context.GetManagedTypesContext() + runtime := context.GetRuntimeContext() + metering := context.GetMeteringContext() + + gasToUse := metering.GasSchedule().BaseOpsAPICost.GetCaller + err := metering.UseGasBoundedAndAddTracedGas(managedCallerName, gasToUse) + if context.WithFault(err, runtime.ManagedBufferAPIErrorShouldFailExecution()) { + return + } + + caller := runtime.GetVMInput().OriginalCallerAddr + managedType.SetBytes(destinationHandle, caller) +} + +// ManagedGetRelayerAddr VMHooks implementation. +// @autogenerate(VMHooks) +func (context *VMHooksImpl) ManagedGetRelayerAddr(destinationHandle int32) { + managedType := context.GetManagedTypesContext() + runtime := context.GetRuntimeContext() + metering := context.GetMeteringContext() + + gasToUse := metering.GasSchedule().BaseOpsAPICost.GetCaller + err := metering.UseGasBoundedAndAddTracedGas(managedCallerName, gasToUse) + if context.WithFault(err, runtime.ManagedBufferAPIErrorShouldFailExecution()) { + return + } + + caller := runtime.GetVMInput().RelayerAddr + managedType.SetBytes(destinationHandle, caller) +} + // ManagedSignalError VMHooks implementation. // @autogenerate(VMHooks) func (context *VMHooksImpl) ManagedSignalError(errHandle int32) { @@ -1026,6 +1061,53 @@ func (context *VMHooksImpl) ManagedMultiTransferESDTNFTExecute( ) } +// ManagedMultiTransferESDTNFTExecuteByUser VMHooks implementation. +// @autogenerate(VMHooks) +func (context *VMHooksImpl) ManagedMultiTransferESDTNFTExecuteByUser( + userHandle int32, + dstHandle int32, + tokenTransfersHandle int32, + gasLimit int64, + functionHandle int32, + argumentsHandle int32, +) int32 { + host := context.GetVMHost() + managedType := host.ManagedTypes() + runtime := host.Runtime() + metering := host.Metering() + metering.StartGasTracing(managedMultiTransferESDTNFTExecuteByUser) + + if !host.IsAllowedToExecute(managedMultiTransferESDTNFTExecuteByUser) { + _ = WithFaultAndHost(host, vmhost.ErrOpcodeIsNotAllowed, runtime.BaseOpsErrorShouldFailExecution()) + return -1 + } + + user, err := managedType.GetBytes(userHandle) + if WithFaultAndHost(host, err, runtime.BaseOpsErrorShouldFailExecution()) { + return -1 + } + + vmInput, err := readDestinationFunctionArguments(host, dstHandle, functionHandle, argumentsHandle) + if WithFaultAndHost(host, err, runtime.BaseOpsErrorShouldFailExecution()) { + return -1 + } + + transfers, err := readESDTTransfers(managedType, runtime, tokenTransfersHandle) + if WithFaultAndHost(host, err, runtime.BaseOpsErrorShouldFailExecution()) { + return -1 + } + + return TransferESDTNFTExecuteByUserWithTypedArgs( + host, + user, + vmInput.destination, + transfers, + gasLimit, + []byte(vmInput.function), + vmInput.arguments, + ) +} + // ManagedTransferValueExecute VMHooks implementation. // @autogenerate(VMHooks) func (context *VMHooksImpl) ManagedTransferValueExecute( diff --git a/wasmer/wasmerImportsCgo.go b/wasmer/wasmerImportsCgo.go index da92dbb44..72f3ea330 100644 --- a/wasmer/wasmerImportsCgo.go +++ b/wasmer/wasmerImportsCgo.go @@ -64,6 +64,7 @@ package wasmer // extern int32_t v1_5_getNumESDTTransfers(void* context); // extern int32_t v1_5_getCallValueTokenName(void* context, int32_t callValueOffset, int32_t tokenNameOffset); // extern int32_t v1_5_getCallValueTokenNameByIndex(void* context, int32_t callValueOffset, int32_t tokenNameOffset, int32_t index); +// extern int32_t v1_5_isReservedFunctionName(void* context, int32_t nameHandle); // extern void v1_5_writeLog(void* context, int32_t dataPointer, int32_t dataLength, int32_t topicPtr, int32_t numTopics); // extern void v1_5_writeEventLog(void* context, int32_t numTopics, int32_t topicLengthsOffset, int32_t topicOffset, int32_t dataOffset, int32_t dataLength); // extern long long v1_5_getBlockTimestamp(void* context); @@ -94,6 +95,8 @@ package wasmer // extern void v1_5_managedSCAddress(void* context, int32_t destinationHandle); // extern void v1_5_managedOwnerAddress(void* context, int32_t destinationHandle); // extern void v1_5_managedCaller(void* context, int32_t destinationHandle); +// extern void v1_5_managedGetOriginalCallerAddr(void* context, int32_t destinationHandle); +// extern void v1_5_managedGetRelayerAddr(void* context, int32_t destinationHandle); // extern void v1_5_managedSignalError(void* context, int32_t errHandle); // extern void v1_5_managedWriteLog(void* context, int32_t topicsHandle, int32_t dataHandle); // extern void v1_5_managedGetOriginalTxHash(void* context, int32_t resultHandle); @@ -102,7 +105,7 @@ package wasmer // extern void v1_5_managedGetPrevBlockRandomSeed(void* context, int32_t resultHandle); // extern void v1_5_managedGetReturnData(void* context, int32_t resultID, int32_t resultHandle); // extern void v1_5_managedGetMultiESDTCallValue(void* context, int32_t multiCallValueHandle); -// extern void v1_5_managedGetBackTransfers(void* context, int32_t esdtTransfersValueHandle, int32_t callValueHandle); +// extern void v1_5_managedGetBackTransfers(void* context, int32_t esdtTransfersValueHandle, int32_t egldValueHandle); // extern void v1_5_managedGetESDTBalance(void* context, int32_t addressHandle, int32_t tokenIDHandle, long long nonce, int32_t valueHandle); // extern void v1_5_managedGetESDTTokenData(void* context, int32_t addressHandle, int32_t tokenIDHandle, long long nonce, int32_t valueHandle, int32_t propertiesHandle, int32_t hashHandle, int32_t nameHandle, int32_t attributesHandle, int32_t creatorHandle, int32_t royaltiesHandle, int32_t urisHandle); // extern void v1_5_managedAsyncCall(void* context, int32_t destHandle, int32_t valueHandle, int32_t functionHandle, int32_t argumentsHandle); @@ -117,6 +120,7 @@ package wasmer // extern int32_t v1_5_managedExecuteOnSameContext(void* context, long long gas, int32_t addressHandle, int32_t valueHandle, int32_t functionHandle, int32_t argumentsHandle, int32_t resultHandle); // extern int32_t v1_5_managedExecuteOnDestContext(void* context, long long gas, int32_t addressHandle, int32_t valueHandle, int32_t functionHandle, int32_t argumentsHandle, int32_t resultHandle); // extern int32_t v1_5_managedMultiTransferESDTNFTExecute(void* context, int32_t dstHandle, int32_t tokenTransfersHandle, long long gasLimit, int32_t functionHandle, int32_t argumentsHandle); +// extern int32_t v1_5_managedMultiTransferESDTNFTExecuteByUser(void* context, int32_t userHandle, int32_t dstHandle, int32_t tokenTransfersHandle, long long gasLimit, int32_t functionHandle, int32_t argumentsHandle); // extern int32_t v1_5_managedTransferValueExecute(void* context, int32_t dstHandle, int32_t valueHandle, long long gasLimit, int32_t functionHandle, int32_t argumentsHandle); // extern int32_t v1_5_managedIsESDTFrozen(void* context, int32_t addressHandle, int32_t tokenIDHandle, long long nonce); // extern int32_t v1_5_managedIsESDTLimitedTransfer(void* context, int32_t tokenIDHandle); @@ -266,6 +270,9 @@ package wasmer // extern int32_t v1_5_getCurveLengthEC(void* context, int32_t ecHandle); // extern int32_t v1_5_getPrivKeyByteLengthEC(void* context, int32_t ecHandle); // extern int32_t v1_5_ellipticCurveGetValues(void* context, int32_t ecHandle, int32_t fieldOrderHandle, int32_t basePointOrderHandle, int32_t eqConstantHandle, int32_t xBasePointHandle, int32_t yBasePointHandle); +// extern int32_t v1_5_managedVerifySecp256r1(void* context, int32_t keyHandle, int32_t messageHandle, int32_t sigHandle); +// extern int32_t v1_5_managedVerifyBLSSignatureShare(void* context, int32_t keyHandle, int32_t messageHandle, int32_t sigHandle); +// extern int32_t v1_5_managedVerifyBLSAggregatedSignature(void* context, int32_t keyHandle, int32_t messageHandle, int32_t sigHandle); import "C" import ( @@ -542,6 +549,11 @@ func populateWasmerImports(imports *wasmerImports) error { return err } + err = imports.append("isReservedFunctionName", v1_5_isReservedFunctionName, C.v1_5_isReservedFunctionName) + if err != nil { + return err + } + err = imports.append("writeLog", v1_5_writeLog, C.v1_5_writeLog) if err != nil { return err @@ -692,6 +704,16 @@ func populateWasmerImports(imports *wasmerImports) error { return err } + err = imports.append("managedGetOriginalCallerAddr", v1_5_managedGetOriginalCallerAddr, C.v1_5_managedGetOriginalCallerAddr) + if err != nil { + return err + } + + err = imports.append("managedGetRelayerAddr", v1_5_managedGetRelayerAddr, C.v1_5_managedGetRelayerAddr) + if err != nil { + return err + } + err = imports.append("managedSignalError", v1_5_managedSignalError, C.v1_5_managedSignalError) if err != nil { return err @@ -807,6 +829,11 @@ func populateWasmerImports(imports *wasmerImports) error { return err } + err = imports.append("managedMultiTransferESDTNFTExecuteByUser", v1_5_managedMultiTransferESDTNFTExecuteByUser, C.v1_5_managedMultiTransferESDTNFTExecuteByUser) + if err != nil { + return err + } + err = imports.append("managedTransferValueExecute", v1_5_managedTransferValueExecute, C.v1_5_managedTransferValueExecute) if err != nil { return err @@ -1552,6 +1579,21 @@ func populateWasmerImports(imports *wasmerImports) error { return err } + err = imports.append("managedVerifySecp256r1", v1_5_managedVerifySecp256r1, C.v1_5_managedVerifySecp256r1) + if err != nil { + return err + } + + err = imports.append("managedVerifyBLSSignatureShare", v1_5_managedVerifyBLSSignatureShare, C.v1_5_managedVerifyBLSSignatureShare) + if err != nil { + return err + } + + err = imports.append("managedVerifyBLSAggregatedSignature", v1_5_managedVerifyBLSAggregatedSignature, C.v1_5_managedVerifyBLSAggregatedSignature) + if err != nil { + return err + } + return nil } @@ -1873,6 +1915,12 @@ func v1_5_getCallValueTokenNameByIndex(context unsafe.Pointer, callValueOffset i return vmHooks.GetCallValueTokenNameByIndex(executor.MemPtr(callValueOffset), executor.MemPtr(tokenNameOffset), index) } +//export v1_5_isReservedFunctionName +func v1_5_isReservedFunctionName(context unsafe.Pointer, nameHandle int32) int32 { + vmHooks := getVMHooksFromContextRawPtr(context) + return vmHooks.IsReservedFunctionName(nameHandle) +} + //export v1_5_writeLog func v1_5_writeLog(context unsafe.Pointer, dataPointer int32, dataLength int32, topicPtr int32, numTopics int32) { vmHooks := getVMHooksFromContextRawPtr(context) @@ -2053,6 +2101,18 @@ func v1_5_managedCaller(context unsafe.Pointer, destinationHandle int32) { vmHooks.ManagedCaller(destinationHandle) } +//export v1_5_managedGetOriginalCallerAddr +func v1_5_managedGetOriginalCallerAddr(context unsafe.Pointer, destinationHandle int32) { + vmHooks := getVMHooksFromContextRawPtr(context) + vmHooks.ManagedGetOriginalCallerAddr(destinationHandle) +} + +//export v1_5_managedGetRelayerAddr +func v1_5_managedGetRelayerAddr(context unsafe.Pointer, destinationHandle int32) { + vmHooks := getVMHooksFromContextRawPtr(context) + vmHooks.ManagedGetRelayerAddr(destinationHandle) +} + //export v1_5_managedSignalError func v1_5_managedSignalError(context unsafe.Pointer, errHandle int32) { vmHooks := getVMHooksFromContextRawPtr(context) @@ -2102,9 +2162,9 @@ func v1_5_managedGetMultiESDTCallValue(context unsafe.Pointer, multiCallValueHan } //export v1_5_managedGetBackTransfers -func v1_5_managedGetBackTransfers(context unsafe.Pointer, esdtTransfersValueHandle int32, callValueHandle int32) { +func v1_5_managedGetBackTransfers(context unsafe.Pointer, esdtTransfersValueHandle int32, egldValueHandle int32) { vmHooks := getVMHooksFromContextRawPtr(context) - vmHooks.ManagedGetBackTransfers(esdtTransfersValueHandle, callValueHandle) + vmHooks.ManagedGetBackTransfers(esdtTransfersValueHandle, egldValueHandle) } //export v1_5_managedGetESDTBalance @@ -2191,6 +2251,12 @@ func v1_5_managedMultiTransferESDTNFTExecute(context unsafe.Pointer, dstHandle i return vmHooks.ManagedMultiTransferESDTNFTExecute(dstHandle, tokenTransfersHandle, gasLimit, functionHandle, argumentsHandle) } +//export v1_5_managedMultiTransferESDTNFTExecuteByUser +func v1_5_managedMultiTransferESDTNFTExecuteByUser(context unsafe.Pointer, userHandle int32, dstHandle int32, tokenTransfersHandle int32, gasLimit int64, functionHandle int32, argumentsHandle int32) int32 { + vmHooks := getVMHooksFromContextRawPtr(context) + return vmHooks.ManagedMultiTransferESDTNFTExecuteByUser(userHandle, dstHandle, tokenTransfersHandle, gasLimit, functionHandle, argumentsHandle) +} + //export v1_5_managedTransferValueExecute func v1_5_managedTransferValueExecute(context unsafe.Pointer, dstHandle int32, valueHandle int32, gasLimit int64, functionHandle int32, argumentsHandle int32) int32 { vmHooks := getVMHooksFromContextRawPtr(context) @@ -3084,3 +3150,21 @@ func v1_5_ellipticCurveGetValues(context unsafe.Pointer, ecHandle int32, fieldOr vmHooks := getVMHooksFromContextRawPtr(context) return vmHooks.EllipticCurveGetValues(ecHandle, fieldOrderHandle, basePointOrderHandle, eqConstantHandle, xBasePointHandle, yBasePointHandle) } + +//export v1_5_managedVerifySecp256r1 +func v1_5_managedVerifySecp256r1(context unsafe.Pointer, keyHandle int32, messageHandle int32, sigHandle int32) int32 { + vmHooks := getVMHooksFromContextRawPtr(context) + return vmHooks.ManagedVerifySecp256r1(keyHandle, messageHandle, sigHandle) +} + +//export v1_5_managedVerifyBLSSignatureShare +func v1_5_managedVerifyBLSSignatureShare(context unsafe.Pointer, keyHandle int32, messageHandle int32, sigHandle int32) int32 { + vmHooks := getVMHooksFromContextRawPtr(context) + return vmHooks.ManagedVerifyBLSSignatureShare(keyHandle, messageHandle, sigHandle) +} + +//export v1_5_managedVerifyBLSAggregatedSignature +func v1_5_managedVerifyBLSAggregatedSignature(context unsafe.Pointer, keyHandle int32, messageHandle int32, sigHandle int32) int32 { + vmHooks := getVMHooksFromContextRawPtr(context) + return vmHooks.ManagedVerifyBLSAggregatedSignature(keyHandle, messageHandle, sigHandle) +} diff --git a/wasmer2/libvmexeccapi.dylib b/wasmer2/libvmexeccapi.dylib index 1b13674dc..ab92b21e0 100644 Binary files a/wasmer2/libvmexeccapi.dylib and b/wasmer2/libvmexeccapi.dylib differ diff --git a/wasmer2/libvmexeccapi.h b/wasmer2/libvmexeccapi.h index c7b77ad8f..f4f989a42 100644 --- a/wasmer2/libvmexeccapi.h +++ b/wasmer2/libvmexeccapi.h @@ -91,6 +91,7 @@ typedef struct { int32_t (*get_num_esdt_transfers_func_ptr)(void *context); int32_t (*get_call_value_token_name_func_ptr)(void *context, int32_t call_value_offset, int32_t token_name_offset); int32_t (*get_call_value_token_name_by_index_func_ptr)(void *context, int32_t call_value_offset, int32_t token_name_offset, int32_t index); + int32_t (*is_reserved_function_name_func_ptr)(void *context, int32_t name_handle); void (*write_log_func_ptr)(void *context, int32_t data_pointer, int32_t data_length, int32_t topic_ptr, int32_t num_topics); void (*write_event_log_func_ptr)(void *context, int32_t num_topics, int32_t topic_lengths_offset, int32_t topic_offset, int32_t data_offset, int32_t data_length); int64_t (*get_block_timestamp_func_ptr)(void *context); @@ -121,6 +122,8 @@ typedef struct { void (*managed_sc_address_func_ptr)(void *context, int32_t destination_handle); void (*managed_owner_address_func_ptr)(void *context, int32_t destination_handle); void (*managed_caller_func_ptr)(void *context, int32_t destination_handle); + void (*managed_get_original_caller_addr_func_ptr)(void *context, int32_t destination_handle); + void (*managed_get_relayer_addr_func_ptr)(void *context, int32_t destination_handle); void (*managed_signal_error_func_ptr)(void *context, int32_t err_handle); void (*managed_write_log_func_ptr)(void *context, int32_t topics_handle, int32_t data_handle); void (*managed_get_original_tx_hash_func_ptr)(void *context, int32_t result_handle); @@ -129,7 +132,7 @@ typedef struct { void (*managed_get_prev_block_random_seed_func_ptr)(void *context, int32_t result_handle); void (*managed_get_return_data_func_ptr)(void *context, int32_t result_id, int32_t result_handle); void (*managed_get_multi_esdt_call_value_func_ptr)(void *context, int32_t multi_call_value_handle); - void (*managed_get_back_transfers_func_ptr)(void *context, int32_t esdt_transfers_value_handle, int32_t call_value_handle); + void (*managed_get_back_transfers_func_ptr)(void *context, int32_t esdt_transfers_value_handle, int32_t egld_value_handle); void (*managed_get_esdt_balance_func_ptr)(void *context, int32_t address_handle, int32_t token_id_handle, int64_t nonce, int32_t value_handle); void (*managed_get_esdt_token_data_func_ptr)(void *context, int32_t address_handle, int32_t token_id_handle, int64_t nonce, int32_t value_handle, int32_t properties_handle, int32_t hash_handle, int32_t name_handle, int32_t attributes_handle, int32_t creator_handle, int32_t royalties_handle, int32_t uris_handle); void (*managed_async_call_func_ptr)(void *context, int32_t dest_handle, int32_t value_handle, int32_t function_handle, int32_t arguments_handle); @@ -144,6 +147,7 @@ typedef struct { int32_t (*managed_execute_on_same_context_func_ptr)(void *context, int64_t gas, int32_t address_handle, int32_t value_handle, int32_t function_handle, int32_t arguments_handle, int32_t result_handle); int32_t (*managed_execute_on_dest_context_func_ptr)(void *context, int64_t gas, int32_t address_handle, int32_t value_handle, int32_t function_handle, int32_t arguments_handle, int32_t result_handle); int32_t (*managed_multi_transfer_esdt_nft_execute_func_ptr)(void *context, int32_t dst_handle, int32_t token_transfers_handle, int64_t gas_limit, int32_t function_handle, int32_t arguments_handle); + int32_t (*managed_multi_transfer_esdt_nft_execute_by_user_func_ptr)(void *context, int32_t user_handle, int32_t dst_handle, int32_t token_transfers_handle, int64_t gas_limit, int32_t function_handle, int32_t arguments_handle); int32_t (*managed_transfer_value_execute_func_ptr)(void *context, int32_t dst_handle, int32_t value_handle, int64_t gas_limit, int32_t function_handle, int32_t arguments_handle); int32_t (*managed_is_esdt_frozen_func_ptr)(void *context, int32_t address_handle, int32_t token_id_handle, int64_t nonce); int32_t (*managed_is_esdt_limited_transfer_func_ptr)(void *context, int32_t token_id_handle); @@ -293,6 +297,9 @@ typedef struct { int32_t (*get_curve_length_ec_func_ptr)(void *context, int32_t ec_handle); int32_t (*get_priv_key_byte_length_ec_func_ptr)(void *context, int32_t ec_handle); int32_t (*elliptic_curve_get_values_func_ptr)(void *context, int32_t ec_handle, int32_t field_order_handle, int32_t base_point_order_handle, int32_t eq_constant_handle, int32_t x_base_point_handle, int32_t y_base_point_handle); + int32_t (*managed_verify_secp256r1_func_ptr)(void *context, int32_t key_handle, int32_t message_handle, int32_t sig_handle); + int32_t (*managed_verify_blssignature_share_func_ptr)(void *context, int32_t key_handle, int32_t message_handle, int32_t sig_handle); + int32_t (*managed_verify_blsaggregated_signature_func_ptr)(void *context, int32_t key_handle, int32_t message_handle, int32_t sig_handle); } vm_exec_vm_hook_c_func_pointers; typedef struct { diff --git a/wasmer2/libvmexeccapi.so b/wasmer2/libvmexeccapi.so index 1e55d1206..e9dcf9655 100644 Binary files a/wasmer2/libvmexeccapi.so and b/wasmer2/libvmexeccapi.so differ diff --git a/wasmer2/libvmexeccapi_arm.dylib b/wasmer2/libvmexeccapi_arm.dylib index f916407d3..a7b8275a0 100644 Binary files a/wasmer2/libvmexeccapi_arm.dylib and b/wasmer2/libvmexeccapi_arm.dylib differ diff --git a/wasmer2/libvmexeccapi_arm.so b/wasmer2/libvmexeccapi_arm.so index 91ddfb8dc..cd74e54e8 100644 Binary files a/wasmer2/libvmexeccapi_arm.so and b/wasmer2/libvmexeccapi_arm.so differ diff --git a/wasmer2/wasmer2ImportsCgo.go b/wasmer2/wasmer2ImportsCgo.go index b24feb6ef..44bc33019 100644 --- a/wasmer2/wasmer2ImportsCgo.go +++ b/wasmer2/wasmer2ImportsCgo.go @@ -64,6 +64,7 @@ package wasmer2 // extern int32_t w2_getNumESDTTransfers(void* context); // extern int32_t w2_getCallValueTokenName(void* context, int32_t callValueOffset, int32_t tokenNameOffset); // extern int32_t w2_getCallValueTokenNameByIndex(void* context, int32_t callValueOffset, int32_t tokenNameOffset, int32_t index); +// extern int32_t w2_isReservedFunctionName(void* context, int32_t nameHandle); // extern void w2_writeLog(void* context, int32_t dataPointer, int32_t dataLength, int32_t topicPtr, int32_t numTopics); // extern void w2_writeEventLog(void* context, int32_t numTopics, int32_t topicLengthsOffset, int32_t topicOffset, int32_t dataOffset, int32_t dataLength); // extern long long w2_getBlockTimestamp(void* context); @@ -94,6 +95,8 @@ package wasmer2 // extern void w2_managedSCAddress(void* context, int32_t destinationHandle); // extern void w2_managedOwnerAddress(void* context, int32_t destinationHandle); // extern void w2_managedCaller(void* context, int32_t destinationHandle); +// extern void w2_managedGetOriginalCallerAddr(void* context, int32_t destinationHandle); +// extern void w2_managedGetRelayerAddr(void* context, int32_t destinationHandle); // extern void w2_managedSignalError(void* context, int32_t errHandle); // extern void w2_managedWriteLog(void* context, int32_t topicsHandle, int32_t dataHandle); // extern void w2_managedGetOriginalTxHash(void* context, int32_t resultHandle); @@ -102,7 +105,7 @@ package wasmer2 // extern void w2_managedGetPrevBlockRandomSeed(void* context, int32_t resultHandle); // extern void w2_managedGetReturnData(void* context, int32_t resultID, int32_t resultHandle); // extern void w2_managedGetMultiESDTCallValue(void* context, int32_t multiCallValueHandle); -// extern void w2_managedGetBackTransfers(void* context, int32_t esdtTransfersValueHandle, int32_t callValueHandle); +// extern void w2_managedGetBackTransfers(void* context, int32_t esdtTransfersValueHandle, int32_t egldValueHandle); // extern void w2_managedGetESDTBalance(void* context, int32_t addressHandle, int32_t tokenIDHandle, long long nonce, int32_t valueHandle); // extern void w2_managedGetESDTTokenData(void* context, int32_t addressHandle, int32_t tokenIDHandle, long long nonce, int32_t valueHandle, int32_t propertiesHandle, int32_t hashHandle, int32_t nameHandle, int32_t attributesHandle, int32_t creatorHandle, int32_t royaltiesHandle, int32_t urisHandle); // extern void w2_managedAsyncCall(void* context, int32_t destHandle, int32_t valueHandle, int32_t functionHandle, int32_t argumentsHandle); @@ -117,6 +120,7 @@ package wasmer2 // extern int32_t w2_managedExecuteOnSameContext(void* context, long long gas, int32_t addressHandle, int32_t valueHandle, int32_t functionHandle, int32_t argumentsHandle, int32_t resultHandle); // extern int32_t w2_managedExecuteOnDestContext(void* context, long long gas, int32_t addressHandle, int32_t valueHandle, int32_t functionHandle, int32_t argumentsHandle, int32_t resultHandle); // extern int32_t w2_managedMultiTransferESDTNFTExecute(void* context, int32_t dstHandle, int32_t tokenTransfersHandle, long long gasLimit, int32_t functionHandle, int32_t argumentsHandle); +// extern int32_t w2_managedMultiTransferESDTNFTExecuteByUser(void* context, int32_t userHandle, int32_t dstHandle, int32_t tokenTransfersHandle, long long gasLimit, int32_t functionHandle, int32_t argumentsHandle); // extern int32_t w2_managedTransferValueExecute(void* context, int32_t dstHandle, int32_t valueHandle, long long gasLimit, int32_t functionHandle, int32_t argumentsHandle); // extern int32_t w2_managedIsESDTFrozen(void* context, int32_t addressHandle, int32_t tokenIDHandle, long long nonce); // extern int32_t w2_managedIsESDTLimitedTransfer(void* context, int32_t tokenIDHandle); @@ -266,6 +270,9 @@ package wasmer2 // extern int32_t w2_getCurveLengthEC(void* context, int32_t ecHandle); // extern int32_t w2_getPrivKeyByteLengthEC(void* context, int32_t ecHandle); // extern int32_t w2_ellipticCurveGetValues(void* context, int32_t ecHandle, int32_t fieldOrderHandle, int32_t basePointOrderHandle, int32_t eqConstantHandle, int32_t xBasePointHandle, int32_t yBasePointHandle); +// extern int32_t w2_managedVerifySecp256r1(void* context, int32_t keyHandle, int32_t messageHandle, int32_t sigHandle); +// extern int32_t w2_managedVerifyBLSSignatureShare(void* context, int32_t keyHandle, int32_t messageHandle, int32_t sigHandle); +// extern int32_t w2_managedVerifyBLSAggregatedSignature(void* context, int32_t keyHandle, int32_t messageHandle, int32_t sigHandle); import "C" import ( @@ -277,261 +284,268 @@ import ( // populateCgoFunctionPointers populates imports with the BaseOpsAPI API methods func populateCgoFunctionPointers() *cWasmerVmHookPointers { return &cWasmerVmHookPointers{ - get_gas_left_func_ptr: funcPointer(C.w2_getGasLeft), - get_sc_address_func_ptr: funcPointer(C.w2_getSCAddress), - get_owner_address_func_ptr: funcPointer(C.w2_getOwnerAddress), - get_shard_of_address_func_ptr: funcPointer(C.w2_getShardOfAddress), - is_smart_contract_func_ptr: funcPointer(C.w2_isSmartContract), - signal_error_func_ptr: funcPointer(C.w2_signalError), - get_external_balance_func_ptr: funcPointer(C.w2_getExternalBalance), - get_block_hash_func_ptr: funcPointer(C.w2_getBlockHash), - get_esdt_balance_func_ptr: funcPointer(C.w2_getESDTBalance), - get_esdt_nft_name_length_func_ptr: funcPointer(C.w2_getESDTNFTNameLength), - get_esdt_nft_attribute_length_func_ptr: funcPointer(C.w2_getESDTNFTAttributeLength), - get_esdt_nft_uri_length_func_ptr: funcPointer(C.w2_getESDTNFTURILength), - get_esdt_token_data_func_ptr: funcPointer(C.w2_getESDTTokenData), - get_esdt_local_roles_func_ptr: funcPointer(C.w2_getESDTLocalRoles), - validate_token_identifier_func_ptr: funcPointer(C.w2_validateTokenIdentifier), - transfer_value_func_ptr: funcPointer(C.w2_transferValue), - transfer_value_execute_func_ptr: funcPointer(C.w2_transferValueExecute), - transfer_esdt_execute_func_ptr: funcPointer(C.w2_transferESDTExecute), - transfer_esdt_nft_execute_func_ptr: funcPointer(C.w2_transferESDTNFTExecute), - multi_transfer_esdt_nft_execute_func_ptr: funcPointer(C.w2_multiTransferESDTNFTExecute), - create_async_call_func_ptr: funcPointer(C.w2_createAsyncCall), - set_async_context_callback_func_ptr: funcPointer(C.w2_setAsyncContextCallback), - upgrade_contract_func_ptr: funcPointer(C.w2_upgradeContract), - upgrade_from_source_contract_func_ptr: funcPointer(C.w2_upgradeFromSourceContract), - delete_contract_func_ptr: funcPointer(C.w2_deleteContract), - async_call_func_ptr: funcPointer(C.w2_asyncCall), - get_argument_length_func_ptr: funcPointer(C.w2_getArgumentLength), - get_argument_func_ptr: funcPointer(C.w2_getArgument), - get_function_func_ptr: funcPointer(C.w2_getFunction), - get_num_arguments_func_ptr: funcPointer(C.w2_getNumArguments), - storage_store_func_ptr: funcPointer(C.w2_storageStore), - storage_load_length_func_ptr: funcPointer(C.w2_storageLoadLength), - storage_load_from_address_func_ptr: funcPointer(C.w2_storageLoadFromAddress), - storage_load_func_ptr: funcPointer(C.w2_storageLoad), - set_storage_lock_func_ptr: funcPointer(C.w2_setStorageLock), - get_storage_lock_func_ptr: funcPointer(C.w2_getStorageLock), - is_storage_locked_func_ptr: funcPointer(C.w2_isStorageLocked), - clear_storage_lock_func_ptr: funcPointer(C.w2_clearStorageLock), - get_caller_func_ptr: funcPointer(C.w2_getCaller), - check_no_payment_func_ptr: funcPointer(C.w2_checkNoPayment), - get_call_value_func_ptr: funcPointer(C.w2_getCallValue), - get_esdt_value_func_ptr: funcPointer(C.w2_getESDTValue), - get_esdt_value_by_index_func_ptr: funcPointer(C.w2_getESDTValueByIndex), - get_esdt_token_name_func_ptr: funcPointer(C.w2_getESDTTokenName), - get_esdt_token_name_by_index_func_ptr: funcPointer(C.w2_getESDTTokenNameByIndex), - get_esdt_token_nonce_func_ptr: funcPointer(C.w2_getESDTTokenNonce), - get_esdt_token_nonce_by_index_func_ptr: funcPointer(C.w2_getESDTTokenNonceByIndex), - get_current_esdt_nft_nonce_func_ptr: funcPointer(C.w2_getCurrentESDTNFTNonce), - get_esdt_token_type_func_ptr: funcPointer(C.w2_getESDTTokenType), - get_esdt_token_type_by_index_func_ptr: funcPointer(C.w2_getESDTTokenTypeByIndex), - get_num_esdt_transfers_func_ptr: funcPointer(C.w2_getNumESDTTransfers), - get_call_value_token_name_func_ptr: funcPointer(C.w2_getCallValueTokenName), - get_call_value_token_name_by_index_func_ptr: funcPointer(C.w2_getCallValueTokenNameByIndex), - write_log_func_ptr: funcPointer(C.w2_writeLog), - write_event_log_func_ptr: funcPointer(C.w2_writeEventLog), - get_block_timestamp_func_ptr: funcPointer(C.w2_getBlockTimestamp), - get_block_nonce_func_ptr: funcPointer(C.w2_getBlockNonce), - get_block_round_func_ptr: funcPointer(C.w2_getBlockRound), - get_block_epoch_func_ptr: funcPointer(C.w2_getBlockEpoch), - get_block_random_seed_func_ptr: funcPointer(C.w2_getBlockRandomSeed), - get_state_root_hash_func_ptr: funcPointer(C.w2_getStateRootHash), - get_prev_block_timestamp_func_ptr: funcPointer(C.w2_getPrevBlockTimestamp), - get_prev_block_nonce_func_ptr: funcPointer(C.w2_getPrevBlockNonce), - get_prev_block_round_func_ptr: funcPointer(C.w2_getPrevBlockRound), - get_prev_block_epoch_func_ptr: funcPointer(C.w2_getPrevBlockEpoch), - get_prev_block_random_seed_func_ptr: funcPointer(C.w2_getPrevBlockRandomSeed), - finish_func_ptr: funcPointer(C.w2_finish), - execute_on_same_context_func_ptr: funcPointer(C.w2_executeOnSameContext), - execute_on_dest_context_func_ptr: funcPointer(C.w2_executeOnDestContext), - execute_read_only_func_ptr: funcPointer(C.w2_executeReadOnly), - create_contract_func_ptr: funcPointer(C.w2_createContract), - deploy_from_source_contract_func_ptr: funcPointer(C.w2_deployFromSourceContract), - get_num_return_data_func_ptr: funcPointer(C.w2_getNumReturnData), - get_return_data_size_func_ptr: funcPointer(C.w2_getReturnDataSize), - get_return_data_func_ptr: funcPointer(C.w2_getReturnData), - clean_return_data_func_ptr: funcPointer(C.w2_cleanReturnData), - delete_from_return_data_func_ptr: funcPointer(C.w2_deleteFromReturnData), - get_original_tx_hash_func_ptr: funcPointer(C.w2_getOriginalTxHash), - get_current_tx_hash_func_ptr: funcPointer(C.w2_getCurrentTxHash), - get_prev_tx_hash_func_ptr: funcPointer(C.w2_getPrevTxHash), - managed_sc_address_func_ptr: funcPointer(C.w2_managedSCAddress), - managed_owner_address_func_ptr: funcPointer(C.w2_managedOwnerAddress), - managed_caller_func_ptr: funcPointer(C.w2_managedCaller), - managed_signal_error_func_ptr: funcPointer(C.w2_managedSignalError), - managed_write_log_func_ptr: funcPointer(C.w2_managedWriteLog), - managed_get_original_tx_hash_func_ptr: funcPointer(C.w2_managedGetOriginalTxHash), - managed_get_state_root_hash_func_ptr: funcPointer(C.w2_managedGetStateRootHash), - managed_get_block_random_seed_func_ptr: funcPointer(C.w2_managedGetBlockRandomSeed), - managed_get_prev_block_random_seed_func_ptr: funcPointer(C.w2_managedGetPrevBlockRandomSeed), - managed_get_return_data_func_ptr: funcPointer(C.w2_managedGetReturnData), - managed_get_multi_esdt_call_value_func_ptr: funcPointer(C.w2_managedGetMultiESDTCallValue), - managed_get_back_transfers_func_ptr: funcPointer(C.w2_managedGetBackTransfers), - managed_get_esdt_balance_func_ptr: funcPointer(C.w2_managedGetESDTBalance), - managed_get_esdt_token_data_func_ptr: funcPointer(C.w2_managedGetESDTTokenData), - managed_async_call_func_ptr: funcPointer(C.w2_managedAsyncCall), - managed_create_async_call_func_ptr: funcPointer(C.w2_managedCreateAsyncCall), - managed_get_callback_closure_func_ptr: funcPointer(C.w2_managedGetCallbackClosure), - managed_upgrade_from_source_contract_func_ptr: funcPointer(C.w2_managedUpgradeFromSourceContract), - managed_upgrade_contract_func_ptr: funcPointer(C.w2_managedUpgradeContract), - managed_delete_contract_func_ptr: funcPointer(C.w2_managedDeleteContract), - managed_deploy_from_source_contract_func_ptr: funcPointer(C.w2_managedDeployFromSourceContract), - managed_create_contract_func_ptr: funcPointer(C.w2_managedCreateContract), - managed_execute_read_only_func_ptr: funcPointer(C.w2_managedExecuteReadOnly), - managed_execute_on_same_context_func_ptr: funcPointer(C.w2_managedExecuteOnSameContext), - managed_execute_on_dest_context_func_ptr: funcPointer(C.w2_managedExecuteOnDestContext), - managed_multi_transfer_esdt_nft_execute_func_ptr: funcPointer(C.w2_managedMultiTransferESDTNFTExecute), - managed_transfer_value_execute_func_ptr: funcPointer(C.w2_managedTransferValueExecute), - managed_is_esdt_frozen_func_ptr: funcPointer(C.w2_managedIsESDTFrozen), - managed_is_esdt_limited_transfer_func_ptr: funcPointer(C.w2_managedIsESDTLimitedTransfer), - managed_is_esdt_paused_func_ptr: funcPointer(C.w2_managedIsESDTPaused), - managed_buffer_to_hex_func_ptr: funcPointer(C.w2_managedBufferToHex), - managed_get_code_metadata_func_ptr: funcPointer(C.w2_managedGetCodeMetadata), - managed_is_builtin_function_func_ptr: funcPointer(C.w2_managedIsBuiltinFunction), - big_float_new_from_parts_func_ptr: funcPointer(C.w2_bigFloatNewFromParts), - big_float_new_from_frac_func_ptr: funcPointer(C.w2_bigFloatNewFromFrac), - big_float_new_from_sci_func_ptr: funcPointer(C.w2_bigFloatNewFromSci), - big_float_add_func_ptr: funcPointer(C.w2_bigFloatAdd), - big_float_sub_func_ptr: funcPointer(C.w2_bigFloatSub), - big_float_mul_func_ptr: funcPointer(C.w2_bigFloatMul), - big_float_div_func_ptr: funcPointer(C.w2_bigFloatDiv), - big_float_neg_func_ptr: funcPointer(C.w2_bigFloatNeg), - big_float_clone_func_ptr: funcPointer(C.w2_bigFloatClone), - big_float_cmp_func_ptr: funcPointer(C.w2_bigFloatCmp), - big_float_abs_func_ptr: funcPointer(C.w2_bigFloatAbs), - big_float_sign_func_ptr: funcPointer(C.w2_bigFloatSign), - big_float_sqrt_func_ptr: funcPointer(C.w2_bigFloatSqrt), - big_float_pow_func_ptr: funcPointer(C.w2_bigFloatPow), - big_float_floor_func_ptr: funcPointer(C.w2_bigFloatFloor), - big_float_ceil_func_ptr: funcPointer(C.w2_bigFloatCeil), - big_float_truncate_func_ptr: funcPointer(C.w2_bigFloatTruncate), - big_float_set_int64_func_ptr: funcPointer(C.w2_bigFloatSetInt64), - big_float_is_int_func_ptr: funcPointer(C.w2_bigFloatIsInt), - big_float_set_big_int_func_ptr: funcPointer(C.w2_bigFloatSetBigInt), - big_float_get_const_pi_func_ptr: funcPointer(C.w2_bigFloatGetConstPi), - big_float_get_const_e_func_ptr: funcPointer(C.w2_bigFloatGetConstE), - big_int_get_unsigned_argument_func_ptr: funcPointer(C.w2_bigIntGetUnsignedArgument), - big_int_get_signed_argument_func_ptr: funcPointer(C.w2_bigIntGetSignedArgument), - big_int_storage_store_unsigned_func_ptr: funcPointer(C.w2_bigIntStorageStoreUnsigned), - big_int_storage_load_unsigned_func_ptr: funcPointer(C.w2_bigIntStorageLoadUnsigned), - big_int_get_call_value_func_ptr: funcPointer(C.w2_bigIntGetCallValue), - big_int_get_esdt_call_value_func_ptr: funcPointer(C.w2_bigIntGetESDTCallValue), - big_int_get_esdt_call_value_by_index_func_ptr: funcPointer(C.w2_bigIntGetESDTCallValueByIndex), - big_int_get_external_balance_func_ptr: funcPointer(C.w2_bigIntGetExternalBalance), - big_int_get_esdt_external_balance_func_ptr: funcPointer(C.w2_bigIntGetESDTExternalBalance), - big_int_new_func_ptr: funcPointer(C.w2_bigIntNew), - big_int_unsigned_byte_length_func_ptr: funcPointer(C.w2_bigIntUnsignedByteLength), - big_int_signed_byte_length_func_ptr: funcPointer(C.w2_bigIntSignedByteLength), - big_int_get_unsigned_bytes_func_ptr: funcPointer(C.w2_bigIntGetUnsignedBytes), - big_int_get_signed_bytes_func_ptr: funcPointer(C.w2_bigIntGetSignedBytes), - big_int_set_unsigned_bytes_func_ptr: funcPointer(C.w2_bigIntSetUnsignedBytes), - big_int_set_signed_bytes_func_ptr: funcPointer(C.w2_bigIntSetSignedBytes), - big_int_is_int64_func_ptr: funcPointer(C.w2_bigIntIsInt64), - big_int_get_int64_func_ptr: funcPointer(C.w2_bigIntGetInt64), - big_int_set_int64_func_ptr: funcPointer(C.w2_bigIntSetInt64), - big_int_add_func_ptr: funcPointer(C.w2_bigIntAdd), - big_int_sub_func_ptr: funcPointer(C.w2_bigIntSub), - big_int_mul_func_ptr: funcPointer(C.w2_bigIntMul), - big_int_tdiv_func_ptr: funcPointer(C.w2_bigIntTDiv), - big_int_tmod_func_ptr: funcPointer(C.w2_bigIntTMod), - big_int_ediv_func_ptr: funcPointer(C.w2_bigIntEDiv), - big_int_emod_func_ptr: funcPointer(C.w2_bigIntEMod), - big_int_sqrt_func_ptr: funcPointer(C.w2_bigIntSqrt), - big_int_pow_func_ptr: funcPointer(C.w2_bigIntPow), - big_int_log2_func_ptr: funcPointer(C.w2_bigIntLog2), - big_int_abs_func_ptr: funcPointer(C.w2_bigIntAbs), - big_int_neg_func_ptr: funcPointer(C.w2_bigIntNeg), - big_int_sign_func_ptr: funcPointer(C.w2_bigIntSign), - big_int_cmp_func_ptr: funcPointer(C.w2_bigIntCmp), - big_int_not_func_ptr: funcPointer(C.w2_bigIntNot), - big_int_and_func_ptr: funcPointer(C.w2_bigIntAnd), - big_int_or_func_ptr: funcPointer(C.w2_bigIntOr), - big_int_xor_func_ptr: funcPointer(C.w2_bigIntXor), - big_int_shr_func_ptr: funcPointer(C.w2_bigIntShr), - big_int_shl_func_ptr: funcPointer(C.w2_bigIntShl), - big_int_finish_unsigned_func_ptr: funcPointer(C.w2_bigIntFinishUnsigned), - big_int_finish_signed_func_ptr: funcPointer(C.w2_bigIntFinishSigned), - big_int_to_string_func_ptr: funcPointer(C.w2_bigIntToString), - mbuffer_new_func_ptr: funcPointer(C.w2_mBufferNew), - mbuffer_new_from_bytes_func_ptr: funcPointer(C.w2_mBufferNewFromBytes), - mbuffer_get_length_func_ptr: funcPointer(C.w2_mBufferGetLength), - mbuffer_get_bytes_func_ptr: funcPointer(C.w2_mBufferGetBytes), - mbuffer_get_byte_slice_func_ptr: funcPointer(C.w2_mBufferGetByteSlice), - mbuffer_copy_byte_slice_func_ptr: funcPointer(C.w2_mBufferCopyByteSlice), - mbuffer_eq_func_ptr: funcPointer(C.w2_mBufferEq), - mbuffer_set_bytes_func_ptr: funcPointer(C.w2_mBufferSetBytes), - mbuffer_set_byte_slice_func_ptr: funcPointer(C.w2_mBufferSetByteSlice), - mbuffer_append_func_ptr: funcPointer(C.w2_mBufferAppend), - mbuffer_append_bytes_func_ptr: funcPointer(C.w2_mBufferAppendBytes), - mbuffer_to_big_int_unsigned_func_ptr: funcPointer(C.w2_mBufferToBigIntUnsigned), - mbuffer_to_big_int_signed_func_ptr: funcPointer(C.w2_mBufferToBigIntSigned), - mbuffer_from_big_int_unsigned_func_ptr: funcPointer(C.w2_mBufferFromBigIntUnsigned), - mbuffer_from_big_int_signed_func_ptr: funcPointer(C.w2_mBufferFromBigIntSigned), - mbuffer_to_big_float_func_ptr: funcPointer(C.w2_mBufferToBigFloat), - mbuffer_from_big_float_func_ptr: funcPointer(C.w2_mBufferFromBigFloat), - mbuffer_storage_store_func_ptr: funcPointer(C.w2_mBufferStorageStore), - mbuffer_storage_load_func_ptr: funcPointer(C.w2_mBufferStorageLoad), - mbuffer_storage_load_from_address_func_ptr: funcPointer(C.w2_mBufferStorageLoadFromAddress), - mbuffer_get_argument_func_ptr: funcPointer(C.w2_mBufferGetArgument), - mbuffer_finish_func_ptr: funcPointer(C.w2_mBufferFinish), - mbuffer_set_random_func_ptr: funcPointer(C.w2_mBufferSetRandom), - managed_map_new_func_ptr: funcPointer(C.w2_managedMapNew), - managed_map_put_func_ptr: funcPointer(C.w2_managedMapPut), - managed_map_get_func_ptr: funcPointer(C.w2_managedMapGet), - managed_map_remove_func_ptr: funcPointer(C.w2_managedMapRemove), - managed_map_contains_func_ptr: funcPointer(C.w2_managedMapContains), - small_int_get_unsigned_argument_func_ptr: funcPointer(C.w2_smallIntGetUnsignedArgument), - small_int_get_signed_argument_func_ptr: funcPointer(C.w2_smallIntGetSignedArgument), - small_int_finish_unsigned_func_ptr: funcPointer(C.w2_smallIntFinishUnsigned), - small_int_finish_signed_func_ptr: funcPointer(C.w2_smallIntFinishSigned), - small_int_storage_store_unsigned_func_ptr: funcPointer(C.w2_smallIntStorageStoreUnsigned), - small_int_storage_store_signed_func_ptr: funcPointer(C.w2_smallIntStorageStoreSigned), - small_int_storage_load_unsigned_func_ptr: funcPointer(C.w2_smallIntStorageLoadUnsigned), - small_int_storage_load_signed_func_ptr: funcPointer(C.w2_smallIntStorageLoadSigned), - int64get_argument_func_ptr: funcPointer(C.w2_int64getArgument), - int64finish_func_ptr: funcPointer(C.w2_int64finish), - int64storage_store_func_ptr: funcPointer(C.w2_int64storageStore), - int64storage_load_func_ptr: funcPointer(C.w2_int64storageLoad), - sha256_func_ptr: funcPointer(C.w2_sha256), - managed_sha256_func_ptr: funcPointer(C.w2_managedSha256), - keccak256_func_ptr: funcPointer(C.w2_keccak256), - managed_keccak256_func_ptr: funcPointer(C.w2_managedKeccak256), - ripemd160_func_ptr: funcPointer(C.w2_ripemd160), - managed_ripemd160_func_ptr: funcPointer(C.w2_managedRipemd160), - verify_bls_func_ptr: funcPointer(C.w2_verifyBLS), - managed_verify_bls_func_ptr: funcPointer(C.w2_managedVerifyBLS), - verify_ed25519_func_ptr: funcPointer(C.w2_verifyEd25519), - managed_verify_ed25519_func_ptr: funcPointer(C.w2_managedVerifyEd25519), - verify_custom_secp256k1_func_ptr: funcPointer(C.w2_verifyCustomSecp256k1), - managed_verify_custom_secp256k1_func_ptr: funcPointer(C.w2_managedVerifyCustomSecp256k1), - verify_secp256k1_func_ptr: funcPointer(C.w2_verifySecp256k1), - managed_verify_secp256k1_func_ptr: funcPointer(C.w2_managedVerifySecp256k1), - encode_secp256k1_der_signature_func_ptr: funcPointer(C.w2_encodeSecp256k1DerSignature), - managed_encode_secp256k1_der_signature_func_ptr: funcPointer(C.w2_managedEncodeSecp256k1DerSignature), - add_ec_func_ptr: funcPointer(C.w2_addEC), - double_ec_func_ptr: funcPointer(C.w2_doubleEC), - is_on_curve_ec_func_ptr: funcPointer(C.w2_isOnCurveEC), - scalar_base_mult_ec_func_ptr: funcPointer(C.w2_scalarBaseMultEC), - managed_scalar_base_mult_ec_func_ptr: funcPointer(C.w2_managedScalarBaseMultEC), - scalar_mult_ec_func_ptr: funcPointer(C.w2_scalarMultEC), - managed_scalar_mult_ec_func_ptr: funcPointer(C.w2_managedScalarMultEC), - marshal_ec_func_ptr: funcPointer(C.w2_marshalEC), - managed_marshal_ec_func_ptr: funcPointer(C.w2_managedMarshalEC), - marshal_compressed_ec_func_ptr: funcPointer(C.w2_marshalCompressedEC), - managed_marshal_compressed_ec_func_ptr: funcPointer(C.w2_managedMarshalCompressedEC), - unmarshal_ec_func_ptr: funcPointer(C.w2_unmarshalEC), - managed_unmarshal_ec_func_ptr: funcPointer(C.w2_managedUnmarshalEC), - unmarshal_compressed_ec_func_ptr: funcPointer(C.w2_unmarshalCompressedEC), - managed_unmarshal_compressed_ec_func_ptr: funcPointer(C.w2_managedUnmarshalCompressedEC), - generate_key_ec_func_ptr: funcPointer(C.w2_generateKeyEC), - managed_generate_key_ec_func_ptr: funcPointer(C.w2_managedGenerateKeyEC), - create_ec_func_ptr: funcPointer(C.w2_createEC), - managed_create_ec_func_ptr: funcPointer(C.w2_managedCreateEC), - get_curve_length_ec_func_ptr: funcPointer(C.w2_getCurveLengthEC), - get_priv_key_byte_length_ec_func_ptr: funcPointer(C.w2_getPrivKeyByteLengthEC), - elliptic_curve_get_values_func_ptr: funcPointer(C.w2_ellipticCurveGetValues), + get_gas_left_func_ptr: funcPointer(C.w2_getGasLeft), + get_sc_address_func_ptr: funcPointer(C.w2_getSCAddress), + get_owner_address_func_ptr: funcPointer(C.w2_getOwnerAddress), + get_shard_of_address_func_ptr: funcPointer(C.w2_getShardOfAddress), + is_smart_contract_func_ptr: funcPointer(C.w2_isSmartContract), + signal_error_func_ptr: funcPointer(C.w2_signalError), + get_external_balance_func_ptr: funcPointer(C.w2_getExternalBalance), + get_block_hash_func_ptr: funcPointer(C.w2_getBlockHash), + get_esdt_balance_func_ptr: funcPointer(C.w2_getESDTBalance), + get_esdt_nft_name_length_func_ptr: funcPointer(C.w2_getESDTNFTNameLength), + get_esdt_nft_attribute_length_func_ptr: funcPointer(C.w2_getESDTNFTAttributeLength), + get_esdt_nft_uri_length_func_ptr: funcPointer(C.w2_getESDTNFTURILength), + get_esdt_token_data_func_ptr: funcPointer(C.w2_getESDTTokenData), + get_esdt_local_roles_func_ptr: funcPointer(C.w2_getESDTLocalRoles), + validate_token_identifier_func_ptr: funcPointer(C.w2_validateTokenIdentifier), + transfer_value_func_ptr: funcPointer(C.w2_transferValue), + transfer_value_execute_func_ptr: funcPointer(C.w2_transferValueExecute), + transfer_esdt_execute_func_ptr: funcPointer(C.w2_transferESDTExecute), + transfer_esdt_nft_execute_func_ptr: funcPointer(C.w2_transferESDTNFTExecute), + multi_transfer_esdt_nft_execute_func_ptr: funcPointer(C.w2_multiTransferESDTNFTExecute), + create_async_call_func_ptr: funcPointer(C.w2_createAsyncCall), + set_async_context_callback_func_ptr: funcPointer(C.w2_setAsyncContextCallback), + upgrade_contract_func_ptr: funcPointer(C.w2_upgradeContract), + upgrade_from_source_contract_func_ptr: funcPointer(C.w2_upgradeFromSourceContract), + delete_contract_func_ptr: funcPointer(C.w2_deleteContract), + async_call_func_ptr: funcPointer(C.w2_asyncCall), + get_argument_length_func_ptr: funcPointer(C.w2_getArgumentLength), + get_argument_func_ptr: funcPointer(C.w2_getArgument), + get_function_func_ptr: funcPointer(C.w2_getFunction), + get_num_arguments_func_ptr: funcPointer(C.w2_getNumArguments), + storage_store_func_ptr: funcPointer(C.w2_storageStore), + storage_load_length_func_ptr: funcPointer(C.w2_storageLoadLength), + storage_load_from_address_func_ptr: funcPointer(C.w2_storageLoadFromAddress), + storage_load_func_ptr: funcPointer(C.w2_storageLoad), + set_storage_lock_func_ptr: funcPointer(C.w2_setStorageLock), + get_storage_lock_func_ptr: funcPointer(C.w2_getStorageLock), + is_storage_locked_func_ptr: funcPointer(C.w2_isStorageLocked), + clear_storage_lock_func_ptr: funcPointer(C.w2_clearStorageLock), + get_caller_func_ptr: funcPointer(C.w2_getCaller), + check_no_payment_func_ptr: funcPointer(C.w2_checkNoPayment), + get_call_value_func_ptr: funcPointer(C.w2_getCallValue), + get_esdt_value_func_ptr: funcPointer(C.w2_getESDTValue), + get_esdt_value_by_index_func_ptr: funcPointer(C.w2_getESDTValueByIndex), + get_esdt_token_name_func_ptr: funcPointer(C.w2_getESDTTokenName), + get_esdt_token_name_by_index_func_ptr: funcPointer(C.w2_getESDTTokenNameByIndex), + get_esdt_token_nonce_func_ptr: funcPointer(C.w2_getESDTTokenNonce), + get_esdt_token_nonce_by_index_func_ptr: funcPointer(C.w2_getESDTTokenNonceByIndex), + get_current_esdt_nft_nonce_func_ptr: funcPointer(C.w2_getCurrentESDTNFTNonce), + get_esdt_token_type_func_ptr: funcPointer(C.w2_getESDTTokenType), + get_esdt_token_type_by_index_func_ptr: funcPointer(C.w2_getESDTTokenTypeByIndex), + get_num_esdt_transfers_func_ptr: funcPointer(C.w2_getNumESDTTransfers), + get_call_value_token_name_func_ptr: funcPointer(C.w2_getCallValueTokenName), + get_call_value_token_name_by_index_func_ptr: funcPointer(C.w2_getCallValueTokenNameByIndex), + is_reserved_function_name_func_ptr: funcPointer(C.w2_isReservedFunctionName), + write_log_func_ptr: funcPointer(C.w2_writeLog), + write_event_log_func_ptr: funcPointer(C.w2_writeEventLog), + get_block_timestamp_func_ptr: funcPointer(C.w2_getBlockTimestamp), + get_block_nonce_func_ptr: funcPointer(C.w2_getBlockNonce), + get_block_round_func_ptr: funcPointer(C.w2_getBlockRound), + get_block_epoch_func_ptr: funcPointer(C.w2_getBlockEpoch), + get_block_random_seed_func_ptr: funcPointer(C.w2_getBlockRandomSeed), + get_state_root_hash_func_ptr: funcPointer(C.w2_getStateRootHash), + get_prev_block_timestamp_func_ptr: funcPointer(C.w2_getPrevBlockTimestamp), + get_prev_block_nonce_func_ptr: funcPointer(C.w2_getPrevBlockNonce), + get_prev_block_round_func_ptr: funcPointer(C.w2_getPrevBlockRound), + get_prev_block_epoch_func_ptr: funcPointer(C.w2_getPrevBlockEpoch), + get_prev_block_random_seed_func_ptr: funcPointer(C.w2_getPrevBlockRandomSeed), + finish_func_ptr: funcPointer(C.w2_finish), + execute_on_same_context_func_ptr: funcPointer(C.w2_executeOnSameContext), + execute_on_dest_context_func_ptr: funcPointer(C.w2_executeOnDestContext), + execute_read_only_func_ptr: funcPointer(C.w2_executeReadOnly), + create_contract_func_ptr: funcPointer(C.w2_createContract), + deploy_from_source_contract_func_ptr: funcPointer(C.w2_deployFromSourceContract), + get_num_return_data_func_ptr: funcPointer(C.w2_getNumReturnData), + get_return_data_size_func_ptr: funcPointer(C.w2_getReturnDataSize), + get_return_data_func_ptr: funcPointer(C.w2_getReturnData), + clean_return_data_func_ptr: funcPointer(C.w2_cleanReturnData), + delete_from_return_data_func_ptr: funcPointer(C.w2_deleteFromReturnData), + get_original_tx_hash_func_ptr: funcPointer(C.w2_getOriginalTxHash), + get_current_tx_hash_func_ptr: funcPointer(C.w2_getCurrentTxHash), + get_prev_tx_hash_func_ptr: funcPointer(C.w2_getPrevTxHash), + managed_sc_address_func_ptr: funcPointer(C.w2_managedSCAddress), + managed_owner_address_func_ptr: funcPointer(C.w2_managedOwnerAddress), + managed_caller_func_ptr: funcPointer(C.w2_managedCaller), + managed_get_original_caller_addr_func_ptr: funcPointer(C.w2_managedGetOriginalCallerAddr), + managed_get_relayer_addr_func_ptr: funcPointer(C.w2_managedGetRelayerAddr), + managed_signal_error_func_ptr: funcPointer(C.w2_managedSignalError), + managed_write_log_func_ptr: funcPointer(C.w2_managedWriteLog), + managed_get_original_tx_hash_func_ptr: funcPointer(C.w2_managedGetOriginalTxHash), + managed_get_state_root_hash_func_ptr: funcPointer(C.w2_managedGetStateRootHash), + managed_get_block_random_seed_func_ptr: funcPointer(C.w2_managedGetBlockRandomSeed), + managed_get_prev_block_random_seed_func_ptr: funcPointer(C.w2_managedGetPrevBlockRandomSeed), + managed_get_return_data_func_ptr: funcPointer(C.w2_managedGetReturnData), + managed_get_multi_esdt_call_value_func_ptr: funcPointer(C.w2_managedGetMultiESDTCallValue), + managed_get_back_transfers_func_ptr: funcPointer(C.w2_managedGetBackTransfers), + managed_get_esdt_balance_func_ptr: funcPointer(C.w2_managedGetESDTBalance), + managed_get_esdt_token_data_func_ptr: funcPointer(C.w2_managedGetESDTTokenData), + managed_async_call_func_ptr: funcPointer(C.w2_managedAsyncCall), + managed_create_async_call_func_ptr: funcPointer(C.w2_managedCreateAsyncCall), + managed_get_callback_closure_func_ptr: funcPointer(C.w2_managedGetCallbackClosure), + managed_upgrade_from_source_contract_func_ptr: funcPointer(C.w2_managedUpgradeFromSourceContract), + managed_upgrade_contract_func_ptr: funcPointer(C.w2_managedUpgradeContract), + managed_delete_contract_func_ptr: funcPointer(C.w2_managedDeleteContract), + managed_deploy_from_source_contract_func_ptr: funcPointer(C.w2_managedDeployFromSourceContract), + managed_create_contract_func_ptr: funcPointer(C.w2_managedCreateContract), + managed_execute_read_only_func_ptr: funcPointer(C.w2_managedExecuteReadOnly), + managed_execute_on_same_context_func_ptr: funcPointer(C.w2_managedExecuteOnSameContext), + managed_execute_on_dest_context_func_ptr: funcPointer(C.w2_managedExecuteOnDestContext), + managed_multi_transfer_esdt_nft_execute_func_ptr: funcPointer(C.w2_managedMultiTransferESDTNFTExecute), + managed_multi_transfer_esdt_nft_execute_by_user_func_ptr: funcPointer(C.w2_managedMultiTransferESDTNFTExecuteByUser), + managed_transfer_value_execute_func_ptr: funcPointer(C.w2_managedTransferValueExecute), + managed_is_esdt_frozen_func_ptr: funcPointer(C.w2_managedIsESDTFrozen), + managed_is_esdt_limited_transfer_func_ptr: funcPointer(C.w2_managedIsESDTLimitedTransfer), + managed_is_esdt_paused_func_ptr: funcPointer(C.w2_managedIsESDTPaused), + managed_buffer_to_hex_func_ptr: funcPointer(C.w2_managedBufferToHex), + managed_get_code_metadata_func_ptr: funcPointer(C.w2_managedGetCodeMetadata), + managed_is_builtin_function_func_ptr: funcPointer(C.w2_managedIsBuiltinFunction), + big_float_new_from_parts_func_ptr: funcPointer(C.w2_bigFloatNewFromParts), + big_float_new_from_frac_func_ptr: funcPointer(C.w2_bigFloatNewFromFrac), + big_float_new_from_sci_func_ptr: funcPointer(C.w2_bigFloatNewFromSci), + big_float_add_func_ptr: funcPointer(C.w2_bigFloatAdd), + big_float_sub_func_ptr: funcPointer(C.w2_bigFloatSub), + big_float_mul_func_ptr: funcPointer(C.w2_bigFloatMul), + big_float_div_func_ptr: funcPointer(C.w2_bigFloatDiv), + big_float_neg_func_ptr: funcPointer(C.w2_bigFloatNeg), + big_float_clone_func_ptr: funcPointer(C.w2_bigFloatClone), + big_float_cmp_func_ptr: funcPointer(C.w2_bigFloatCmp), + big_float_abs_func_ptr: funcPointer(C.w2_bigFloatAbs), + big_float_sign_func_ptr: funcPointer(C.w2_bigFloatSign), + big_float_sqrt_func_ptr: funcPointer(C.w2_bigFloatSqrt), + big_float_pow_func_ptr: funcPointer(C.w2_bigFloatPow), + big_float_floor_func_ptr: funcPointer(C.w2_bigFloatFloor), + big_float_ceil_func_ptr: funcPointer(C.w2_bigFloatCeil), + big_float_truncate_func_ptr: funcPointer(C.w2_bigFloatTruncate), + big_float_set_int64_func_ptr: funcPointer(C.w2_bigFloatSetInt64), + big_float_is_int_func_ptr: funcPointer(C.w2_bigFloatIsInt), + big_float_set_big_int_func_ptr: funcPointer(C.w2_bigFloatSetBigInt), + big_float_get_const_pi_func_ptr: funcPointer(C.w2_bigFloatGetConstPi), + big_float_get_const_e_func_ptr: funcPointer(C.w2_bigFloatGetConstE), + big_int_get_unsigned_argument_func_ptr: funcPointer(C.w2_bigIntGetUnsignedArgument), + big_int_get_signed_argument_func_ptr: funcPointer(C.w2_bigIntGetSignedArgument), + big_int_storage_store_unsigned_func_ptr: funcPointer(C.w2_bigIntStorageStoreUnsigned), + big_int_storage_load_unsigned_func_ptr: funcPointer(C.w2_bigIntStorageLoadUnsigned), + big_int_get_call_value_func_ptr: funcPointer(C.w2_bigIntGetCallValue), + big_int_get_esdt_call_value_func_ptr: funcPointer(C.w2_bigIntGetESDTCallValue), + big_int_get_esdt_call_value_by_index_func_ptr: funcPointer(C.w2_bigIntGetESDTCallValueByIndex), + big_int_get_external_balance_func_ptr: funcPointer(C.w2_bigIntGetExternalBalance), + big_int_get_esdt_external_balance_func_ptr: funcPointer(C.w2_bigIntGetESDTExternalBalance), + big_int_new_func_ptr: funcPointer(C.w2_bigIntNew), + big_int_unsigned_byte_length_func_ptr: funcPointer(C.w2_bigIntUnsignedByteLength), + big_int_signed_byte_length_func_ptr: funcPointer(C.w2_bigIntSignedByteLength), + big_int_get_unsigned_bytes_func_ptr: funcPointer(C.w2_bigIntGetUnsignedBytes), + big_int_get_signed_bytes_func_ptr: funcPointer(C.w2_bigIntGetSignedBytes), + big_int_set_unsigned_bytes_func_ptr: funcPointer(C.w2_bigIntSetUnsignedBytes), + big_int_set_signed_bytes_func_ptr: funcPointer(C.w2_bigIntSetSignedBytes), + big_int_is_int64_func_ptr: funcPointer(C.w2_bigIntIsInt64), + big_int_get_int64_func_ptr: funcPointer(C.w2_bigIntGetInt64), + big_int_set_int64_func_ptr: funcPointer(C.w2_bigIntSetInt64), + big_int_add_func_ptr: funcPointer(C.w2_bigIntAdd), + big_int_sub_func_ptr: funcPointer(C.w2_bigIntSub), + big_int_mul_func_ptr: funcPointer(C.w2_bigIntMul), + big_int_tdiv_func_ptr: funcPointer(C.w2_bigIntTDiv), + big_int_tmod_func_ptr: funcPointer(C.w2_bigIntTMod), + big_int_ediv_func_ptr: funcPointer(C.w2_bigIntEDiv), + big_int_emod_func_ptr: funcPointer(C.w2_bigIntEMod), + big_int_sqrt_func_ptr: funcPointer(C.w2_bigIntSqrt), + big_int_pow_func_ptr: funcPointer(C.w2_bigIntPow), + big_int_log2_func_ptr: funcPointer(C.w2_bigIntLog2), + big_int_abs_func_ptr: funcPointer(C.w2_bigIntAbs), + big_int_neg_func_ptr: funcPointer(C.w2_bigIntNeg), + big_int_sign_func_ptr: funcPointer(C.w2_bigIntSign), + big_int_cmp_func_ptr: funcPointer(C.w2_bigIntCmp), + big_int_not_func_ptr: funcPointer(C.w2_bigIntNot), + big_int_and_func_ptr: funcPointer(C.w2_bigIntAnd), + big_int_or_func_ptr: funcPointer(C.w2_bigIntOr), + big_int_xor_func_ptr: funcPointer(C.w2_bigIntXor), + big_int_shr_func_ptr: funcPointer(C.w2_bigIntShr), + big_int_shl_func_ptr: funcPointer(C.w2_bigIntShl), + big_int_finish_unsigned_func_ptr: funcPointer(C.w2_bigIntFinishUnsigned), + big_int_finish_signed_func_ptr: funcPointer(C.w2_bigIntFinishSigned), + big_int_to_string_func_ptr: funcPointer(C.w2_bigIntToString), + mbuffer_new_func_ptr: funcPointer(C.w2_mBufferNew), + mbuffer_new_from_bytes_func_ptr: funcPointer(C.w2_mBufferNewFromBytes), + mbuffer_get_length_func_ptr: funcPointer(C.w2_mBufferGetLength), + mbuffer_get_bytes_func_ptr: funcPointer(C.w2_mBufferGetBytes), + mbuffer_get_byte_slice_func_ptr: funcPointer(C.w2_mBufferGetByteSlice), + mbuffer_copy_byte_slice_func_ptr: funcPointer(C.w2_mBufferCopyByteSlice), + mbuffer_eq_func_ptr: funcPointer(C.w2_mBufferEq), + mbuffer_set_bytes_func_ptr: funcPointer(C.w2_mBufferSetBytes), + mbuffer_set_byte_slice_func_ptr: funcPointer(C.w2_mBufferSetByteSlice), + mbuffer_append_func_ptr: funcPointer(C.w2_mBufferAppend), + mbuffer_append_bytes_func_ptr: funcPointer(C.w2_mBufferAppendBytes), + mbuffer_to_big_int_unsigned_func_ptr: funcPointer(C.w2_mBufferToBigIntUnsigned), + mbuffer_to_big_int_signed_func_ptr: funcPointer(C.w2_mBufferToBigIntSigned), + mbuffer_from_big_int_unsigned_func_ptr: funcPointer(C.w2_mBufferFromBigIntUnsigned), + mbuffer_from_big_int_signed_func_ptr: funcPointer(C.w2_mBufferFromBigIntSigned), + mbuffer_to_big_float_func_ptr: funcPointer(C.w2_mBufferToBigFloat), + mbuffer_from_big_float_func_ptr: funcPointer(C.w2_mBufferFromBigFloat), + mbuffer_storage_store_func_ptr: funcPointer(C.w2_mBufferStorageStore), + mbuffer_storage_load_func_ptr: funcPointer(C.w2_mBufferStorageLoad), + mbuffer_storage_load_from_address_func_ptr: funcPointer(C.w2_mBufferStorageLoadFromAddress), + mbuffer_get_argument_func_ptr: funcPointer(C.w2_mBufferGetArgument), + mbuffer_finish_func_ptr: funcPointer(C.w2_mBufferFinish), + mbuffer_set_random_func_ptr: funcPointer(C.w2_mBufferSetRandom), + managed_map_new_func_ptr: funcPointer(C.w2_managedMapNew), + managed_map_put_func_ptr: funcPointer(C.w2_managedMapPut), + managed_map_get_func_ptr: funcPointer(C.w2_managedMapGet), + managed_map_remove_func_ptr: funcPointer(C.w2_managedMapRemove), + managed_map_contains_func_ptr: funcPointer(C.w2_managedMapContains), + small_int_get_unsigned_argument_func_ptr: funcPointer(C.w2_smallIntGetUnsignedArgument), + small_int_get_signed_argument_func_ptr: funcPointer(C.w2_smallIntGetSignedArgument), + small_int_finish_unsigned_func_ptr: funcPointer(C.w2_smallIntFinishUnsigned), + small_int_finish_signed_func_ptr: funcPointer(C.w2_smallIntFinishSigned), + small_int_storage_store_unsigned_func_ptr: funcPointer(C.w2_smallIntStorageStoreUnsigned), + small_int_storage_store_signed_func_ptr: funcPointer(C.w2_smallIntStorageStoreSigned), + small_int_storage_load_unsigned_func_ptr: funcPointer(C.w2_smallIntStorageLoadUnsigned), + small_int_storage_load_signed_func_ptr: funcPointer(C.w2_smallIntStorageLoadSigned), + int64get_argument_func_ptr: funcPointer(C.w2_int64getArgument), + int64finish_func_ptr: funcPointer(C.w2_int64finish), + int64storage_store_func_ptr: funcPointer(C.w2_int64storageStore), + int64storage_load_func_ptr: funcPointer(C.w2_int64storageLoad), + sha256_func_ptr: funcPointer(C.w2_sha256), + managed_sha256_func_ptr: funcPointer(C.w2_managedSha256), + keccak256_func_ptr: funcPointer(C.w2_keccak256), + managed_keccak256_func_ptr: funcPointer(C.w2_managedKeccak256), + ripemd160_func_ptr: funcPointer(C.w2_ripemd160), + managed_ripemd160_func_ptr: funcPointer(C.w2_managedRipemd160), + verify_bls_func_ptr: funcPointer(C.w2_verifyBLS), + managed_verify_bls_func_ptr: funcPointer(C.w2_managedVerifyBLS), + verify_ed25519_func_ptr: funcPointer(C.w2_verifyEd25519), + managed_verify_ed25519_func_ptr: funcPointer(C.w2_managedVerifyEd25519), + verify_custom_secp256k1_func_ptr: funcPointer(C.w2_verifyCustomSecp256k1), + managed_verify_custom_secp256k1_func_ptr: funcPointer(C.w2_managedVerifyCustomSecp256k1), + verify_secp256k1_func_ptr: funcPointer(C.w2_verifySecp256k1), + managed_verify_secp256k1_func_ptr: funcPointer(C.w2_managedVerifySecp256k1), + encode_secp256k1_der_signature_func_ptr: funcPointer(C.w2_encodeSecp256k1DerSignature), + managed_encode_secp256k1_der_signature_func_ptr: funcPointer(C.w2_managedEncodeSecp256k1DerSignature), + add_ec_func_ptr: funcPointer(C.w2_addEC), + double_ec_func_ptr: funcPointer(C.w2_doubleEC), + is_on_curve_ec_func_ptr: funcPointer(C.w2_isOnCurveEC), + scalar_base_mult_ec_func_ptr: funcPointer(C.w2_scalarBaseMultEC), + managed_scalar_base_mult_ec_func_ptr: funcPointer(C.w2_managedScalarBaseMultEC), + scalar_mult_ec_func_ptr: funcPointer(C.w2_scalarMultEC), + managed_scalar_mult_ec_func_ptr: funcPointer(C.w2_managedScalarMultEC), + marshal_ec_func_ptr: funcPointer(C.w2_marshalEC), + managed_marshal_ec_func_ptr: funcPointer(C.w2_managedMarshalEC), + marshal_compressed_ec_func_ptr: funcPointer(C.w2_marshalCompressedEC), + managed_marshal_compressed_ec_func_ptr: funcPointer(C.w2_managedMarshalCompressedEC), + unmarshal_ec_func_ptr: funcPointer(C.w2_unmarshalEC), + managed_unmarshal_ec_func_ptr: funcPointer(C.w2_managedUnmarshalEC), + unmarshal_compressed_ec_func_ptr: funcPointer(C.w2_unmarshalCompressedEC), + managed_unmarshal_compressed_ec_func_ptr: funcPointer(C.w2_managedUnmarshalCompressedEC), + generate_key_ec_func_ptr: funcPointer(C.w2_generateKeyEC), + managed_generate_key_ec_func_ptr: funcPointer(C.w2_managedGenerateKeyEC), + create_ec_func_ptr: funcPointer(C.w2_createEC), + managed_create_ec_func_ptr: funcPointer(C.w2_managedCreateEC), + get_curve_length_ec_func_ptr: funcPointer(C.w2_getCurveLengthEC), + get_priv_key_byte_length_ec_func_ptr: funcPointer(C.w2_getPrivKeyByteLengthEC), + elliptic_curve_get_values_func_ptr: funcPointer(C.w2_ellipticCurveGetValues), + managed_verify_secp256r1_func_ptr: funcPointer(C.w2_managedVerifySecp256r1), + managed_verify_blssignature_share_func_ptr: funcPointer(C.w2_managedVerifyBLSSignatureShare), + managed_verify_blsaggregated_signature_func_ptr: funcPointer(C.w2_managedVerifyBLSAggregatedSignature), } } @@ -853,6 +867,12 @@ func w2_getCallValueTokenNameByIndex(context unsafe.Pointer, callValueOffset int return vmHooks.GetCallValueTokenNameByIndex(executor.MemPtr(callValueOffset), executor.MemPtr(tokenNameOffset), index) } +//export w2_isReservedFunctionName +func w2_isReservedFunctionName(context unsafe.Pointer, nameHandle int32) int32 { + vmHooks := getVMHooksFromContextRawPtr(context) + return vmHooks.IsReservedFunctionName(nameHandle) +} + //export w2_writeLog func w2_writeLog(context unsafe.Pointer, dataPointer int32, dataLength int32, topicPtr int32, numTopics int32) { vmHooks := getVMHooksFromContextRawPtr(context) @@ -1033,6 +1053,18 @@ func w2_managedCaller(context unsafe.Pointer, destinationHandle int32) { vmHooks.ManagedCaller(destinationHandle) } +//export w2_managedGetOriginalCallerAddr +func w2_managedGetOriginalCallerAddr(context unsafe.Pointer, destinationHandle int32) { + vmHooks := getVMHooksFromContextRawPtr(context) + vmHooks.ManagedGetOriginalCallerAddr(destinationHandle) +} + +//export w2_managedGetRelayerAddr +func w2_managedGetRelayerAddr(context unsafe.Pointer, destinationHandle int32) { + vmHooks := getVMHooksFromContextRawPtr(context) + vmHooks.ManagedGetRelayerAddr(destinationHandle) +} + //export w2_managedSignalError func w2_managedSignalError(context unsafe.Pointer, errHandle int32) { vmHooks := getVMHooksFromContextRawPtr(context) @@ -1082,9 +1114,9 @@ func w2_managedGetMultiESDTCallValue(context unsafe.Pointer, multiCallValueHandl } //export w2_managedGetBackTransfers -func w2_managedGetBackTransfers(context unsafe.Pointer, esdtTransfersValueHandle int32, callValueHandle int32) { +func w2_managedGetBackTransfers(context unsafe.Pointer, esdtTransfersValueHandle int32, egldValueHandle int32) { vmHooks := getVMHooksFromContextRawPtr(context) - vmHooks.ManagedGetBackTransfers(esdtTransfersValueHandle, callValueHandle) + vmHooks.ManagedGetBackTransfers(esdtTransfersValueHandle, egldValueHandle) } //export w2_managedGetESDTBalance @@ -1171,6 +1203,12 @@ func w2_managedMultiTransferESDTNFTExecute(context unsafe.Pointer, dstHandle int return vmHooks.ManagedMultiTransferESDTNFTExecute(dstHandle, tokenTransfersHandle, gasLimit, functionHandle, argumentsHandle) } +//export w2_managedMultiTransferESDTNFTExecuteByUser +func w2_managedMultiTransferESDTNFTExecuteByUser(context unsafe.Pointer, userHandle int32, dstHandle int32, tokenTransfersHandle int32, gasLimit int64, functionHandle int32, argumentsHandle int32) int32 { + vmHooks := getVMHooksFromContextRawPtr(context) + return vmHooks.ManagedMultiTransferESDTNFTExecuteByUser(userHandle, dstHandle, tokenTransfersHandle, gasLimit, functionHandle, argumentsHandle) +} + //export w2_managedTransferValueExecute func w2_managedTransferValueExecute(context unsafe.Pointer, dstHandle int32, valueHandle int32, gasLimit int64, functionHandle int32, argumentsHandle int32) int32 { vmHooks := getVMHooksFromContextRawPtr(context) @@ -2064,3 +2102,21 @@ func w2_ellipticCurveGetValues(context unsafe.Pointer, ecHandle int32, fieldOrde vmHooks := getVMHooksFromContextRawPtr(context) return vmHooks.EllipticCurveGetValues(ecHandle, fieldOrderHandle, basePointOrderHandle, eqConstantHandle, xBasePointHandle, yBasePointHandle) } + +//export w2_managedVerifySecp256r1 +func w2_managedVerifySecp256r1(context unsafe.Pointer, keyHandle int32, messageHandle int32, sigHandle int32) int32 { + vmHooks := getVMHooksFromContextRawPtr(context) + return vmHooks.ManagedVerifySecp256r1(keyHandle, messageHandle, sigHandle) +} + +//export w2_managedVerifyBLSSignatureShare +func w2_managedVerifyBLSSignatureShare(context unsafe.Pointer, keyHandle int32, messageHandle int32, sigHandle int32) int32 { + vmHooks := getVMHooksFromContextRawPtr(context) + return vmHooks.ManagedVerifyBLSSignatureShare(keyHandle, messageHandle, sigHandle) +} + +//export w2_managedVerifyBLSAggregatedSignature +func w2_managedVerifyBLSAggregatedSignature(context unsafe.Pointer, keyHandle int32, messageHandle int32, sigHandle int32) int32 { + vmHooks := getVMHooksFromContextRawPtr(context) + return vmHooks.ManagedVerifyBLSAggregatedSignature(keyHandle, messageHandle, sigHandle) +} diff --git a/wasmer2/wasmer2Names.go b/wasmer2/wasmer2Names.go index 7fa7c4d0b..501383d0c 100644 --- a/wasmer2/wasmer2Names.go +++ b/wasmer2/wasmer2Names.go @@ -9,259 +9,266 @@ package wasmer2 var empty struct{} var functionNames = map[string]struct{}{ - "getGasLeft": empty, - "getSCAddress": empty, - "getOwnerAddress": empty, - "getShardOfAddress": empty, - "isSmartContract": empty, - "signalError": empty, - "getExternalBalance": empty, - "getBlockHash": empty, - "getESDTBalance": empty, - "getESDTNFTNameLength": empty, - "getESDTNFTAttributeLength": empty, - "getESDTNFTURILength": empty, - "getESDTTokenData": empty, - "getESDTLocalRoles": empty, - "validateTokenIdentifier": empty, - "transferValue": empty, - "transferValueExecute": empty, - "transferESDTExecute": empty, - "transferESDTNFTExecute": empty, - "multiTransferESDTNFTExecute": empty, - "createAsyncCall": empty, - "setAsyncContextCallback": empty, - "upgradeContract": empty, - "upgradeFromSourceContract": empty, - "deleteContract": empty, - "asyncCall": empty, - "getArgumentLength": empty, - "getArgument": empty, - "getFunction": empty, - "getNumArguments": empty, - "storageStore": empty, - "storageLoadLength": empty, - "storageLoadFromAddress": empty, - "storageLoad": empty, - "setStorageLock": empty, - "getStorageLock": empty, - "isStorageLocked": empty, - "clearStorageLock": empty, - "getCaller": empty, - "checkNoPayment": empty, - "getCallValue": empty, - "getESDTValue": empty, - "getESDTValueByIndex": empty, - "getESDTTokenName": empty, - "getESDTTokenNameByIndex": empty, - "getESDTTokenNonce": empty, - "getESDTTokenNonceByIndex": empty, - "getCurrentESDTNFTNonce": empty, - "getESDTTokenType": empty, - "getESDTTokenTypeByIndex": empty, - "getNumESDTTransfers": empty, - "getCallValueTokenName": empty, - "getCallValueTokenNameByIndex": empty, - "writeLog": empty, - "writeEventLog": empty, - "getBlockTimestamp": empty, - "getBlockNonce": empty, - "getBlockRound": empty, - "getBlockEpoch": empty, - "getBlockRandomSeed": empty, - "getStateRootHash": empty, - "getPrevBlockTimestamp": empty, - "getPrevBlockNonce": empty, - "getPrevBlockRound": empty, - "getPrevBlockEpoch": empty, - "getPrevBlockRandomSeed": empty, - "finish": empty, - "executeOnSameContext": empty, - "executeOnDestContext": empty, - "executeReadOnly": empty, - "createContract": empty, - "deployFromSourceContract": empty, - "getNumReturnData": empty, - "getReturnDataSize": empty, - "getReturnData": empty, - "cleanReturnData": empty, - "deleteFromReturnData": empty, - "getOriginalTxHash": empty, - "getCurrentTxHash": empty, - "getPrevTxHash": empty, - "managedSCAddress": empty, - "managedOwnerAddress": empty, - "managedCaller": empty, - "managedSignalError": empty, - "managedWriteLog": empty, - "managedGetOriginalTxHash": empty, - "managedGetStateRootHash": empty, - "managedGetBlockRandomSeed": empty, - "managedGetPrevBlockRandomSeed": empty, - "managedGetReturnData": empty, - "managedGetMultiESDTCallValue": empty, - "managedGetBackTransfers": empty, - "managedGetESDTBalance": empty, - "managedGetESDTTokenData": empty, - "managedAsyncCall": empty, - "managedCreateAsyncCall": empty, - "managedGetCallbackClosure": empty, - "managedUpgradeFromSourceContract": empty, - "managedUpgradeContract": empty, - "managedDeleteContract": empty, - "managedDeployFromSourceContract": empty, - "managedCreateContract": empty, - "managedExecuteReadOnly": empty, - "managedExecuteOnSameContext": empty, - "managedExecuteOnDestContext": empty, - "managedMultiTransferESDTNFTExecute": empty, - "managedTransferValueExecute": empty, - "managedIsESDTFrozen": empty, - "managedIsESDTLimitedTransfer": empty, - "managedIsESDTPaused": empty, - "managedBufferToHex": empty, - "managedGetCodeMetadata": empty, - "managedIsBuiltinFunction": empty, - "bigFloatNewFromParts": empty, - "bigFloatNewFromFrac": empty, - "bigFloatNewFromSci": empty, - "bigFloatAdd": empty, - "bigFloatSub": empty, - "bigFloatMul": empty, - "bigFloatDiv": empty, - "bigFloatNeg": empty, - "bigFloatClone": empty, - "bigFloatCmp": empty, - "bigFloatAbs": empty, - "bigFloatSign": empty, - "bigFloatSqrt": empty, - "bigFloatPow": empty, - "bigFloatFloor": empty, - "bigFloatCeil": empty, - "bigFloatTruncate": empty, - "bigFloatSetInt64": empty, - "bigFloatIsInt": empty, - "bigFloatSetBigInt": empty, - "bigFloatGetConstPi": empty, - "bigFloatGetConstE": empty, - "bigIntGetUnsignedArgument": empty, - "bigIntGetSignedArgument": empty, - "bigIntStorageStoreUnsigned": empty, - "bigIntStorageLoadUnsigned": empty, - "bigIntGetCallValue": empty, - "bigIntGetESDTCallValue": empty, - "bigIntGetESDTCallValueByIndex": empty, - "bigIntGetExternalBalance": empty, - "bigIntGetESDTExternalBalance": empty, - "bigIntNew": empty, - "bigIntUnsignedByteLength": empty, - "bigIntSignedByteLength": empty, - "bigIntGetUnsignedBytes": empty, - "bigIntGetSignedBytes": empty, - "bigIntSetUnsignedBytes": empty, - "bigIntSetSignedBytes": empty, - "bigIntIsInt64": empty, - "bigIntGetInt64": empty, - "bigIntSetInt64": empty, - "bigIntAdd": empty, - "bigIntSub": empty, - "bigIntMul": empty, - "bigIntTDiv": empty, - "bigIntTMod": empty, - "bigIntEDiv": empty, - "bigIntEMod": empty, - "bigIntSqrt": empty, - "bigIntPow": empty, - "bigIntLog2": empty, - "bigIntAbs": empty, - "bigIntNeg": empty, - "bigIntSign": empty, - "bigIntCmp": empty, - "bigIntNot": empty, - "bigIntAnd": empty, - "bigIntOr": empty, - "bigIntXor": empty, - "bigIntShr": empty, - "bigIntShl": empty, - "bigIntFinishUnsigned": empty, - "bigIntFinishSigned": empty, - "bigIntToString": empty, - "mBufferNew": empty, - "mBufferNewFromBytes": empty, - "mBufferGetLength": empty, - "mBufferGetBytes": empty, - "mBufferGetByteSlice": empty, - "mBufferCopyByteSlice": empty, - "mBufferEq": empty, - "mBufferSetBytes": empty, - "mBufferSetByteSlice": empty, - "mBufferAppend": empty, - "mBufferAppendBytes": empty, - "mBufferToBigIntUnsigned": empty, - "mBufferToBigIntSigned": empty, - "mBufferFromBigIntUnsigned": empty, - "mBufferFromBigIntSigned": empty, - "mBufferToBigFloat": empty, - "mBufferFromBigFloat": empty, - "mBufferStorageStore": empty, - "mBufferStorageLoad": empty, - "mBufferStorageLoadFromAddress": empty, - "mBufferGetArgument": empty, - "mBufferFinish": empty, - "mBufferSetRandom": empty, - "managedMapNew": empty, - "managedMapPut": empty, - "managedMapGet": empty, - "managedMapRemove": empty, - "managedMapContains": empty, - "smallIntGetUnsignedArgument": empty, - "smallIntGetSignedArgument": empty, - "smallIntFinishUnsigned": empty, - "smallIntFinishSigned": empty, - "smallIntStorageStoreUnsigned": empty, - "smallIntStorageStoreSigned": empty, - "smallIntStorageLoadUnsigned": empty, - "smallIntStorageLoadSigned": empty, - "int64getArgument": empty, - "int64finish": empty, - "int64storageStore": empty, - "int64storageLoad": empty, - "sha256": empty, - "managedSha256": empty, - "keccak256": empty, - "managedKeccak256": empty, - "ripemd160": empty, - "managedRipemd160": empty, - "verifyBLS": empty, - "managedVerifyBLS": empty, - "verifyEd25519": empty, - "managedVerifyEd25519": empty, - "verifyCustomSecp256k1": empty, - "managedVerifyCustomSecp256k1": empty, - "verifySecp256k1": empty, - "managedVerifySecp256k1": empty, - "encodeSecp256k1DerSignature": empty, - "managedEncodeSecp256k1DerSignature": empty, - "addEC": empty, - "doubleEC": empty, - "isOnCurveEC": empty, - "scalarBaseMultEC": empty, - "managedScalarBaseMultEC": empty, - "scalarMultEC": empty, - "managedScalarMultEC": empty, - "marshalEC": empty, - "managedMarshalEC": empty, - "marshalCompressedEC": empty, - "managedMarshalCompressedEC": empty, - "unmarshalEC": empty, - "managedUnmarshalEC": empty, - "unmarshalCompressedEC": empty, - "managedUnmarshalCompressedEC": empty, - "generateKeyEC": empty, - "managedGenerateKeyEC": empty, - "createEC": empty, - "managedCreateEC": empty, - "getCurveLengthEC": empty, - "getPrivKeyByteLengthEC": empty, - "ellipticCurveGetValues": empty, + "getGasLeft": empty, + "getSCAddress": empty, + "getOwnerAddress": empty, + "getShardOfAddress": empty, + "isSmartContract": empty, + "signalError": empty, + "getExternalBalance": empty, + "getBlockHash": empty, + "getESDTBalance": empty, + "getESDTNFTNameLength": empty, + "getESDTNFTAttributeLength": empty, + "getESDTNFTURILength": empty, + "getESDTTokenData": empty, + "getESDTLocalRoles": empty, + "validateTokenIdentifier": empty, + "transferValue": empty, + "transferValueExecute": empty, + "transferESDTExecute": empty, + "transferESDTNFTExecute": empty, + "multiTransferESDTNFTExecute": empty, + "createAsyncCall": empty, + "setAsyncContextCallback": empty, + "upgradeContract": empty, + "upgradeFromSourceContract": empty, + "deleteContract": empty, + "asyncCall": empty, + "getArgumentLength": empty, + "getArgument": empty, + "getFunction": empty, + "getNumArguments": empty, + "storageStore": empty, + "storageLoadLength": empty, + "storageLoadFromAddress": empty, + "storageLoad": empty, + "setStorageLock": empty, + "getStorageLock": empty, + "isStorageLocked": empty, + "clearStorageLock": empty, + "getCaller": empty, + "checkNoPayment": empty, + "getCallValue": empty, + "getESDTValue": empty, + "getESDTValueByIndex": empty, + "getESDTTokenName": empty, + "getESDTTokenNameByIndex": empty, + "getESDTTokenNonce": empty, + "getESDTTokenNonceByIndex": empty, + "getCurrentESDTNFTNonce": empty, + "getESDTTokenType": empty, + "getESDTTokenTypeByIndex": empty, + "getNumESDTTransfers": empty, + "getCallValueTokenName": empty, + "getCallValueTokenNameByIndex": empty, + "isReservedFunctionName": empty, + "writeLog": empty, + "writeEventLog": empty, + "getBlockTimestamp": empty, + "getBlockNonce": empty, + "getBlockRound": empty, + "getBlockEpoch": empty, + "getBlockRandomSeed": empty, + "getStateRootHash": empty, + "getPrevBlockTimestamp": empty, + "getPrevBlockNonce": empty, + "getPrevBlockRound": empty, + "getPrevBlockEpoch": empty, + "getPrevBlockRandomSeed": empty, + "finish": empty, + "executeOnSameContext": empty, + "executeOnDestContext": empty, + "executeReadOnly": empty, + "createContract": empty, + "deployFromSourceContract": empty, + "getNumReturnData": empty, + "getReturnDataSize": empty, + "getReturnData": empty, + "cleanReturnData": empty, + "deleteFromReturnData": empty, + "getOriginalTxHash": empty, + "getCurrentTxHash": empty, + "getPrevTxHash": empty, + "managedSCAddress": empty, + "managedOwnerAddress": empty, + "managedCaller": empty, + "managedGetOriginalCallerAddr": empty, + "managedGetRelayerAddr": empty, + "managedSignalError": empty, + "managedWriteLog": empty, + "managedGetOriginalTxHash": empty, + "managedGetStateRootHash": empty, + "managedGetBlockRandomSeed": empty, + "managedGetPrevBlockRandomSeed": empty, + "managedGetReturnData": empty, + "managedGetMultiESDTCallValue": empty, + "managedGetBackTransfers": empty, + "managedGetESDTBalance": empty, + "managedGetESDTTokenData": empty, + "managedAsyncCall": empty, + "managedCreateAsyncCall": empty, + "managedGetCallbackClosure": empty, + "managedUpgradeFromSourceContract": empty, + "managedUpgradeContract": empty, + "managedDeleteContract": empty, + "managedDeployFromSourceContract": empty, + "managedCreateContract": empty, + "managedExecuteReadOnly": empty, + "managedExecuteOnSameContext": empty, + "managedExecuteOnDestContext": empty, + "managedMultiTransferESDTNFTExecute": empty, + "managedMultiTransferESDTNFTExecuteByUser": empty, + "managedTransferValueExecute": empty, + "managedIsESDTFrozen": empty, + "managedIsESDTLimitedTransfer": empty, + "managedIsESDTPaused": empty, + "managedBufferToHex": empty, + "managedGetCodeMetadata": empty, + "managedIsBuiltinFunction": empty, + "bigFloatNewFromParts": empty, + "bigFloatNewFromFrac": empty, + "bigFloatNewFromSci": empty, + "bigFloatAdd": empty, + "bigFloatSub": empty, + "bigFloatMul": empty, + "bigFloatDiv": empty, + "bigFloatNeg": empty, + "bigFloatClone": empty, + "bigFloatCmp": empty, + "bigFloatAbs": empty, + "bigFloatSign": empty, + "bigFloatSqrt": empty, + "bigFloatPow": empty, + "bigFloatFloor": empty, + "bigFloatCeil": empty, + "bigFloatTruncate": empty, + "bigFloatSetInt64": empty, + "bigFloatIsInt": empty, + "bigFloatSetBigInt": empty, + "bigFloatGetConstPi": empty, + "bigFloatGetConstE": empty, + "bigIntGetUnsignedArgument": empty, + "bigIntGetSignedArgument": empty, + "bigIntStorageStoreUnsigned": empty, + "bigIntStorageLoadUnsigned": empty, + "bigIntGetCallValue": empty, + "bigIntGetESDTCallValue": empty, + "bigIntGetESDTCallValueByIndex": empty, + "bigIntGetExternalBalance": empty, + "bigIntGetESDTExternalBalance": empty, + "bigIntNew": empty, + "bigIntUnsignedByteLength": empty, + "bigIntSignedByteLength": empty, + "bigIntGetUnsignedBytes": empty, + "bigIntGetSignedBytes": empty, + "bigIntSetUnsignedBytes": empty, + "bigIntSetSignedBytes": empty, + "bigIntIsInt64": empty, + "bigIntGetInt64": empty, + "bigIntSetInt64": empty, + "bigIntAdd": empty, + "bigIntSub": empty, + "bigIntMul": empty, + "bigIntTDiv": empty, + "bigIntTMod": empty, + "bigIntEDiv": empty, + "bigIntEMod": empty, + "bigIntSqrt": empty, + "bigIntPow": empty, + "bigIntLog2": empty, + "bigIntAbs": empty, + "bigIntNeg": empty, + "bigIntSign": empty, + "bigIntCmp": empty, + "bigIntNot": empty, + "bigIntAnd": empty, + "bigIntOr": empty, + "bigIntXor": empty, + "bigIntShr": empty, + "bigIntShl": empty, + "bigIntFinishUnsigned": empty, + "bigIntFinishSigned": empty, + "bigIntToString": empty, + "mBufferNew": empty, + "mBufferNewFromBytes": empty, + "mBufferGetLength": empty, + "mBufferGetBytes": empty, + "mBufferGetByteSlice": empty, + "mBufferCopyByteSlice": empty, + "mBufferEq": empty, + "mBufferSetBytes": empty, + "mBufferSetByteSlice": empty, + "mBufferAppend": empty, + "mBufferAppendBytes": empty, + "mBufferToBigIntUnsigned": empty, + "mBufferToBigIntSigned": empty, + "mBufferFromBigIntUnsigned": empty, + "mBufferFromBigIntSigned": empty, + "mBufferToBigFloat": empty, + "mBufferFromBigFloat": empty, + "mBufferStorageStore": empty, + "mBufferStorageLoad": empty, + "mBufferStorageLoadFromAddress": empty, + "mBufferGetArgument": empty, + "mBufferFinish": empty, + "mBufferSetRandom": empty, + "managedMapNew": empty, + "managedMapPut": empty, + "managedMapGet": empty, + "managedMapRemove": empty, + "managedMapContains": empty, + "smallIntGetUnsignedArgument": empty, + "smallIntGetSignedArgument": empty, + "smallIntFinishUnsigned": empty, + "smallIntFinishSigned": empty, + "smallIntStorageStoreUnsigned": empty, + "smallIntStorageStoreSigned": empty, + "smallIntStorageLoadUnsigned": empty, + "smallIntStorageLoadSigned": empty, + "int64getArgument": empty, + "int64finish": empty, + "int64storageStore": empty, + "int64storageLoad": empty, + "sha256": empty, + "managedSha256": empty, + "keccak256": empty, + "managedKeccak256": empty, + "ripemd160": empty, + "managedRipemd160": empty, + "verifyBLS": empty, + "managedVerifyBLS": empty, + "verifyEd25519": empty, + "managedVerifyEd25519": empty, + "verifyCustomSecp256k1": empty, + "managedVerifyCustomSecp256k1": empty, + "verifySecp256k1": empty, + "managedVerifySecp256k1": empty, + "encodeSecp256k1DerSignature": empty, + "managedEncodeSecp256k1DerSignature": empty, + "addEC": empty, + "doubleEC": empty, + "isOnCurveEC": empty, + "scalarBaseMultEC": empty, + "managedScalarBaseMultEC": empty, + "scalarMultEC": empty, + "managedScalarMultEC": empty, + "marshalEC": empty, + "managedMarshalEC": empty, + "marshalCompressedEC": empty, + "managedMarshalCompressedEC": empty, + "unmarshalEC": empty, + "managedUnmarshalEC": empty, + "unmarshalCompressedEC": empty, + "managedUnmarshalCompressedEC": empty, + "generateKeyEC": empty, + "managedGenerateKeyEC": empty, + "createEC": empty, + "managedCreateEC": empty, + "getCurveLengthEC": empty, + "getPrivKeyByteLengthEC": empty, + "ellipticCurveGetValues": empty, + "managedVerifySecp256r1": empty, + "managedVerifyBLSSignatureShare": empty, + "managedVerifyBLSAggregatedSignature": empty, }